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 mitINDEX
) oder fügt gemäß Schlüssel sortiert bzw. gehasht ein (bei Sorted/Hashed Tables mitINTO TABLE
).
Syntax
Es gibt drei Hauptvarianten:
- 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. - Einzelne initiale Zeile anhängen:
APPEND INITIAL LINE TO <interne_tabelle> [ASSIGNING <feldsymbol> | REFERENCE INTO <datenreferenz>].
- 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 mitFROM <index1>
undTO <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 beiAPPEND <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äteresREAD TABLE
, wenn man die neue Zeile direkt bearbeiten will.KEEPING DUPLICATES
/DELETING DUPLICATES
: (Nur beiAPPEND 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 Regel0
.
2. Sortierte Tabellen (SORTED TABLE
)
APPEND <wa>
oderAPPEND 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 (mitKEEPING/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>
oderAPPEND 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. EinAPPEND
-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 undDELETING DUPLICATES
wurde verwendet, was aber primär die Quelle bereinigt). - Korrekte Anweisung für Hash-Tabellen:
INSERT <wa> INTO TABLE <tabelle>
.
Systemfelder
sy-subrc
: BeiAPPEND
auf Standardtabellen meist0
. BeiAPPEND LINES OF
auf Sorted/Hashed kannsy-subrc
auf4
gesetzt werden, wenn Duplikate gemäß den Zusätzen behandelt wurden, aber meist resultieren Schlüsselverletzungen hier in Laufzeitfehlern.sy-tabix
: NachAPPEND
auf eine Standardtabelle enthältsy-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ängengs_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 ASSIGNINGAPPEND 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ängenDATA 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 Tabellecl_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>
(oderREFERENCE INTO
) beiAPPEND <wa>
/INITIAL LINE
ist sehr performant, wenn Du die neu hinzugefügte Zeile direkt im Anschluss bearbeiten möchtest.