Der Schlüsselbefehl LOOP AT im neuen ABAP mit GROUP BY

Aus SAP-Wiki
Zur Navigation springenZur Suche springen

Siehe Neues ABAP (ab Release 7.40).

Siehe Kategorie:Neues ABAP.

Ab ABAP-Release 7.40 SP8 gibt es den Zusatz GROUP BY bei einer Schleife über einer internen Tabelle.

Vergleich zum alten Befehl "AT NEW / AT END OF ... ENDAT"

Codingbeispiel für LOOP AT GROUP BY KEY

  • Hier werden zunächst alle Flugverbindungen aus der Tabelle SFLIGHT ausgelesen.
  • Die interne Tabelle wird dann nach der Kombination von Flugzeugtyp PLANETYPE und Anzahl Sitze SEATSMAX gruppiert, bzw. verdichtet.
  • Das Ergebnis wird dann in einer WRITE-Liste und einer internen Tabelle LT_GRPDATEN ausgegeben.
  • Die interne Tabelle LT_SFLIGHT muss vorher nicht nach den Felder PLANETYPE und SEATSMAX sortiert sein und sie müssen auch nicht links in der Tabelle stehen.
DATA: lt_sflight  TYPE TABLE OF sflight.
DATA  lt_grpdaten TYPE TABLE OF sflight.

SELECT *
  FROM sflight
  INTO TABLE lt_sflight.

LOOP AT lt_sflight ASSIGNING FIELD-SYMBOL(<fs_gruppe>)
  GROUP BY ( key1 = <fs_gruppe>-planetype
             key2 = <fs_gruppe>-seatsmax ).

  append <fs_gruppe> to lt_grpdaten.
ENDLOOP.

Codingbeispiel für LOOP AT itab GROUP BY mit Iteration über Gruppe (Variante FOR .. IN GROUP ..)

  • Eine sehr mächtige Funktion ist es, wenn man über einen Gruppenwechsel einer internen Tabelle eine Iteration durchführen kann
  • Hier sind in der internen Tabelle "LT_DELIVERIES_TO_UPDATE_UB" N Lieferungen mit den jeweiligen Positionen.
  • Es erfolgt nun ein Gruppenwechsel über die Lieferungen und pro Lieferung erfolgt eine Iteration über die Positionen mit "FOR wa_gr_ub IN GROUP <wa_group_ub>".
  • Es wird letztlich eine interne Tabelle "LT_POITEM" gefüllt mit den passenden Datensätzen für einen Funktionsbaustein "BAPI_PO_CREATE1" für eine Umlagerbestellung.
LOOP AT lt_deliveries_to_update_ub ASSIGNING FIELD-SYMBOL(<wa_ub>)
 GROUP BY ( vbeln = <wa_ub>-vbeln ) ASSIGNING FIELD-SYMBOL(<wa_group_ub>). "Gruppenwechsel über Lieferung

  lt_poitem = VALUE #( FOR wa_gr_ub IN GROUP <wa_group_ub> ( po_item     = wa_gr_ub-posnr "Positionsnummer
                                                             material    = wa_gr_ub-matnr "Material
                                                             plant       = mv_zwerks      "Ziel-Werk
                                                             stge_loc    = mv_zlgort      "Ziel-Lagerort
                                                             quantity    = wa_gr_ub-lfimg "Liefermenge
                                                             SUPPL_STLOC = '1099'         "Abgebender Lagerort
                                                             SHIPTYPE    = 'DS'           "Direct Shipping
                                                                ) ).
ENDLOOP.

Codingbeispiel für LOOP AT itab GROUP BY mit Iteration über Gruppe (Variante LOOP AT GROUP)

  • Dieses Beispiel ist sehr ähnlich zum vorhergehenden Beispiel. Nur erfolgt die Iteration über "LOOP AT GROUP"
"Schleife über Lieferungen
LOOP AT lt_afpo ASSIGNING FIELD-SYMBOL(<fs_afpo_afpo>)                              
  GROUP BY ( vbeln = <fs_afpo_afpo>-vbeln ) ASSIGNING FIELD-SYMBOL(<fs_afpo_lief>).
     ...
*      Schleife über Fertigungsaufträge zu einer Lieferung
       LOOP AT GROUP <fs_afpo_lief> ASSIGNING FIELD-SYMBOL(<fs_afpo>). "(<fs_afpo_lief_line>).
         ...
       ENDLOOP.
ENDLOOP.

Tricktresor

  • Enno hat wie so oft im Tricktresor auch hier einen hervorragenden Artikel geschrieben, der die Anwendung und Vorteile des Befehls "loop at .. group by" verdeutlicht und auch zeigt, dass der Befehl "at new ..", bzw. "at end .." veraltet ist.
  • https://tricktresor.de/blog/loop-at-itab-group-by/

Web-Links

Literatur