Code: Alles auswählen.
LOOP AT quelle ASSIGNING <quell_felder>.
Loop at itab INTO wa
WITH KEY comp1 = '20' OR comp1 = '21'...
....
....
endloop.
...
...
endloop.
Zu 1: Jasapjob hat geschrieben:@Dele:
Sieht gut aus, zur Sicherheit noch mal die Frage:
- Der 2. Loop schmeißt jeweils genau den Datensatz in die wa, der die Suchschlüssel-Bedingung erfüllt, oder?
- Mit welchem Befehl kann ich dann innerhalb des inneren Loops den äußeren Durchlauf abbrechen und mit dem nächsten äußeren Datensatz (von quelle) fortsetzen? Hätte ich nur den äußeren Loop, würde das ja per CONTINUE gehen.
- Habe Zweifel bzgl. der Laufzeit, da die Quelldatengröße doch erheblich ist. Was effizienteres geht aber wohl nicht oder?
Ich nehme an, dass es ausser comp1 noch weitere Suchbedingungen gibt. Sollte es in itab für die Suchschlüssel-Bedingung mehrere gültige comp1-Einträge geben, dann würde der innere Loop, den letzten Eintrag gemäß der Sortierung von itab liefern, sofern du das nicht programmtechnisch steuerst. In diesem Fall müsste geklärt werden, welcher comp1-Eintrag Verwendung finden soll. Den inneren Loop kann man dann mit "EXIT." beenden.Der 2. Loop schmeißt jeweils genau den Datensatz in die wa, der die Suchschlüssel-Bedingung erfüllt, oder?
Das geht so nicht. Du musst nach dem inneren Loop entscheiden, wie du weiter vorgehen willst. Ganz sicher ist: wenn die innere Loop-Anweisung keinen Eintrag in itab findet, dann ist SY-SUBRC = 4 - andernfalls ist SY-SUBRC = 0 und wa ist mit etwas gefüllt.- Mit welchem Befehl kann ich dann innerhalb des inneren Loops den äußeren Durchlauf abbrechen und mit dem nächsten äußeren Datensatz (von quelle) fortsetzen? Hätte ich nur den äußeren Loop, würde das ja per CONTINUE gehen.
Code: Alles auswählen.
LOOP AT quelle ASSIGNING <quell_felder>.
"==> flag löschen
Loop at itab INTO wa
WITH KEY comp1 = '20' OR comp1 = '21'...
....
"==> wenn mehrere möglich sind, dann entscheiden, ob satz gültig ist und flag setzen
....
endloop.
if sy-subrc eq 0. "es wurde ein satz gefunedn und wa ist gefüllt
if flag = true.
continue.
endif.
else.
"etwas tun
endif.
...
...
endloop.
OK, habe gerade bemerkt, dass Haubi auch bereits geantwortet hat. Die größe von ITAB ist hier entscheidender als die Größe von Quelltabelle und wie Haubi bereits gesagt hat, sollte ITAB einen Index gemäß den Suchschlüssel-Bedingungen haben, den du dann im inneren Loop auch verwenden musst. Wenn du nur prüfen willst, ob es einen passenden Eintrag in ITAB gibt, dann "transporting no fields" anstatt "into wa" verwenden.Habe Zweifel bzgl. der Laufzeit, da die Quelldatengröße doch erheblich ist. Was effizienteres geht aber wohl nicht oder?
In dem Fall finde ich es okay, weil es 1. nicht viel Code ist und zweitens dadurch einfach zu verstehen.sapjob hat geschrieben:Das Problem ist dann, dass der identische Code doppelt, also jeweils hinter dem Fall für erfolgreiches Laden von COMP1 = 20 und noch mal hinter COMP1 = 21 stehen müsste. Das ist eigentlich auch ne schlechte Lösung oder nicht?
Code: Alles auswählen.
append '20' to check_comp.
append '21' to check_comp.
" Alternativ:
select * from zcheck_comp into table check_comp.
loop at check_comp.
read table --- with key comp = check_comp.
if sy-subrc = 0.
found = x.
exit.
endif.
endloop.
Code: Alles auswählen.
READ TABLE itab into ls_itab with key comp1 = '20' {or comp1 = '21'}
Code: Alles auswählen.
lcl_helper=>read_table_with_or( EXPORTING it_itab = itab EXCEPTIONS fail = 4 ).
ich würde eine Struktur definieren:sapjob hat geschrieben: @ewx: Die erweiterbare Variante sieht super aus. Werds auf die Weise probieren. Würde die int. Tab. check_comp dann wie folgt deklariert werden müssen, wenn sie bel. viele numer.Zeichen der Länge 2 aufnehmen können soll?
DATA: check_comp TYPE TABLE OF n LENGTH 2.
Code: Alles auswählen.
types: begin of ty_struc,
comp type n length 2,
end of ty_struc.
Dann bräuchte ich aber dennoch eine itab mit Zeilenstruktur der oben definierten Struktur, um über die itab iterieren zu können, oder? Also: DATA: t_comp TYPE TABLE OF ty_struc. Korrekt?ewx hat geschrieben:ich würde eine Struktur definieren:sapjob hat geschrieben: @ewx: Die erweiterbare Variante sieht super aus. Werds auf die Weise probieren. Würde die int. Tab. check_comp dann wie folgt deklariert werden müssen, wenn sie bel. viele numer.Zeichen der Länge 2 aufnehmen können soll?
DATA: check_comp TYPE TABLE OF n LENGTH 2.Dann bist du "auf der sicheren Seite" und kannst schnell neue Felder einfügen (Sortierung, Deaktivierung, zweites Schlüsselfeld, ...)Code: Alles auswählen.
types: begin of ty_struc, comp type n length 2, end of ty_struc.
Code: Alles auswählen.
TYPES: BEGIN OF ty_s_xyz,
comp TYPE n LENGTH 2,
END OF ty_s_xyz.
DATA: t_xyz TYPE TABLE OF ty_s_xyz.
APPEND '20' TO t_xyz.
APPEND '21' TO t_xyz.
LOOP AT t_xyz INTO wa_xyz.
LOOP AT quelle ASSIGNING <quellfelder>.
READ TABLE itab WITH KEY <quellfelder>-comp = wa_xyz-comp.
if sy-subrc = 0.
found = x.
exit.
endif.
endloop.
endloop.
Code: Alles auswählen.
LOOP AT quelle ASSIGNING <quellfelder>.
READ TABLE itab INTO wa WITH KEY <quellfelder>-comp = '20'.
IF sy-subrc <> 0.
READ TABLE itab INTO wa WITH KEY <quellfelder>-comp = '21'.
IF sy-subrc <> 0.
CONTINUE.
ENDIF.
ENDIF.
found = x. //Dieser Code wird (wie beabsichtigt) ausgeführt, wenn der Datensatz <quellfelder> eine Komponente comp == '20' oder '21' hat, richtig?
ENDLOOP.
SE38sapjob hat geschrieben:Vllt. noch eine Randfrage, damit ich in Zukunft solche Basics außerhalb von großen bestehenden Codes testen kann: Wie erstelle ich schnell ein Testprogramm, dass selbständig lauffähig ist?
Danke nochmals!
@Ralf: Da du ja ein großer Fan der neuen 7.4er Syntax bist, hier für dich die "vereinfachte" Version, die mit nur einem TRY-CATCH auskommt und quasi die "OR"-Bedingung mittels Table-Expression hergibt.ralf.wenzel hat geschrieben:...
TRY.
wa = VALUE #( itab[ comp = '20' ] ).
CATCH cx_sy_itab_line_not_found.
TRY.
wa = VALUE #( itab[ comp = '21' ] ).
CATCH cx_sy_itab_line_not_found.
*** Weitere Alternativen nach gleichen Muster
*** bzw. kein Satz gefunden nach der letzten Alternative
ENDTRY.
ENDTRY.