ABAP-Schlüsselbefehle AT NEW, AT END OF, AT FIRST, AT LAST

Aus SAP-Wiki
Zur Navigation springenZur Suche springen
  • Der Befehl "AT NEW <felder> .. ENDAT", bzw. "AT END OF <feld> .. ENDAT" ist schon sehr alt und wid recht selten eingesetzt, aber kann bei richtiger Verwendung sehr nützlich sein und dem Entwickler das Leben vereinfachen.

Voraussetzung Anwendung AT NEW und AT END OF

  • Nach den abgefragten Felder muss die interne Tabelle sortiert sein und die abgefragten Felder müssen die ersten Felder der internen Tabelle sein.
  • Diese Voraussetzungen sind oft nur dann erfüllt, wenn man Daten aus einer internen Tabelle in eine passende Tabelle ummappt und umsortiert.

Projektbeispiel AT NEW und AT END OF

  • In einem Projektbeispiel hatte ich eine sehr schöne Anwendung für die Befehl "AT NEW <feldname" und "AT END OF <feldname>".
  • Es gab eine interne Tabelle mit den führenden Feldern Faktura (VBELN) und Positionsnummer (POSNR), wo die Positionsnummer auch mehrfach in der internen Tabelle auftreten konnte. Es musste bei jedem Datensatz innerhalb der Gruppe (gleiche Faktura und gleiche Fakturaposition) die Einkaufsorg. geprüft werden. Datensätze mit Einkaufsorg. <> 0001 konnten gelöscht werden, es sei denn alle Datensätze innerhalb der Gruppe hatten Einkaufsorg. <> 0001. Dann durfte der letzte Datensatz der Gruppe nicht gelöscht werden. Dann wurden nur bestimmte Felder gecleart. Aufgrund dieser komplexen Logik konnte hier der Schlüsselbefehl Delete Adjacent Duplicates nicht verwendet werden.
  • Es wurde nun so realisiert, dass beim Gruppenwechsel "AT NEW posnr" (neue Faktura oder neue Fakturaposition) die Variablen LV_COUNTER und LV_LAST gecleart wurden. Jeder Datensatz innerhalb der Gruppe (mit gleicher Faktura und Fakturaposition) erhöht die Variable LV_COUNTER um 1, sofern eine Einkaufsorg. 0001 auftrat. Beim Gruppenwechsel "AT END OF posnr" wird das Ende der Gruppe bestimmt und eine Variable "LV_LAST = 'X'" gesetzt.
  • Da hier die Reihenfolge 1. VBELN und 2. POSNR in der internen Tabelle war, gibt man das Feld POSNR an bei der Gruppenwechselabfrage. Dabei wird implizit auch der Wechsel vom Feld VBELN berücksichtigt, welches links vom Feld POSNR in der internen Tabelle ist.
Types: begin of ty_itab,
       vbeln type vbrp-vbeln,
       posnr type vbrp-posnr,
       ...
       end of ty_itab.
        
Data: lt_itab type standard table of ty_itab.

Data: lv_counter type i,
      lv_last    type xfeld.

 ...  "lt_itab wird gefüllt
 
loop at lt_itab assigning field-symbol(<fs_itab>).
  at new posnr. "hier wird auch der Wechsel der VBELN berücksichtigt
    clear: lv_counter, lv_last.
  endat.

  if <fs_itab>-ekorg = '0001'.
    add 1 to lv_counter.
  endif.
  
  at end of posnr.
    lv_last = abap_true.
  endat.
  
  if <fs_itab>-ekorg = '0001'.
    if lv_counter > 0 or lv_last = abap_false
      delete lt_itab.
    else.
      clear: <fs_itab>-ekorg,
             ...
    endif.
  endif.
endloop.
  • Führt man die erweiterte Syntaxprüfung aus, so erfolgt eine Warnung über die Kombination vom Gruppenwechsel "AT NEW ..", "AT END OF .." und "DELETE <itab>", aber das Coding hat wie erwartet funktioniert.

Alternative: Der Schlüsselbefehl LOOP AT mit GROUP BY

Schlüsselbefehle AT FIRST und AT LAST

  • Der Schlüsselbefehl AT FIRST wird beim ersten Datensatz der internen Tabelle ausgelöst. Daher kann auch kein Feld angegeben werden.
  • Wenn der Loop durch Bedingungen eingeschränkt und der erste Datensatz der internen Tabelle wird nicht durchlaufen, dann wird auch das Ereignis AT NEW nicht ausgelöst.
 loop at lt_itab> ..
   at new.
    ...
   endat.
 endloop.
  • Alternativ könnte man hier auch schreiben
 loop at lt_itab> ..
   if sy-tabix = 1.
    ...
   endif.
 endloop.
  • Der Schlüsselbefehl AT LAST wird beim letzten Datensatz der internen Tabelle ausgelöst. Daher wird auch hier wie bei AT FIRST kein Feld angegeben.
  • Wenn der Loop durch Bedingungen eingeschränkt und der letzte Datensatz der internen Tabelle wird nicht durchlaufen, dann wird auch das Ereignis AT END nicht ausgelöst.
 loop at lt_itab> ..
   at last.
    ...
   endat.
 endloop.

Web-Links