ABAP - Schlüsselwortdokumentation →  ABAP - Referenz →  Interne Daten verarbeiten →  Interne Tabellen →  Verarbeitungsanweisungen für interne Tabellen →  LOOP AT itab →  LOOP AT itab - Grundform → 

AT - Gruppenstufenverarbeitung

Kurzreferenz

Syntax

LOOP AT itab result [cond].
  [AT FIRST.
     ...
   ENDAT.]
    [AT NEW comp1.
       ...
     ENDAT.
       [AT NEW comp2.
         ...
       ENDAT.
         [...]]]
           [ ... ]
       [[[...]
       AT END OF comp2.
         ...
       ENDAT.]
     AT END OF comp1.
       ...
     ENDAT.]
  [AT LAST.
     ...
  ENDAT.]
ENDLOOP.

Zusätze:

1. ...  FIRST

2. ... {NEW}|{END OF} compi

3. ...  LAST

Wirkung

Der Anweisungsblock einer LOOP-Schleife ohne den Zusatz GROUP BY kann Kontrollstrukturen für eine Gruppenstufenverarbeitung enthalten. Die entsprechende Kontrollanweisung ist AT. Die Anweisungen AT und ENDAT definieren Anweisungsblöcke, die bei Gruppenwechseln, d.h. beim Übergang einer Gruppenstufe zu einer anderen Gruppenstufe ausgeführt werden. Die Zusätze der Anweisungen AT definieren die Kriterien für einen Gruppenwechsel und damit die Gruppenstufen. Gruppenwechsel zwischen Gruppenstufen ergeben sich aus der Zeilenstruktur und der Verarbeitungsreihenfolge, in der die LOOP-Schleife die Zeilen der internen Tabelle einliest. Innerhalb der Anweisungsblöcke kann die Anweisung SUM angegeben werden, um numerische Komponenten einer Gruppenstufe zu summieren.

Abgesehen von den speziellen Varianten AT FIRST und AT LAST werden Gruppenstufen mit den Varianten AT NEW und AT END OF durch die gemäß der Verarbeitungsreihenfolge der Schleife aufeinanderfolgenden Zeilen der internen Tabelle definiert, die in einem durch ein Anfangsstück der Zeilen definierten Gruppenschlüssel den gleichen Inhalt haben. Dabei werden alle Zeilen der internen Tabelle ohne Auswertung einschränkender Bedingungen cond berücksichtigt.

Obwohl es syntaktisch möglich ist, AT-Kontrollstrukturen beliebig anzuordnen und auch zu schachteln, wird eine sinnvolle Gruppenstufenverarbeitung in aller Regel nur durch die oben gezeigte Anordnung gezeigt, bei der die Kontrollstrukturen entsprechend der Anordnung der Komponenten im Gruppenschlüssel hintereinander und nicht geschachtelt aufgeführt sind.

Die Anweisungsblöcke innerhalb der AT-ENDAT-Kontrollstrukturen werden ausgeführt, wenn bei der aktuellen Tabellenzeile ein entsprechender Gruppenwechsel stattfindet. Anweisungen der LOOP-ENDLOOP-Kontrollstruktur, die nicht innerhalb einer AT-ENDAT-Kontrollstruktur aufgeführt sind, werden bei jedem Schleifendurchgang ausgeführt. Wenn eine Tabellenzeile, bei der ein Gruppenwechsel stattfindet, wegen einer einschränkenden Bedingung cond nicht gelesen wird, wird der entsprechende Anweisungsblock nicht ausgeführt.

Damit eine sinnvolle Gruppenstufenverarbeitung erfolgt, sind folgende Regeln zu beachten:

Wenn in der Anweisung LOOP der Zusatz INTO wa verwendet wird, wird der Inhalt von wa bei Eintritt in die AT- ENDAT-Kontrollstruktur in Abhängigkeit von der jeweiligen Gruppenstufe überschrieben und beim Verlassen der Kontrollstruktur wieder auf den Inhalt der aktuellen Zeile zurückgesetzt. Bei Verwendung der Zusätze ASSIGNING und REFERENCE INTO werden die referierten Tabellenzeilen bei Eintritt und Verlassen der AT-ENDAT-Kontrollstruktur nicht geändert.

Hinweise

Ausführbare Beispiele

Gruppenstufenverarbeitung

Zusatz 1

... FIRST

Wirkung

Die Gruppenstufe wird durch die erste Zeile der internen Tabelle definiert. Der Gruppenwechsel findet beim Auslesen dieser Zeile statt. In der Gruppenstufe AT FIRST enthält der aktuelle Gruppenschlüssel keine Komponenten.

Wenn in der Anweisung LOOP der Zusatz INTO wa verwendet wird, werden beim Eintritt in die Kontrollstruktur AT FIRST alle zeichenartigen Komponenten des Arbeitsbereichs wa mit "*" gefüllt und alle übrigen Komponenten auf ihren Initialwert gesetzt. Bei einem elementaren Zeilentyp gilt dies für den gesamten Arbeitsbereich. Beim Verlassen der AT- ENDAT-Kontrollstruktur wird dem Arbeitsbereich wa wieder der Inhalt der aktuellen Tabellenzeile zugewiesen.

Hinweis

Wenn die erste Zeile der internen Tabelle wegen einer einschränkenden Bedingung cond nicht gelesen wird, wird der Anweisungsblock der Kontrollstruktur AT FIRST nicht ausgeführt.

Beispiel

Ausgabe einer Überschrift und der ersten Zeile einer internen Tabelle bei der Gruppenstufe AT FIRST.

DATA itab TYPE SORTED TABLE OF scarr
               WITH UNIQUE KEY carrid.

SELECT *
       FROM scarr
       INTO TABLE itab.

DATA(out) = cl_demo_output=>new( ).
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  AT FIRST.
    out->next_section( 'First' ).
    out->write( <fs> ).
  ENDAT.
ENDLOOP.
out->display( ).

Zusatz 2

... {NEW}|{END OF} compi

Wirkung

Gruppenstufen werden durch Anfang bzw. Ende einer Gruppe von Zeilen mit dem gleichen Inhalt in der Komponenten compi (mit i = 1, 2, ...) und in den Komponenten links von compi definiert. Der Inhalt dieser Komponenten bestimmt den Gruppenschlüssel. Die Gruppenwechsel finden statt, wenn sich der Inhalt der Komponente compi oder einer Komponente links von compi ändert.

Die Komponenten compi können wie im Abschnitt Angabe von Komponenten beschrieben angegeben werden, mit der Einschränkung, dass ein Zugriff auf Datenobjekte über Referenzen hier nicht möglich ist. Nicht möglich sind also

Ansonsten können die angegebenen Komponenten einen beliebigen Datentyp haben. Für die Auswertung gelten die entsprechenden Vergleichsregeln. Bei einem elementaren Zeilentyp kann als Gruppenschlüssel nur table_line angegeben werden.

Wenn in der Anweisung LOOP der Zusatz INTO wa verwendet wird, wird der Inhalt von wa bei Eintritt in die AT-ENDAT-Kontrollstruktur wie folgt geändert:

Bei einem elementaren Zeilentyp entspricht der gesamte Arbeitsbereich dem aktuellen Gruppenschlüssel und bleibt unverändert. Beim Verlassen der AT-ENDAT-Kontrollstruktur wird dem Arbeitsbereich wa wieder der Inhalt der aktuellen Tabellenzeile zugewiesen.

Hinweise

Beispiel

Ausgabe der Spalte carrid als Überschrift für den verketteten Inhalt der zugehörigen Flugnummern.

DATA itab TYPE SORTED TABLE OF spfli
               WITH UNIQUE KEY carrid connid.

SELECT *
       FROM spfli
       INTO TABLE itab.

DATA connids TYPE string.
DATA(out) = cl_demo_output=>new( ).
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  AT NEW carrid.
    out->next_section( <fs>-carrid ).
  ENDAT.
  connids = connids && ` ` && <fs>-connid.
  AT END OF carrid.
    out->write( connids ).
    CLEAR connids.
  ENDAT.
ENDLOOP.
out->display( ).

Beispiel

Da die erste Zeile der ersten Zeilengruppe wegen des Zusatzes FROM 2 nicht gelesen wird, wird der zugehörige Anweisungsblock hinter AT NEW table_line nicht ausgeführt. Das Programm führt deshalb zu einer Meldung von der erweiterten Programmprüfung.

DATA itab TYPE TABLE OF string WITH EMPTY KEY.

itab = VALUE #( ( `AA` ) ( `AA` ) ( `AA` )
                ( `BB` ) ( `BB` ) ( `BB` ) ).

DATA(out) = cl_demo_output=>new( ).
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>) FROM 2.
  AT NEW table_line.
    out->write( <fs> ).
  ENDAT.
ENDLOOP.
out->display( ).

Zusatz 3

... LAST

Wirkung

Die Gruppenstufe wird durch die letzte Zeile der internen Tabelle definiert. Der Gruppenwechsel findet beim Auslesen dieser Zeile statt. In der Gruppenstufe AT LAST enthält der aktuelle Gruppenschlüssel keine Komponenten.

Wenn in der Anweisung LOOP der Zusatz INTO wa verwendet wird, werden beim Eintritt in die Kontrollstruktur AT LAST alle zeichenartigen Komponenten des Arbeitsbereichs wa mit "*" gefüllt und alle übrigen Komponenten auf ihren Initialwert gesetzt. Bei einem elementaren Zeilentyp gilt dies für den gesamten Arbeitsbereich. Beim Verlassen der AT- ENDAT-Kontrollstruktur wird dem Arbeitsbereich wa wieder der Inhalt der aktuellen Tabellenzeile zugewiesen.

Hinweis

Wenn die letzte Zeile der internen Tabelle wegen einer einschränkenden Bedingung cond nicht gelesen wird, wird der Anweisungsblock der Kontrollstruktur AT LAST nicht ausgeführt.

Beispiel

Ausgabe von kumuliertem Inhalt während der Verarbeitung der letzten Zeile.

DATA itab TYPE SORTED TABLE OF scarr
               WITH UNIQUE KEY carrid.

SELECT *
       FROM scarr
       INTO TABLE itab.

DATA carrids TYPE string.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  carrids = carrids && ` ` && <fs>-carrid.
  AT LAST.
    cl_demo_output=>display( carrids ).
  ENDAT.
ENDLOOP.

Ausnahmen

Unbehandelbare Ausnahmen



Weiterlesen
SUM
ENDAT
Beispiele zur Gruppenstufenverarbeitung