SAP NetWeaver AS ABAP Release 751, ©Copyright 2017 SAP AG. Alle Rechte vorbehalten.
ABAP - Schlüsselwortdokumentation → ABAP - Referenz → Interne Daten verarbeiten → Interne Tabellen → Verarbeitungsanweisungen für interne Tabellen → LOOP AT itab →
LOOP AT itab - GROUP BY
Syntax
LOOP AT itab result [
cond] GROUP BY group_key
[ASCENDING|DESCENDING [AS TEXT]]
[WITHOUT MEMBERS]
[group_result].
...
[LOOP AT GROUP ...
...
ENDLOOP.]
...
ENDLOOP.
Zusätze:
1. ... ASCENDING|DESCENDING [AS TEXT]
2. ... WITHOUT MEMBERS
Wirkung
Diese Variante der Anweisung LOOP AT itab gruppiert die Zeilen der internen Tabelle und führt eine Schleife über die Gruppen aus. Für die Syntax der Zusätze result und cond gilt das Gleiche wie bei einer Schleife über Zeilen mit der Ausnahme, dass der Zusatz TRANSPORTING NO FIELDS nicht angegeben werden kann.
Mit dem Zusatz GROUP BY erfolgt die Verarbeitung der LOOP-Schleife in zwei Phasen:
Die standardmäßige Reihenfolge der Gruppen in der Gruppenschleife wie auch die Reihenfolge der Mitglieder innerhalb einer Gruppe wird durch die Verarbeitungsreihenfolge der LOOP-Schleife in der ersten Phase definiert:
Die interne Tabelle itab darf in der Gruppenschleife nicht modifiziert werden, es sei denn es ist der Zusatz WITHOUT MEMBERS angegeben.
Systemfelder
Diese Variante der Anweisung LOOP AT mit dem Zusatz GROUP BY setzt den Wert des Systemfeldes sy-tabix in der Gruppenschleife wie folgt:
Nach dem Verlassen der Schleife über ENDLOOP wird sy-tabix
auf den Wert gesetzt, den es vor dem Eintritt in die Schleife hatte. Für sy-subrc gilt das Gleiche wie bei einer
Schleife über Zeilen.
Hinweise
Beispiel
Das Beispiel zeigt die einfachste Art der Gruppierung nach einer Spalte ohne explizite Angabe des Ausgabeverhaltens der Gruppenschleife. In der Schleife besteht Zugriff auf den Arbeitsbereich wa, insbesondere auf die zum Gruppieren verwendete Komponente wa-carrid. Der Arbeitsbereich wa enthält die erste Zeile jeder Gruppe und repräsentiert die Gruppe in der Schleife. Dies wird als Repräsentantenbindung bezeichnet.
SELECT *
FROM spfli
INTO TABLE @DATA(spfli_tab).
LOOP AT spfli_tab INTO DATA(wa)
GROUP BY wa-carrid.
cl_demo_output=>write( wa-carrid ).
ENDLOOP.
cl_demo_output=>display( ).
Ausführbare Beispiele
... ASCENDING|DESCENDING [AS TEXT]
Wirkung
Diese Zusätze sortieren die Gruppen vor dem Ausführen der Gruppenschleife auf- bzw. absteigend nach dem Gruppenschlüssel. Die Sortierung erfolgt genau so wie wenn eine Anweisung SORT für eine interne Tabelle verwendet wird, deren primärer Tabellenschlüssel der Gruppenschlüssel ist und der Zusatz AS TEXT wirkt entsprechend.
Die Gruppenschleife wird in der Reihenfolge der Sortierung ausgeführt. Ohne die Zusätze ASCENDING bzw. DESCENDING liegen die Gruppen in der Reihenfolge vor, in welcher der Wert eines Gruppenschlüssels zum ersten Mal konstruiert wurde.
Hinweis
Die Sortierung von Gruppen kann als Ergänzung zur Anweisung SORT dienen, wenn die dort möglichen Sortierkriterien nicht ausreichen.
Beispiel
Wie obiges Beispiel aber mit absteigender Sortierung nach dem Gruppenschlüssel.
SELECT *
FROM spfli
INTO TABLE @DATA(spfli_tab).
LOOP AT spfli_tab INTO DATA(wa)
GROUP BY wa-carrid DESCENDING.
cl_demo_output=>write( wa-carrid ).
ENDLOOP.
cl_demo_output=>display( ).
Ausführbares Beispiel
Gruppierung mit LOOP und Sortierung.
... WITHOUT MEMBERS
Wirkung
Der Zusatz WITHOUT MEMBERS schaltet die standardmäßige interne Ausprägung der Zuordnung jeder Tabellenzeile zu ihrer Gruppe ab. Mit dem Zusatz werden zwar Gruppen gebildet, in der Gruppenschleife besteht aber kein Zugriff auf die Zeilen der Gruppen. Wenn der Zusatz WITHOUT MEMBERS angegeben ist,
Hinweis
Der Zusatz WITHOUT MEMBERS dient der Verbesserung der Performance in allen Fällen, in denen der Inhalt der Gruppen nicht benötigt wird.
Beispiel
Wie obiges Beispiel aber mit dem Zusatz WITHOUT MEMBERS, wofür mit INTO DATA(key) eine Gruppenschlüsselbindung definiert wird. In der Schleife besteht kein Zugriff auf die Zeilen der Gruppen.
SELECT *
FROM spfli
INTO TABLE @DATA(spfli_tab).
LOOP AT spfli_tab INTO DATA(wa)
GROUP BY wa-carrid WITHOUT MEMBERS
INTO DATA(key).
cl_demo_output=>write( key ).
ENDLOOP.
cl_demo_output=>display( ).