Interne Tabelle in ABAP einfach erklärt

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.

Interne Tabelle in ABAP

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
Die wichtigsten Operationen von interne Tabellen

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.

Transaktion SAT - Tipps und Tricks für die Laufzeitanalyse

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.

Performance von internen Tabellen

Über den Autor

Andreas Geiger

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.

Mehr zu ERP UP

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.

Schreibe einen Kommentar