In diesem Artikel werden die wichtigsten Operationen auf internen Tabellen in ABAP ausführlich erklärt. Neben der Syntax wird jeder Befehl bzw. jede Operation auf internen Tabellen im Detail erklärt. Außerdem erhältst Du für jede Operation Beispielcode, den Du verwenden und anpassen kannst. So erhältst Du eine gute Vorlage für Deinen eigenen ABAP-Code.
In der Programmiersprache ABAP spielen interne Tabellen eine entscheidende Rolle, wenn es darum geht, Daten lokal zu verwalten. Durch ihre Flexibilität und einfache Handhabung ermöglichen sie eine effiziente Verarbeitung und Organisation großer Datenmengen. Vom Einfügen und Löschen von Einträgen bis hin zum Sortieren und Selektieren von Datensätzen zeige ich Dir, wie Du diese Operationen durchführen kannst.

Interne Tabelle in ABAP erklärt
Was ist überhaupt eine interne Tabelle in ABAP und warum sollte man sie nutzen?
Interne Tabellen sind temporäre Tabellen, die durch einen Tabellentyp definiert werden können. Sie enthalten Datensätze gleicher Struktur, die durch den Tabellentyp festgelegt wird. Die einzelnen Datensätze werden auch als Tabellenzeilen oder Tabelleneinträge bezeichnet.
DATA: lt_itab TYPE TABLE OF ekko, " Interne Tabelle lt_itab ls_workarea TYPE ekko. " Arbeitsbereich/Workarea ls_workarea
Eine interne Tabelle ist ein lokales Datenobjekt, vergleichbar mit einfachen Datenobjekten und Strukturen. Im Gegensatz zu einer Tabelle des zugrundeliegenden Datenbanksystems eignen sich interne Tabellen zur lokalen Verwaltung von Datensätzen, die aus einer Datenbanktabelle gelesen wurden. Dazu wird eine interne Tabelle mit einer geeigneten Struktur definiert.
Insgesamt gibt es drei Tabellenarten:
- Standardtabellen
- Sortierte Tabellen
- Hash-Tabellen
Wenn Du mehr zu internen Tabellen erfahren möchtest, kannst Du den Artikel „Interne Tabelle in ABAP einfach erklärt“ lesen. Dort erfährst Du Wissenswertes zu internen Tabellen in ABAP einfach erklärt.
SELECT – Daten lesen
Interne Tabellen spielen eine wichtige Rolle bei der Speicherung und Verarbeitung von Datenbanktabelleninhalten innerhalb eines Programms. Der große Vorteil interner Tabellen besteht darin, dass Daten nur einmal aus einer Tabelle gelesen und lokal im ABAP-Programm verwendet bzw. verarbeitet werden können. Es müssen also nur einmal Daten aus einer Tabelle selektiert werden. Dies hat erhebliche Vorteile für die Performance. Mit der SELECT-Anweisung können Daten aus einer internen Tabelle oder aus einem Arbeitsbereich selektiert werden.
DATA: lt_itab TYPE TABLE OF ekko, " Interne Tabelle lt_itab ls_workarea TYPE ekko. " Arbeitsbereich/Workarea ls_workarea " SELECT INTO Arbeitsbereich SELECT SINGLE * FROM ekko INTO ls_workarea. " SELECT INTO Interne Tabelle SELECT * FROM ekko INTO TABLE lt_itab.
INSERT – Einfügen
Mit dem ABAP-Befehl INSERT kannst Du eine Zeile in eine interne Tabelle einfügen.
INSERT ls_workarea INTO { TABLE lt_itab } | { lt_itab INDEX index }.
Es gibt zwei Varianten, um neue Einträge in Tabellen einzufügen. Bei der Variante TABLE lt_itab wird bei Standardtabellen der neue Eintrag (ls_workarea) an das Ende der Tabelle angehängt. Bei sortierten und Hash-Tabellen wird der Eintrag (ls_workarea) an die entsprechende Stelle eingefügt.
INSERT ls_workarea INTO TABLE lt_itab.
Die andere Variante ist nur für Standard- und sortierte Tabellen erlaubt und fügt den neuen Datensatz an der Stelle ein, die durch den Index index spezifiziert wird. Bei sortierten Tabellen ist dies jedoch gefährlich, da eine Verletzung der Sortierreihenfolge zu einer unbehandelbaren Ausnahme führen kann.
INSERT ls_workarea INTO TABLE lt_itab lt_itab INDEX 1.
Achte bei dieser Anweisung unbedingt den Zusatz TABLE zu verwenden. Ansonsten kann es zum Laufzeitfehler „TABLE_ILLEGAL_STATEMENT“ kommen.
Durch den INSERT-Befehl kann man Zeilen anderer interner Tabellen einfügen.
INSERT LINES OF lt_itab2 [FROM table_index1] [TO table_index2] INTO {{TABLE lt_itab} | {lt_itab [INDEX index]}}.
INSERT LINES OF lt_itab2 INTO TABLE lt_itab.
INSERT LINES OF lt_itab2 FROM 2 TO 3 INTO lt_itab INDEX 2.
APPEND – Anhängen
Mit dem ABAP-Befehl APPEND kannst Du eine Zeile an eine interne Tabelle anhängen. Dabei wird die Zeile an das Ende der internen Tabelle angehängt.
APPEND ls_workarea TO lt_itab.
Die interne Tabelle sollte hierbei eine Standardtabelle sein. Wenn man die Anweisung APPEND bei sortierten Tabellen verwendet, entsteht ein Laufzeitfehler. Das Anhängen von Zeilen an sortierten Tabellen ergibt nämlich keinen Sinn, da die Position von Zeilen von der Sortierung abhängt.
Wenn man den APPEND-Befehl bei Hash-Tabellen anwendet, entsteht ein Syntaxfehhler. Der ABAP-Befehl APPEND ist bei Hash-Tabellen nicht möglich.
Durch den APPEND-Befehl kann man Zeilen einer anderen internen Tabellen anhängen.
APPEND LINES OF lt_itab2 [FROM table_index1] [TO table_index2] TO lt_itab.
APPEND LINES OF lt_itab2 TO lt_itab.
READ – Lesen
Mit dem ABAP-Befehl READ kannst Du eine Zeile aus einer internen Tabelle lesen bzw. ermitteln.
READ TABLE itab { { FROM ls_workarea2 } | { WITH TABLE KEY [keyname COMPONENTS] { comp_name1 | (name1) } = operand1 { comp_name2 | (name2) } = operand2 ... } | { INDEX index} } INTO ls_workarea.
Beim READ-Befehl kann man mithilfe eines Arbeitsbereiches eine Zeile aus einer internen Tabelle ermitteln. Der Arbeitsbereich ls_workarea ist der Arbeitsbereich, in den der Datensatz gelesen werden soll, während ls_workareae2 ein anderer Arbeitsbereich ist, dessen Werte für die Schlüsselkomponenten zur Selektion des Datensatzes verwendet werden können.
Alternativ können die Schlüsselwerte auch über die WITH TABLE KEY-Variante einzeln angegeben werden. Zudem ist über INDEX ein Indexzugriff möglich, sofern die Tabelle entsprechend angelegt wurde.
Sollte es vorkommen, dass mehrere mögliche Zeilen auf die Bedingungen gefunden werden können, wird der erste gefundene, passende Datensatz ermittelt.
Beispiel-Code aus dem SAP Help Artikel zu „READ TABLE itab“:
DATA spfli_tab TYPE SORTED TABLE OF spfli WITH UNIQUE KEY carrid connid WITH NON-UNIQUE SORTED KEY city_key COMPONENTS cityfrom cityto. READ TABLE spfli_tab WITH TABLE KEY city_key COMPONENTS cityfrom = 'FRANKFURT' cityto = 'NEW YORK' ASSIGNING FIELD-SYMBOL(<spfli>). IF sy-subrc = 0. ... ENDIF.
DATA itab TYPE STANDARD TABLE OF i WITH EMPTY KEY WITH NON-UNIQUE SORTED KEY sort_key COMPONENTS table_line. itab = VALUE #( ( 2 ) ( 5 ) ( 1 ) ( 3 ) ( 4 ) ). DATA(output) = ``. DATA(idx) = lines( itab ). WHILE idx > 0. READ TABLE itab INDEX idx USING KEY sort_key ASSIGNING FIELD-SYMBOL(<fs>). idx -= 1. CHECK <fs> > 2. output = output && <fs> && ` `. ENDWHILE. cl_demo_output=>display( output ).
MODIFY – Ändern
Mit dem ABAP-Befehl MODIFY kannst Du eine Zeile aus einer internen Tabelle durch Daten eine Arbeitsbereiches überschreiben.
Dabei kann man entweder über einen Arbeitsbereich anhand der passenden Schlüsselkomponenten oder anhand eines Index eine Zeile überschreiben.
MODIFY { { TABLE lt_itab} | { lt_itab INDEX index } } FROM ls_workarea.
MODIFY TABLE lt_itab FROM ls_workarea.
MODIFY lt_itab INDEX 1 FROM ls_workarea.
DELETE – Löschen
Mit dem ABAP-Befehl DELETE kannst Du eine Zeile in einer internen Tabelle löschen.
DELETE {{ TABLE lt_itab { FROM wa } | { WITH TABLE KEY c1 = d1 c2 = d2 …}} | { lt_itab INDEX index }}.
Dabei gibt es erneut zwei Möglichkeiten:
- Angabe eines Schlüssels (Arbeitsbereich oder Schlüsselkomponente)
- Index
DELETE TABLE lt_itab FROM ls_workarea.
DELETE lt_itab INDEX 1.
Man kann natürlich auch über den DELETE-Befehl mehre Zeilen oder gar die ganze interne Tabelle löschen.
DELETE itab [FROM table_index1] [TO table_index2] [WHERE bedingung].
Durch FROM und TO wird ein Bereich aus Tabellenindizes angegeben, auf die das DELETE beschränkt werden soll. Durch WHERE wiederrum wird ein logischer Ausdruck angegeben, der das Löschen von Zeilen in der internen Tabelle einschränkt. Gerade beim DELETE-Befehl sollte man sehr vorsichtig sein und stets eine Bedingung mit WHERE angeben, damit man nur die Datensätze löscht, die man löschen möchte.
DELETE lt_itab WHERE field1 = 'TEST'.
SORT – Sortieren
Mit dem ABAP-Befehl SORT kannst Du eine interne Tabelle sortieren.
SORT lt_itab [STABLE] [ASCENDING | DESCENDING] [AS TEXT] [sort_key].
Nur Standard- und Hash-Tabellen können sortiert werden. Sortierte Tabellen können nicht mit dem SORT-Befehl sortiert werden.
Der Zusatz STABLE bewirkt eine stabile Sortierung. Das bedeutet, dass die relative Reihenfolge von Zeilen, die sich im Sortierschlüssel nicht unterscheiden, bei der Sortierung unverändert bleibt. Ohne den Zusatz STABLE ist die Reihenfolge nicht stabil.
Die Angabe von ASCENDING oder DESCENDING gibt explizit an, ob die Sortierung aufsteigend oder absteigend erfolgen soll. Ohne Angabe wird von einer aufsteigenden Sortierung ausgegangen.
Bei der Sortierung werden numerische und byteartige Komponenten nach ihrem Wert, zeichenartige Komponenten nach ihrer internen Darstellung (Codepage) sortiert. Eine textuelle Sortierung der zeichenartigen Komponenten wird durch den Zusatz AS TEXT erreicht.
Die Angabe des Sortierschlüssels, also des Kriteriums, nach dem sortiert werden soll, erfolgt im Zusatz [sort_key]. Diese Angabe ist wie folgt aufgebaut:
BY comp1 [ASCENDING|DESCENDING] [AS TEXT] comp2 [ASCENDING|DESCENDING] [AS TEXT] comp3 [ASCENDING|DESCENDING] [AS TEXT] ...
Fehlt die Angabe, wird der Tabellenschlüssel verwendet. Die erste Komponente hat bei der Sortierung die höchste Priorität.
In der Schlüsselwortdokumentation von SORT kannst Du weitere Details zum ABAP-Befehl nachlesen. Alternativ kannst Du diese ebenfalls im ABAP Editor (Transaktion SE38) aufrufen, indem Du den Cursor auf den SORT-Befehl setzt und die F1-Taste auf Deiner Tastatur drückst.
COLLECT – Verdichtetes Einfügen
Mit dem ABAP-Befehl COLLECT kannst Du eine Zeile in einer internen Tabelle verdichtet einfügen.
COLLECT ls_workarea INTO TABLE lt_itab.
Hier spielt vor allem der Schlüssel eine Rolle. Existiert in der internen Tabelle lt_itab noch kein Eintrag, dessen Schlüssel dem des Arbeitsbereichs ls_workarea entspricht, so wird die Zeile ls_workarea wie beim INSERT-Kommando in die interne Tabelle eingefügt. Ist jedoch bereits ein Eintrag vorhanden, so werden alle Nicht-Schlüsselkomponenten von ls_workarea an die entsprechenden Komponenten in der internen Tabelle angehängt. Dies setzt natürlich voraus, dass alle Nicht-Schlüsselkomponenten vom Typ numerisch sind.
TYPES: BEGIN OF ty_num, id TYPE i, num TYPE i, END OF ty_num. DATA: lt_sum TYPE SORTED TABLE OF ty_num WITH UNIQUE KEY id, ls_sum TYPE ty_num. ls_sum-id = 1. ls_sum-num = 30. COLLECT ls_sum INTO lt_sum. ls_sum-id = 2. ls_sum-num = 50. COLLECT ls_sum INTO lt_sum. ls_sum-id = 1. ls_sum-num = 100. COLLECT ls_sum INTO lt_sum. LOOP AT lt_sum INTO ls_sum. WRITE: / ls_sum-id, ls_sum-num. ENDLOOP.
Der Eintrag mit der ID 1 hat einen Wert von 130 und der Eintrag mit der ID 2 einen Wert von 50.
CLEAR, REFRESH und FREE – Initialisieren
Mit den ABAP-Befehlen CLEAR, REFRESH und FREE kannst Du eine interne Tabelle leeren und damit initialisieren. Dabei gibt es jedoch Unterschiede.
"CLEAR CLEAR lt_itab. CLEAR lt_itab[]. "REFRESH REFRESH lt_itab. "FREE FREE lt_itab.
Mit dem CLEAR-Befehl werden bei internen Tabellen alle Zeilen gelöscht und der Speicher bis auf den initialen Speicherbedarf freigegeben. Bei internen Tabellen mit einer Kopfzeile wird nur die Kopfzeile gelöscht. Möchte man mit dem CLEAR-Befehl auch den Tabellenkörper löschen, muss man hinter den Tabellennamen [] schreiben.
Die REFRESH-Anweisung ist mittlerweile obsolet und sollte nicht mehr verwendet werden. Sie sorgt dafür, dass alle Zeilen einer internen Tabelle gelöscht werden. Bei internen Tabellen mit Kopfzeile wird nicht die Kopfzeile, sondern der Tabellenkörper initialisiert.
Der FREE-Befehl bewirkt bei internen Tabellen, dass der gesamte von den Zeilen belegte Speicher freigegeben wird. Bei Strukturen mit tabellenartigen Komponenten wird der Speicher jeder tabellenartigen Komponente freigegeben. Dies bedeutet einen etwas höheren Aufwand. Bei internen Tabellen mit einer Kopfzeile wird nur der Tabellenkörper und nicht die Kopfzeile gelöscht.
DESCRIBE – Anzahl Zeilen ermitteln
Mit dem ABAP-Befehl DESCRIBE kannst Du die Anzahl der internen Tabellensätze erfahren. Also wie viele Zeilen eine interne Tabelle besitzt. Alternativ kannst Du auch die Funktion LINES verwenden.
"DESCRIBE DESCRIBE TABLE lt_itab LINES lv_count. "LINES DATA(lv_count2) = LINES( lt_itab ).
LOOP – Durchlaufen
Eine der wichtigsten Operationen und Befehle für interne Tabellen in ABAP ist LOOP. Mit Hilfe von LOOP kann man eine interne Tabelle durchlaufen und damit die einzelnen Zeilen lesen. Beim LOOP handelt es sich um ein spezielles Schleifenkonstrukt für interne Tabellen.
LOOP AT lt_itab {INTO ls_workarea } | {ASSIGNING <fs>} | {REFERENCE INTO lr_ref } | {TRANSPORTING NO FIELDS } [FROM table_index1] [TO table_index2] [WHERE bedingung]. ... ENDLOOP.
Beim jeweiligen Schleifendurchlauf wird die aktuelle Zeile in den Arbeitsbereich ls_workarea, dem Feldsymbol <fs>, oder der Referenz lr_ref gespeichert. Beim LOOP kann man auch eine Bedingung [cond] mit angeben. Durch FROM und TO wird ein Bereich aus Tabellenindizes angegeben, auf die die Schleife beschränkt werden soll. Durch WHERE wiederrum wird ein logischer Ausdruck angegeben, der die Schleife auf mögliche Zeilen in der internen Tabelle beschränkt. Es werden nur Zeilen ermittelt, die auf die Bedingung zutreffen.
Über die Systemvariable sy-tabix ist die Nummer des aktuellen Schleifendurchlaufs verfügbar.
LOOP AT lt_itab into ls_workarea. WRITE: ls_workarea-feld1, ls_workarea-feld2. ENDLOOP.
Sehr nützlich und vorteilhaft sind inline-Deklarationen. Dabei kann man direkt den Arbeitsbereich, das Feldsymbol oder die Referenz deklarieren.
LOOP AT lt_itab INTO DATA(ls_workarea). WRITE: ls_workarea-feld1, ls_workarea-feld2. ENDLOOP.
Dabei darf die Variable bzw. der Arbeitsbereich ls_workarea noch nicht deklariert worden sein.
LOOP AT lt_itab ASSIGNING FIELD-SYMBOL(<fs>). WRITE: <fs>-feld1, <fs>-feld2. ENDLOOP.
Über den Autor
Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.
ERP UP unterstützen
Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.