ON CHANGE OF - HILFE

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
13 Beiträge • Seite 1 von 1
13 Beiträge Seite 1 von 1

ON CHANGE OF - HILFE

Beitrag von Nici ( / / 0 / 3 ) »
Hallo,

in einer Tabelle habe ich ein Feld 'KZ'.

Der Aufbau der Tabelle sieht so aus:

kundennummer ort kz ...
--------------------------------------------
4711 berlin ft ...
4712 berlin ft ...
4713 berlin st ...
4714 berlin st ...
4715 berlin lt ...
4716 berlin lt ...

Alle Einträge mit dem gleichen KZ möchte ich nun verarbeiten.
Die KZ sind frei vergebbar, deshalb kann ich nicht - if kz = xx - abfragen. Jedoch ist es so, dass in der Tabelle alle Einträge mit den gleichen KZ in einer "Gruppe" stehen, also untereinander erscheinen.

Nun bin ich auf die Idee mit ON CHANGE ON gekommen.

ON CHANGE ON kz.
_verarbeitung_
ENDON.

In der Hilfe steht, dass die Verarbeitung nur dann statt findet, wenn sich der Feldinhalt ändert.
Das bringt mich ja nicht wirklich weiter, weil ich ja auch die erste 'Gruppe' abarbeiten muss.

Welche Alternative habe ich zu ON CHANGE OF?
Bzw. wie werden alle Gruppen in meiner Tabelle verarbeitet?

Würde es mit AT NEW kz klappen?

Danke, Nici

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von rolle (ForumUser / 8 / 0 / 0 ) »
hi nici,

definier dir doch einfachne hilfsvariable und bau eine if-abfrage mit rein....
grueße, joerg

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Nici,

eine Änderung des Inhaltes von KZ von 'leer' auf Wert ist bereits eine Änderung, die ONCHANGE auslösen würde.
Wirklich empfohlen wird die Verwendung dieses Konstruktes aber nicht mehr, da es ein etwas unübersichtlicher Befehl ist. Siehe dazu auch die Hilfe.

Die Verwendung von AT würde in Deinem Beispiel nicht funktionieren, da AT immer dann ausgelöst wird, wenn sich eines der Felder links des zu prüfenden Felder (also Kundennummer und Ort), sowie natürlcih das Feld selbst ändert.
Das heißt, dass in Deinem Beispiel AT nach jedem Satz ausgelöst wird, weil sich die Kundennummer ändert.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Nici ( / / 0 / 3 ) »
At und on change of fällt also schon mal weg.

@Jörg: Das mit der Hilfsvariable verstehe ich jetzt grad nicht. :(

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Jörg's Tipp soll heißen, dass Du selbst eine Steuervariable verwaltest, die Deinen Gruppenwechsel steurt.

Code: Alles auswählen.

LOOP at itab.
  IF hilf_kz NE itab-kz.
* führe Gruppenwechsel durch
    hilf_kz = itab-kz.
  ENDIF.
ENDLOOP.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Nici ( / / 0 / 3 ) »
Ach so!
Ich speichere also das KZ in eine Hilfsvariable verarbeite alles in einem LOOP.
Hm, gute Idee! :D

Sag mal ereglam, seit wieviel tausend Jahren programmierst du denn schon??? :wink:
Dein Name taucht ja fast überall hier im Forum auf und immer hast du eine Lösung parat.
Wie machst du das nur? :?: :!:

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
nana, soooo alt bin ich nun auch wieder nicht... ;)
Obwohl, am Hof von Cleopatra waren die Abacus ein wenig lahm... :D

Warum ich 'immer' so viel weiß. Keine Ahnung. Hat sich alles irgendwie so ergeben...
Dabei hab ich grad' mal ca. 8 Jahre Erfahrung mit ABAP.

PS:
ob ich viel weiß oder nicht, sagt uns gleich das Licht ...
und ein Glühwürmchen flog vorbei... ;)
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Nici ( / / 0 / 3 ) »
Acht Jahre ist ja auch schon relativ lange.
Mir persönlich fällt alles recht schwer und ich brauche auch immer länger als andere. :(
Aber ich versuch mein Bestes zu geben.

Ähm, ich möchte nochmal auf mein Problem zurück kommen:
Wenn ich das mit dem Hilfsfeld mache, dann kann ich die Verarbeitung ja nur einmal durchführen, weil im nächsten Durchlauf das Hilfsfeld ja den Wert von KZ hat, oder?
Dabei will ich für alle Einträge mit dem gleichen KZ die Verarbeitung machen (diverse Prüfungen etc.)

Also, alle Einträge mit dem gleichen KZ will ich prüfen, wenn KZ ein anderer Eintrag hat, dann will ich wieder mit allen Einträgen mit dem jetzt-gleichen KZ prüfen usw.
Oh Gott, was für ein Satz. Weist du wo mein Problem liegt?

on change of Nachteil ??

Beitrag von meinrad (ForumUser / 67 / 0 / 0 ) »
Hallo,
Ich kann keinen Nachteil erkennen, wenn man hier bei einem handgestrickten einfachen Gruppenwechsel statt eines IFs den Befehl "ON CHANGE OF" verwendet. Der erste Eintrag wird verarbeitet, wenn vor dem LOOP die Feldleiste leer ist.

Einziger Vorteil: Falls die Routine/Schleife mehrmals durchlaufen wird, kann man das Hilfsfeld initialisieren, was beim ON CHANGE OF nicht geht.

Mit AT NEW könnte man arbeiten, wenn das KZ am Anfang der Feldleiste stände. Aber Achtung: die weiter "rechts stehenden " Characterfelder sind mit *** gefüllt.

Für Komplexe Gruppenwechsel mit Gruppier-Strukturen (mehrstufiger Gruppenwechsel ; Gruppenwechsel über mehrere Imterne Tabellen/Mischlogik), die nicht der Stufenlogik des ABAP: AT NEW - AT END
entsprechen, weil man die Feld-Reihenfolge in den Internen Tabellen nicht umbauen will/kann oder weil man keine zweite Tabelle aufbauen will, sollte man dan mit IF arbeiten und mit zwei Hilfsstrukturen NEU und ALT.

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
dann probier es mal mit folgendem Coding:

Code: Alles auswählen.

LOOP AT itab. 
* prüfe Gruppenwechsel 
  IF hilf_kz NE itab-kz. 
* Hilfsvariable setzen
    hilf_kz = itab-kz. 
  ELSE. 
* führe Tätigkeiten durch, die für alle (nachfoglenden) Einträge mit gleicher KZ gelten
  ENDIF. 
ENDLOOP.
@meinrad
in der Hilfe von ON CHANGE OF wird darauf hingewiesen, dass es bei Absprüngen in Unterprogrammen zu Problemen kommen kann.
Daraus schließe ich implizit, dass der Befehl besser nicht eingesetzt werden sollte, zumal er im ABAP-OO-Umfeld schlichtweg verboten ist.
Ansonsten gebe ich Dir mit Deinem Ausführungen recht, da sie sich auch mit meinen Ausführungen decken.

Danke auch, dass Du auf die besondere Problematik bei AT bzgl. rechtsstehender Felder im AT-Block hinweisst.
Hier gibt es aber den Trick, den LOOP AT tab ASSIGNING <f> zu benutzen. In diesem Fall kommt es im Feldsymbol nicht zu der 'Versternung'. (habe ich schon mehrfach benutzt ;))
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Nici ( / / 0 / 3 ) »
@Ereglam

Hm, ich hab nochmal ne Frage...

Ich hab noch weitere zwei Felder in meiner Tabelle, die ich prüfen muss.
Datum -> wenn sich das Datum innerhalb von KZ ändert: Fehler ansonsten weiter machen.
Preis -> wenn sich Preis innerhalb von KZ ändert: Fehler ansonsten weiter machen.

Dies hatte ich ja für KZ:

Loop at i_tab into wa_tab.
if hilf_kz ne wa_tab-kz.
hilf_kz = wa_tab-kz.
...
else.
...
endif.
Endloop.

Nun dachte ich, ich kann das mit dem Datum und dem Preis ähnlich aufbauen, aber das war ein Satz mit X.

Sobald das Datum und der Preis ungleich ist, muss ich eine Fehlermeldung bringen (= Eintrag in eine (interne) Fehlertabelle).

Wenn ich so vorgehe wie bei KZ, ist es ja gleich ungleich und wenn ich mein Preis-Hilfsfeld gleich zu Beginn fülle ist es immer gleich.

Wie kann ich denn feststellen, ob sich in den beiden Feldern der Wert ändert?
Innerhalb von KZ muss der Preis und das Datum für jeden Eintrag gleich sein...

Hm, wobei... :idea:
Lass mich mal denken.
- ich loope über i_tab.
wenn ich dann abfrage, ob hilf_preis ungleich wa_itab-preis ist, trifft es zu - dann übergebe ich hilf-preis den wert von wa_itab-preis. Gut.
Dann müsste ich doch wieder zum Loop über i_tab kommen, oder?
wa_tab-datum bekommt den 'neuen' Wert und wenn der ungleich ist, dann gibt es eine Fehlermeldung...

Könnte das so klappen?

Um es mal technisch auszudrücken:


Loop at i_tab into wa_tab.

if hilf_kz ne wa_tab-kz.
hilf_kz = wa_tab-kz.

if hilf_preis ne wa_tab-preis.
flag = 'X'.
hilf-preis = wa_tab-preis.

if flag = 'X'.
fehlermeldung.
endif.

endif.

if hilf_datum ne wa_tab-datum
flag1 = 'X'.
hilf-datum = wa_tab-datum.

if flag1 = 'X'.
fehlermeldung.
endif.

endif.
endif.

else.

* Das gleiche müsste dann auch hier passieren:

if hilf_preis ne wa_tab-preis.
flag = 'X'.
hilf-preis = wa_tab-preis.

if flag = 'X'.
fehlermeldung.
endif.

endif.

if hilf_datum ne wa_tab-datum
flag1 = 'X'.
hilf-datum = wa_tab-datum.

if flag1 = 'X'.
fehlermeldung.
endif.

endif.

clear flag.
clear flag1.
* Stimmt das clear hier an dieser Stelle?
Endloop.

Ereglam, was meinst du? Kann das so stimmen?
Bzw. kannst du mir folgen?!

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hi Nici,

ja, ich kann Dir folgen. ;)
Probier es mal mit folgendem Coding:

Code: Alles auswählen.

LOOP AT i_tab INTO wa_tab.

  IF hilf_kz NE wa_tab-kz.
    hilf_kz = wa_tab-kz.

* einfach nur merken
    hilf-preis = wa_tab-preis.
    hilf-datum = wa_tab-datum.

  ELSE.

* hier jetzt prüfen, ob unterschiedlich
    IF hilf_preis NE wa_tab-preis.
*      fehlermeldung.
    ENDIF.

* dito für's Datum
    IF hilf_datum NE wa_tab-datum.
*      fehlermeldung.
    ENDIF.
  ENDIF.
ENDLOOP.
PS:
benutz doch bitte den Code-Block '['code']' bzw. '['/code']' oder aber im Editor den Pushbutton 'Code' für Codingabschnitte. Damit erleichterst Du den Anderen das Lesen.
Zuletzt geändert von ereglam am 31.05.2005 16:12, insgesamt 1-mal geändert.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Nici ( / / 0 / 3 ) »
Ich bin echt eine typische Blondine. :cry:
Flag sollte natürlich nach dem If-Flag stehen, sonst ist die das ja auch immer true.

if hilf_preis ne wa_tab-preis.
hilf-preis = wa_tab-preis.
if flag = 'X'.
fehlermeldung.
endif.
flag = 'X'.
endif.

Seite 1 von 1

Vergleichbare Themen

1
Antw.
7294
Views
CLFMAS: Change Pointer - Combining one or more Change Pointers in Single IDOC
von ABAPLover » 21.08.2024 22:41 • Verfasst in ABAP® Core
0
Antw.
4603
Views
4
Antw.
3761
Views
Change DIS
von Icke0801 » 05.04.2017 16:12 • Verfasst in ABAP® Core
1
Antw.
3311
Views
Password change via RFC
von Daniela » 06.02.2006 10:55 • Verfasst in ABAP® Core
2
Antw.
5172
Views
IW 38 - Change Layout
von xhuljano » 18.02.2015 16:12 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 8 Stunden von DeathAndPain gelöst 22 / 2954
Daten an Tabelle binden
vor 13 Stunden von Lukas Sanders 2 / 946
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 506

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Dialog-Container mit Toolbar/Status
vor 8 Stunden von DeathAndPain gelöst 22 / 2954
Daten an Tabelle binden
vor 13 Stunden von Lukas Sanders 2 / 946
Zeilenumbrüche ersetzen
vor 2 Tagen von ralf.wenzel 6 / 506

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2524
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9103