ABAP APPEND Anweisung erklärt: Zeilen an interne Tabellen anhängen

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

Die APPEND-Anweisung wird in ABAP verwendet, um eine oder mehrere neue Zeilen immer an das physische Ende einer * internen Tabelle* anzufügen. Sie erhöht dabei die Anzahl der Zeilen in der Tabelle.

Wichtige Abgrenzung zu INSERT

  • APPEND: Fügt immer am Ende hinzu. Hauptsächlich für Standardtabellen gedacht.
  • INSERT: Kann an einer bestimmten Indexposition einfügen (bei Standardtabellen mit INDEX) oder fügt gemäß Schlüssel sortiert bzw. gehasht ein (bei Sorted/Hashed Tables mit INTO TABLE).

Syntax

Es gibt drei Hauptvarianten:

  1. Einzelne Zeile aus einem Arbeitsbereich (<wa>) anhängen:
    APPEND <wa> TO <interne_tabelle> [ASSIGNING <feldsymbol> | REFERENCE INTO <datenreferenz>].
    " Zusatz [SORTED BY <komponente>] ist obsolet und sollte nicht verwendet werden.
  2. Einzelne initiale Zeile anhängen:
    APPEND INITIAL LINE TO <interne_tabelle> [ASSIGNING <feldsymbol> | REFERENCE INTO <datenreferenz>].
  3. Mehrere Zeilen aus einer anderen Tabelle (<quelltabelle>) anhängen:
    APPEND LINES OF <quelltabelle> [FROM <index1>] [TO <index2>] TO <interne_tabelle>
    [KEEPING DUPLICATES | DELETING DUPLICATES]. " Relevant f. Sorted/Hashed

Bestandteile

  • <wa>: Ein Arbeitsbereich (Struktur), der mit dem Zeilentyp der <interne_tabelle> kompatibel sein muss. Sein Inhalt wird in die neue Zeile kopiert.
  • INITIAL LINE: Fügt eine Zeile hinzu, in der alle Komponenten ihren typspezifischen Initialwert haben (z. B. 0 für Zahlen, Leerzeichen für Typ C, leerer String für Typ STRING).
  • LINES OF <quelltabelle>: Kopiert Zeilen aus der <quelltabelle> und fügt sie am Ende der <interne_tabelle> an. Optional kann mit FROM <index1> und TO <index2> der Bereich der zu kopierenden Zeilen in der Quelltabelle eingeschränkt werden.
  • TO <interne_tabelle>: Die Zieltabelle, an die angehängt wird.
  • ASSIGNING <feldsymbol> / REFERENCE INTO <datenreferenz>: (Nur bei APPEND <wa> / INITIAL LINE) Sehr nützlich! Setzt ein Feldsymbol oder eine Datenreferenz, sodass es direkt auf die gerade angehängte Zeile zeigt. Dies erspart ein späteres READ TABLE, wenn man die neue Zeile direkt bearbeiten will.
  • KEEPING DUPLICATES / DELETING DUPLICATES: (Nur bei APPEND LINES OF) Diese Zusätze beeinflussen das Verhalten, wenn Du versuchst, Zeilen an eine sortierte oder Hash-Tabelle anzuhängen (was generell problematisch ist, siehe unten). Sie beziehen sich auf die Eindeutigkeit des Tabellenschlüssels. Für Standardtabellen haben sie keine Auswirkung auf Duplikate im Inhalt.

Funktionsweise / Verhalten nach Tabellentyp

Das Verhalten und die Zulässigkeit von APPEND hängen stark vom Typ der internen Tabelle ab:

1. Standardtabellen (STANDARD TABLE)

  • APPEND fügt die Zeile(n) immer am physischen Ende der Tabelle an. Die Reihenfolge bereits existierender Zeilen wird nicht verändert.
  • Dies ist der typische und empfohlene Anwendungsfall für APPEND.
  • Das Systemfeld sy-tabix enthält nach der Operation den Index der (letzten) angehängten Zeile. sy-subrc ist in der Regel 0.

2. Sortierte Tabellen (SORTED TABLE)

  • APPEND <wa> oder APPEND INITIAL LINE ist hier grundsätzlich verboten, da das Anhängen am Ende die garantierte Sortierreihenfolge der Tabelle verletzen würde. Ein Versuch führt zu einem Laufzeitfehler (Dump).
  • Ausnahme: APPEND LINES OF kann unter Umständen funktionieren, wenn die anzuhängenden Zeilen zufälligerweise die Sortierreihenfolge nicht verletzen oder wenn Duplikate gemäß dem Schlüssel behandelt werden (mit KEEPING/DELETING DUPLICATES). Es ist aber nicht der korrekte Weg, um Daten zu sortierten Tabellen hinzuzufügen.
  • Korrekte Anweisung für sortierte Tabellen: INSERT <wa> INTO TABLE <tabelle>.

3. Hash-Tabellen (HASHED TABLE)

  • APPEND <wa> oder APPEND INITIAL LINE ist hier strikt verboten. Die Position einer Zeile in einer Hash-Tabelle wird durch den Hash-Wert des eindeutigen Schlüssels bestimmt, nicht durch die Reihenfolge des Einfügens. Ein APPEND -Versuch führt zu einem Laufzeitfehler.
  • Ausnahme: APPEND LINES OF kann theoretisch verwendet werden, führt aber bei jeder Verletzung des eindeutigen Schlüssels zu einem Laufzeitfehler (es sei denn, die Quelle enthielt schon Duplikate und DELETING DUPLICATES wurde verwendet, was aber primär die Quelle bereinigt).
  • Korrekte Anweisung für Hash-Tabellen: INSERT <wa> INTO TABLE <tabelle>.

Systemfelder

  • sy-subrc: Bei APPEND auf Standardtabellen meist 0. Bei APPEND LINES OF auf Sorted/Hashed kann sy-subrc auf 4 gesetzt werden, wenn Duplikate gemäß den Zusätzen behandelt wurden, aber meist resultieren Schlüsselverletzungen hier in Laufzeitfehlern.
  • sy-tabix: Nach APPEND auf eine Standardtabelle enthält sy-tabix den Zeilenindex der (letzten) neu angehängten Zeile.

Beispiele (Fokus auf Standardtabellen)

TYPES: BEGIN OF ty_component,
comp_id TYPE i,
comp_text TYPE string,
END OF ty_component.
DATA: gt_components TYPE STANDARD TABLE OF ty_component WITH EMPTY KEY,
gs_component TYPE ty_component.
FIELD-SYMBOLS: <fs_component> LIKE LINE OF gt_components.
" 1. Arbeitsbereich anhängen
gs_component = VALUE #( comp_id = 10 comp_text = 'Component A' ).
APPEND gs_component TO gt_components.
gs_component = VALUE #( comp_id = 20 comp_text = 'Component B' ).
APPEND gs_component TO gt_components.
WRITE: / 'Nach APPEND <wa>: ', lines( gt_components ), 'Zeilen.'.
" 2. Initiale Zeile anhängen und direkt bearbeiten mit ASSIGNING
APPEND INITIAL LINE TO gt_components ASSIGNING <fs_component>.
IF <fs_component> IS ASSIGNED.
<fs_component>-comp_id = 30.
<fs_component>-comp_text = 'Component C (initial)'.
WRITE: / 'Letzte Zeile (ASSIGNING):', <fs_component>-comp_text.
ELSE.
WRITE: / 'Fehler bei APPEND ASSIGNING'.
ENDIF.
" 3. Zeilen aus anderer Tabelle anhängen
DATA gt_source LIKE gt_components.
APPEND VALUE #( comp_id = 40 comp_text = 'Component D' ) TO gt_source.
APPEND VALUE #( comp_id = 50 comp_text = 'Component E' ) TO gt_source.
APPEND LINES OF gt_source TO gt_components.
WRITE: / 'Nach APPEND LINES OF: ', lines( gt_components ), 'Zeilen.'.
" Ausgabe der gesamten Tabelle
cl_demo_output=>display( gt_components ).

Wichtige Hinweise / Best Practice

  • Verwende APPEND, um schnell und einfach Zeilen ans Ende von Standardtabellen anzufügen.
  • Für sortierte und Hash-Tabellen nutze INSERT ... INTO TABLE ..., um die Tabellenkonsistenz sicherzustellen und Laufzeitfehler zu vermeiden.
  • Der Zusatz ASSIGNING <feldsymbol> (oder REFERENCE INTO) bei APPEND <wa> / INITIAL LINE ist sehr performant, wenn Du die neu hinzugefügte Zeile direkt im Anschluss bearbeiten möchtest.