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

LOOP AT GROUP

Kurzreferenz

Syntax

LOOP AT GROUP group result [ WHERE log_exp] [GROUP BY ...].
  ...
ENDLOOP.

Zusatz:

... WHERE log_exp

Wirkung

Mitgliederschleife über die Zeilen einer Gruppe innerhalb der Gruppenschleife bei der Gruppierung interner Tabellen. Diese Schleife ist nur innerhalb einer LOOP-Schleife über eine interne Tabelle mit dem Zusatz GROUP BY möglich,

Mit group wird die Gruppe angegeben, über welche die Mitgliederschleife ausgeführt werden soll. Es muss das im Ausgabeverhalten group_result der Gruppenschleife definierte Zielobjekt angegeben werden, das an die Gruppe gebunden ist:

Die Mitgliederschleife über die aktuelle Gruppe wird genau so ausgeführt, wie eine normale LOOP-Schleife über eine Standardtabelle mit dem Zeilentyp von itab, welche die Zeilen der Gruppe enthält. Es sind beide Varianten möglich:

Der zweite Punkt ermöglicht die weitere Gruppierung vorhandener Gruppen.

Systemfelder

Die Anweisung LOOP AT GROUP setzt den Wert des Systemfeldes sy-tabix in der Mitgliederschleife auf den Wert, der für die aktuelle Zeile in der LOOP-Schleife ohne Gruppierung gesetzt würde.

Für sy-subrc gilt das Gleiche wie bei LOOP AT itab.

Hinweise

Beispiel

Mitgliederschleife in einer Gruppenschleife. Dort werden die zu einer Fluggesellschaft gehörigen Flugnummern in einem String zusammengefasst.

SELECT *
       FROM spfli
       INTO TABLE @DATA(spfli_tab).

LOOP AT spfli_tab INTO DATA(wa)
                  GROUP BY wa-carrid
                  INTO DATA(key).
  cl_demo_output=>next_section( |{ key }| ).
  DATA(str) = ``.
  LOOP AT GROUP key ASSIGNING FIELD-SYMBOL(<members>).
    str = str && ` ` && <members>-connid.
  ENDLOOP.
  cl_demo_output=>write( str ).
ENDLOOP.
cl_demo_output=>display( ).

Beispiel

Das folgende Beispiel führt die sechs verschiedenen syntaktischen Möglichkeiten, eine Gruppe in einer Mitgliederschleife anzugeben, einzeln auf:

TYPES itab TYPE STANDARD TABLE OF i WITH EMPTY KEY.

DATA(itab) = VALUE itab( ( 1 ) ( 1 ) ( 2 ) ( 2 ) ).

LOOP AT itab INTO DATA(wa) GROUP BY wa.
  LOOP AT GROUP wa INTO DATA(member).
    ...
  ENDLOOP.
ENDLOOP.

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>) GROUP BY <fs>.
  LOOP AT GROUP <fs> INTO member.
    ...
  ENDLOOP.
ENDLOOP.

LOOP AT itab REFERENCE INTO DATA(dref) GROUP BY dref->*.
  LOOP AT GROUP dref INTO member.
    ...
  ENDLOOP.
ENDLOOP.

LOOP AT itab INTO wa GROUP BY wa
             INTO DATA(group).
  LOOP AT GROUP group INTO member.
    ...
  ENDLOOP.
ENDLOOP.

LOOP AT itab INTO wa GROUP BY wa
             ASSIGNING FIELD-SYMBOL(<group>).
  LOOP AT GROUP <group> INTO member.
    ...
  ENDLOOP.
ENDLOOP.

LOOP AT itab INTO wa GROUP BY wa
             REFERENCE INTO DATA(group_ref).
  LOOP AT GROUP group_ref INTO member.
    ...
  ENDLOOP.
ENDLOOP.

Zusatz

... WHERE log_exp

Wirkung

Die aus der Gruppe ausgelesenen Zeilen können mit einer statischen WHERE-Bedingung eingeschränkt werden. Syntax und Bedeutung sind wie bei einer LOOP-Schleife über eine interne Tabelle mit dem Zeilentyp von itab.

Hinweis

Die Zusätze USING KEY, FROM, TO und eine dynamische WHERE-Bedingung sind hinter LOOP AT GROUP nicht möglich.

Beispiel

Wie obiges Beispiel, aber mit einschränkender WHERE-Bedingung für die Mitgliederschleife.

SELECT *
       FROM spfli
       INTO TABLE @DATA(spfli_tab).

LOOP AT spfli_tab INTO DATA(wa)
                  GROUP BY wa-carrid
                  INTO DATA(key).
  cl_demo_output=>next_section( |{ key }| ).
  DATA(str) = ``.
  LOOP AT GROUP key ASSIGNING FIELD-SYMBOL(<members>)
                    WHERE cityfrom = 'NEW YORK'.
    str = str && ` ` && <members>-connid.
  ENDLOOP.
  cl_demo_output=>write( str ).
ENDLOOP.
cl_demo_output=>display( ).