ABAP - INSERT verwenden
APPEND hat in ABAP bereits eine lange Geschichte, doch dieser wird in Zukunft immer weniger eine Rolle spielen. Wir zeigen dir wieso.
Inhaltsverzeichnis
Mit Clean ABAP und den neuen Statements, hat sich die Sprache ABAP die letzten Jahre stark weiterentwickelt, sodass mittlerweile viele Statements an Bedeutung verloren haben oder obsolet geworden sind. Im heutigen Artikel schauen wir uns INSERT etwas genauer an und wieso wir eigentlich den APPEND nicht mehr benötigen und diesen so langsam vergessen können.
APPEND
Der Append hängt eine Zeile an eine Tabelle, so wie der Name es vermuten lässt. Dies funktioniert aber nur für den Typ Standard-Tabelle und nicht für sortierte Tabellen (Sorted und Hash). Damit ist der Funktionsumfang des Statements stark eingeschränkt und führt im schlimmsten Fall zu einem Abbruch deiner Anwendung, wenn sich einmal der Typ der Tabelle ändern sollte.
Zur Folge hat dieses ABAP Statements einen stark eingeschränkten Verwendungsrahmen und kann zu Fehlern beim Aufruf führen. Da heutzutage der Performance wegen öfter Tabellen mit Sortierung und Schlüsseln verwendet werden, rückt dieser Befehl weiter in den Hintergrund.
INSERT
Der Insert Befehl kann in alle Arten von Tabellen eine Zeile korrekt einfügen und verhält sich entsprechend der Art der Tabelle. In sortierte Tabellen (Sorted, Hash) wird der Datensatz an der richtigen Stelle, entsprechend dem Schlüssel, eingefügt. Bei Standard-Tabellen wird der Datensatz am Ende angehangen. Damit umgehst du Probleme, wenn sich der Typ der Tabelle einmal ändern sollte. Solche Stellen fallen nicht immer bei einem Refactoring des Quellcodes auf und können schnell zu Abstürzen führen, die du hättest von Anfang an vermeiden können.
Im folgenden ein Beispiel zur Gegenüberstellung der beiden Befehle, einmal unter Verwendung einer Struktur und zum Zweiten über den neuen VALUE Befehl. Beide Befehle verhalten sich gleich, doch werden unterschiedlich ausgeschrieben.
DATA:
ls_tool TYPE zbs_dy_tools,
lt_tool TYPE STANDARD TABLE OF zbs_dy_tools WITH EMPTY KEY.
ls_tool-short_name = 'WRENCH'.
ls_tool-stock_quantity = 10.
APPEND ls_tool TO lt_tool.
INSERT ls_tool INTO TABLE lt_tool.
APPEND VALUE #( short_name = 'WRENCH' stock_quantity = 10 ) TO lt_tool.
INSERT VALUE #( short_name = 'WRENCH' stock_quantity = 10 ) INTO TABLE lt_tool.
Sortierte Tabelle
Wie verhält sich das Ganze bei sortierten Tabellen? Mit Append kannst du hier nicht mehr arbeiten, zumindest solange bis du einen Datensatz anhängst, der gegen die Sortierung verstößt. Diese Eigenschaft stellt ein hohes Risiko dar, da dieser Fehler vielleicht während des Tests nicht bemerkt wird.
Hier ein Beispiel zum Handling mit sortierten Tabellen:
DATA:
ls_tool TYPE zbs_dy_tools,
lt_tool TYPE SORTED TABLE OF zbs_dy_tools WITH UNIQUE KEY short_name.
ls_tool-short_name = 'WRENCH'.
ls_tool-stock_quantity = 10.
INSERT ls_tool INTO TABLE lt_tool.
INSERT VALUE #( short_name = 'WRENCH' stock_quantity = 10 ) INTO TABLE lt_tool.
Einige Entwickler fügen auch gern einmal einen leeren Datensatz in eine Tabelle ein und arbeiten dann mit dem Feldsymbol oder der Referenz weiter. Bei sortierten Tabellen muss aber zumindest der Schlüssel befüllt werden, damit das Verhalten funktioniert. Merh dazu findest du im Artikel "Arbeiten mit Referenzen". Ein kurzes Beispiel zu diesem Verhalten:
DATA:
lt_tool TYPE SORTED TABLE OF zbs_dy_tools WITH UNIQUE KEY short_name.
INSERT VALUE #( short_name = 'WRENCH' ) INTO TABLE lt_tool ASSIGNING FIELD-SYMBOL(<ls_tool>).
<ls_tool>-stock_quantity = 12.
INSERT VALUE #( short_name = 'HAMMER' ) INTO TABLE lt_tool REFERENCE INTO DATA(lr_tool).
lr_tool->stock_quantity = 15.
LINE_INDEX
Du hast eine Reihe von Datensätzen in eine Tabelle eingefügt und möchtest zu einem bestimmten Schlüssel den TABIX wissen? Dafür gibt es in ABAP den Befehl LINE_INDEX, dieser sucht nach dem Schlüssel und gibt die entsprechende Zeilennummer zurück. Wenn der Schlüssel nicht gefunden wird, wir der Wert 0 (Null) zurückgegeben. Dazu ein kleines Beispiel:
DATA:
lt_tool TYPE SORTED TABLE OF zbs_dy_tools WITH UNIQUE KEY short_name.
INSERT VALUE #( short_name = 'WRENCH' stock_quantity = 10 ) INTO TABLE lt_tool.
INSERT VALUE #( short_name = 'SCREW' stock_quantity = 10 ) INTO TABLE lt_tool.
INSERT VALUE #( short_name = 'HAMMER' stock_quantity = 10 ) INTO TABLE lt_tool.
DATA(ld_tabix) = line_index( lt_tool[ short_name = 'HAMMER' ] ).
Der Wert von der Variable ld_tabix wird entsprechend 1 sein, da der Datensatz an die erste Stelle in der Tabelle eingefügt wurde (der Sortierung folgend).
Fazit
Den ABAP Befehl Append solltest du langsam aus deinem Gedächtnis streichen und voll auf Insert setzen, um in Zukunft weniger Probleme zu haben. Die Nutzung ist genau so leicht wie Append und erspart dir etwas Ärger in Zukunft.
Quelle:
ABAP Dokumentation - LINE_INDEX