Eine interne Tabelle in ABAP ist sehr wichtig. Mit Hilfe interner Tabellen kann die Performance von ABAP-Programmen erheblich gesteigert werden. Darüber hinaus sind sie ein häufig verwendetes Mittel zur Datenbeschaffung und -modifikation. Interne Tabellen sind aus der Programmiersprache ABAP nicht mehr wegzudenken. In diesem Artikel möchte ich daher interne Tabellen in ABAP im Detail vorstellen und näher erläutern. Anhand zahlreicher Beispiele wird das Erklärte praktisch veranschaulicht.
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.
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. In anderen Programmiersprachen verwendet man hierfür Arrays und Listen.

Die Syntax für die Definition von Tabellentypen lautet wie folgt:
TYPES typname { { TYPE tabellenart OF [REF TO] type } | { LIKE tabellenart OF [REF TO] dobj } } [WITH key] [INITIAL SIZE n]. DATA lt_itab TYPE typname.
Die Syntax für tabellenart lautet wie folgt:
{ {[STANDARD] TABLE } | {SORTED TABLE} | {HASHED TABLE} | {ANY TABLE} | {INDEX TABLE} }
Die Syntax für key lautet wie folgt:
[UNIQUE | NON-UNIQUE] { {KEY comp1 comp2 …} | {DEFAULT KEY} }
Insgesamt gibt es drei Tabellenarten:
- Standardtabellen
- Sortierte Tabellen
- Hash-Tabellen
Standardtabelle
Eine Tabelle, die keine feste Reihenfolge der Einträge vorgibt, kann mit dem Zusatz „STANDARD TABLE“ definiert werden. Dabei handelt es sich um eine Standardtabelle. Diese Tabelle erlaubt das Einfügen von Einträgen an beliebiger Stelle und erlaubt den Zugriff sowohl über einen Index als auch über einen Schlüssel.
DATA: lt_words TYPE STANDARD TABLE OF string WITH EMPTY KEY. SPLIT `Dieser kurze Satz enthält kurze Wörter.` AT ` ` INTO TABLE lt_words. cl_demo_output=>display( lt_words ).
Sortierte Tabelle
Um eine sortierte Tabelle zu definieren, kann der Zusatz „SORTED TABLE“ verwendet werden. Diese Tabelle ist immer sortiert und es ist nicht möglich, einen Eintrag an einer Stelle einzufügen, die die Sortierreihenfolge verletzt. Ein solcher Versuch würde zu einem Programmabsturz führen.
Der Zugriff ist sowohl über Index als auch über Schlüssel möglich, wobei sowohl eindeutige als auch nicht-eindeutige Schlüssel unterstützt werden. Die Zugriffszeit bei sortierten Tabellen nimmt mit der Anzahl der Datensätze logarithmisch zu.
DATA: lt_words TYPE STANDARD TABLE OF string WITH EMPTY KEY, lt_sorted_words TYPE SORTED TABLE OF string WITH NON-UNIQUE KEY table_line. SPLIT `Dieser kurze Satz enthält kurze Wörter.` AT ` ` INTO TABLE lt_words. cl_demo_output=>write( lt_words ). lt_sorted_words = lt_words. cl_demo_output=>display( lt_sorted_words ).
Hash-Tabelle
Eine Hash-Tabelle ist ein spezieller Typ von Tabelle, der durch den Zusatz „HASHED TABLE“ definiert wird. Im Gegensatz zu Indextabellen kann bei Hash-Tabellen nur über den Schlüssel und nicht über einen Index zugegriffen werden. Der Schlüssel muss eindeutig sein.
Die Hash-Tabelle ist optimal, wenn der vollständige Schlüssel der Tabelle benötigt wird. Die Zugriffszeit beim Lesen eines Datensatzes aus einer Hash-Tabelle ist unabhängig von der Anzahl der Datensätze in der Hash-Tabelle.
TYPES: BEGIN OF ty_hash, feld1 TYPE c, feld2 TYPE c, END OF ty_hash. DATA: lt_hash TYPE HASHED TABLE OF ty_hash WITH UNIQUE KEY feld1, ls_hash TYPE ty_hash.
Indexzugriff auf interne Tabelle
Ein Indexzugriff ist der Zugriff auf einen Satz der internen Tabelle unter Angabe der Zeilennummer.
" INSERT (Funktioniert nur, wenn lt_itab mindestens einen Eintrag besitzt) DESCRIBE TABLE lt_itab LINES lv_count. INSERT ls_workarea INTO lt_itab INDEX lv_count. " READ READ TABLE lt_itab INDEX 1 INTO ls_workarea.
Schlüsselzugriff auf interne Tabelle
Ein Schlüsselzugriff ist der Zugriff auf einen Satz der internen Tabelle unter Angabe eines Schlüssels. Ein Schlüssel ist ein oder mehrere Felder einer Tabelle. Bei einem eindeutigen Schlüssel kommen niemals zwei Datensätze mit demselben Schlüsselwert vor. Dafür verwendet man den Zusatz UNIQUE. Ein nicht-eindeutiger Schlüssel wird mit NON-UNIQUE spezifiziert.
DATA spfli_tab TYPE SORTED TABLE OF spfli WITH UNIQUE KEY carrid connid WITH NON-UNIQUE SORTED KEY city_key COMPONENTS cityfrom cityto. " READ - Variante 1 READ TABLE spfli_tab WITH TABLE KEY city_key COMPONENTS cityfrom = 'FRANKFURT' cityto = 'NEW YORK' ASSIGNING FIELD-SYMBOL(<spfli>). IF sy-subrc = 0. ... ENDIF. " READ - Variante 2 READ TABLE spfli_tab WITH KEY carrid = 'LH' connid = 400 ASSIGNING FIELD-SYMBOL(<spfli2>). IF sy-subrc = 0. ... ENDIF.
" DELETE DELETE TABLE lt_itab FROM ls_workarea.
Die wichtigsten Operationen auf interne Tabellen
Im Artikel „Die wichtigsten Operationen auf interne Tabellen“ sind die wichtigsten Operationen auf interne Tabellen im Detail erläutert. 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.
Zu den wichtigsten Operationen auf interne Tabellen gehören:
- SELECT – Daten lesen
- INSERT – Einfügen
- APPEND – Anhängen
- READ – Lesen
- MODIFY – Ändern
- DELETE – Löschen
SELECT – Daten lesen
" Deklaration einer internen Tabelle DATA: lt_itab TYPE TABLE OF ekko, " Interne Tabelle lt_itab ls_workarea TYPE ekko. " Arbeitsbereich/Workarea ls_workarea " SELECT INTO Workarea SELECT SINGLE * FROM ekko INTO ls_workarea. " SELECT INTO Interne Tabelle SELECT * FROM ekko INTO TABLE lt_itab.
INSERT – Einfügen
INSERT ls_workarea INTO TABLE lt_itab. " INSERT über Index INSERT ls_workarea INTO TABLE lt_itab lt_itab INDEX 1. " INSERT einer anderen internen Tabelle INSERT LINES OF lt_itab2 INTO TABLE lt_itab.
APPEND – Anhängen
APPEND ls_workarea TO lt_itab. " APPEND einer anderen internen Tabelle APPEND LINES OF lt_itab2 TO lt_itab.
READ – Lesen
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
MODIFY TABLE lt_itab FROM ls_workarea. " MODIFY über Index MODIFY lt_itab INDEX 1 FROM ls_workarea.
DELETE – Löschen
DELETE TABLE lt_itab FROM ls_workarea. " DELETE über Index DELETE lt_itab INDEX 1. " DELETE mit Bedingung DELETE lt_itab WHERE field1 = 'TEST'.
Vermeide diesen typischen Fehler
Ein typischer Fehler kann bei der Deklaration von internen Tabellen auftreten. Syntaktisch ist das Programm korrekt, aber oft meint der ABAP-Entwickler etwas anderes als das, was man entwickeln will.
Achte bei der Deklaration von internen Tabellen auf den Zusatz „TABLE“. Ohne diesen Zusatz deklarierst Du keine interne Tabelle, sondern einen Arbeitsbereich. Man kann folglich nur „eine Zeile“ in diesem Arbeitsberiech speichern und nicht mehrere. Das hat Auswirkungen auf andere Befehle wie SELECT und INSERT.
" Deklaration DATA: lt_itab TYPE TABLE OF ekko, " Interne Tabelle lt_itab ls_workarea TYPE ekko. " Arbeitsbereich/Workarea ls_workarea " SELECT INTO Workarea SELECT SINGLE * FROM ekko INTO ls_workarea. " Man kann sofort auf Felder des Arbeitsbereichs zugreifen. " Beispiel: ls_workarea-ebeln " SELECT INTO Interne Tabelle SELECT * FROM ekko INTO TABLE lt_itab. " Um auf Zeilen der internen Tabelle zuzugreifen, muss man diese über READ oder LOOP lesen " READ READ TABLE lt_itab ASSIGNING FIELD-SYMBOL(<fs_itab>) INDEX 1. " Beispiel: <fs_itab>-ebeln " LOOP LOOP AT lt_itab ASSIGNING FIELD-SYMBOL(<fs_itab2>). " Beispiel: <fs_itab2>-ebeln ENDLOOP.
Achte beim INSERT-Befehl auf den Zusatz „TABLE“. Ohne diesen Zusatz tritt der Fehler „TABLE_ILLEGAL_STATEMENT“ auf.
" Achtung: Dieser ABAP-Code verursacht einen Fehler INSERT ls_workarea INTO lt_itab.
INSERT ls_workarea INTO TABLE lt_itab. " INSERT über Index INSERT ls_workarea INTO TABLE lt_itab lt_itab INDEX 1. " INSERT einer anderen internen Tabelle INSERT LINES OF lt_itab2 INTO TABLE lt_itab.
Beim APPEND-Befehl hingegen soll kein Zusatz „TABLE“ verwendet werden.
" Richtig APPEND ls_workarea TO lt_itab. " Falsch - Diese Zeile verursacht einen Fehler APPEND ls_workarea TO TABLE lt_itab.
Performance von internen Tabellen prüfen
Mit der Transaktion SAT (ABAP Trace) steht eine Funktion zur Verfügung, mit der die Performance direkt anhand von ABAP-Beispielen angezeigt werden kann. Nach dem Aufruf der Transaktion klickst Du auf den Button „Tips & Tricks“ oder verwendest die F6-Taste.

Daraufhin öffnet sich ein Fenster mit einer Baumstruktur auf der linken Seite und auf der rechten Seite ein Fenster, das zwei Bereiche bzw. Vergleiche zeigt. Sobald man auf der linken Seite auf einen gewünschten Knoten klickt und auf den Button „Laufzeit messen“ klickt, werden die beiden Programme miteinander verglichen. Unter dem Titel steht jeweils die benötigte Laufzeit in Mikrosekunden.
Besonders interessant für interne Tabellen ist der Ordner bzw. Knoten „Internal Tables“. Hier kann man verschiedene Programme miteinander vergleichen und so den eigenen Programmstil optimieren.

Ü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.