Verschachelte Loops vermeiden

Im Rahmen einer Anpassung eines bestehenden Programms stand ich vor folgender Herausforderung: Ich habe eine interne Tabelle mit allen Positionen, für die ich einen Wareneingang buchen möchte. Doch die Positionen können unterschiedliche externe Lieferscheinnummern enthalten. Nun sollen die Wareneingänge je Lieferscheinnummer gebucht werden (weil das ein Kopffeld ist und sonst die Rechnungsprüfung durcheinander kommt). Mein erster Gedanke wären nun gewesen, mir eine Hilfstabelle mit allen externen Lieferscheinnummern aufzubauen ). Dann könnte ich über die Hilfstabelle loopen und in dem Loop würde ich dann über alle Positionen loopen mit der entsprechenden WHERE-Bedingung, damit ich im zweiten Loop nur die Positionen mit der aktuellen externen Lieferscheinnummer durchlaufe. Dies erschien mir doch irgendwie kompliziert und in mir sträubte sich alles gegen die verschachtelte Loops . Also habe ich etwas recherchiert und Dank eines Tipps eines versierten Entwicklers wurde ich darauf aufmerksam gemacht, dass es mit ABAP 7.40 neue Funktionalitäten gibt. Unter anderem eine GROUP-Funktion innerhalb interner Tabelle. Und in der Tat erfüllte der neue ABAP-Befehl LOOP AT GROUP genau meine Anforderung. Anbei mal ein vereinfachtes Beispiel: Es sollen die Kundenstämme eines bestimmten Landes selektiert und nach dem Ort sortiert verarbeitet werden (in diesem Falle ist es eine simple Ausgabe der Datensätze). Das entsprechende Coding sieht wie folgt aus:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DATA lt_kna1 TYPE TABLE OF kna1. 
DATA lt_ort LIKE lt_kna1.   
 
PARAMETER p_land1 TYPE land1.   
 
SELECT * FROM kna1 UP TO 100 ROWS INTO TABLE lt_kna1 
         WHERE land1 EQ p_land1.   
LOOP AT lt_kna1 INTO DATA(ls_kna1) GROUP BY ( ort01 = ls_kna1-ort01 ) 
                                   ASCENDING 
                                   ASSIGNING FIELD-SYMBOL(). 
 CLEAR lt_ort. 
 LOOP AT GROUP  ASSIGNING FIELD-SYMBOL(). 
   lt_ort = VALUE #( BASE lt_ort (   ) ). 
 ENDLOOP. 
 cl_demo_output=>write( lt_ort ). 
ENDLOOP. 
cl_demo_output=>display( ).

Zunächst könnte man meinen, dass es doch nur zwei geschachtelte Loops sind – aber ganz so einfach ist es nicht. Das erste LOOP-Statement wird auf die gesamte Tabelle lt_kna1 angewandt und über die Anweisung GROUP BY werden die Tabellenzeilen entsprechend der Gruppierungskriterien sortiert (im Beispiel nach dem Ort). Wichtig hierbei ist, dass zu diesem Zeitpunkt der Body des Loops noch nicht ausgewertet wurde. Das passiert nach der Sortierung – und dann wird der zweite (und vermeintlich verschachtelte) Loop durchlaufen. Durch den Verweis auf den Gruppierungsschlüssel <group>, der im ersten Loop zugeordnet wurde, arbeitet der zweite Loop nun die Tabelle lt_kna1 Block für Block ab.

Be the first to comment

Teil mir was mit