• Startseite
  • Produkte
  • Jetzt
  • Buchnotizen
  • Lebenslauf
  • Unternehmensberatung
  • Spiele
  • Click to open the search input field Click to open the search input field Suche
  • Menü Menü
Denis Reis
  • Link zu X
  • Link zu Facebook
  • Link zu Xing
  • Link zu LinkedIn
  • Link zu Rss dieser Seite
  • Link zu Mail
Know-How SAP

Interne Tabellen in ABAP

Dieser Beitrag ist Teil des Kurses ABAP Grundlagen.
In diesem Artikel stelle ich interne Tabellen vor. Unter anderem gehe ich auf die folgenden Punkte ein:

Durch einen Erfahrungsaustausch lässt sich viel voneinander lernen. Tauschen Sie sich deshalb jetzt mit Experten auf Ihrem Gebiet aus und erweitern Sie Ihr Netzwerk! Treten Sie jetzt der exklusiven Gruppe von SAP Experten bei.

  • Tabellenarten
    • Standardtabellen
    • Sortierte Tabellen
    • Hash-Tabellen
  • Performance
    • Optimale Zugriffe
    • Feldsymbole
  • Beispiele
    • Interne Tabelle anlegen
    • Interne Tabelle füllen
    • Interne Tabelle verarbeiten
    • Inhalte von internen Tabellen löschen

Neben den Tabellen auf der Datenbank existieren auch Tabellen im Arbeitsspeicher. Diese werden auch als interne Tabellen bezeichnet, da Sie nur zur Laufzeit existieren. Diese internen Tabellen verhalten sich genau wie die in ABAP deklarierte Strukturen. Allerdings hat eine temporäre Struktur (ein Arbeitsbereich) nur eine Zeile, während eine interne Tabelle beliebig viele Zeilen haben könnte.
Wie bei einer Datenbanktabelle haben alle Zeilen denselben Aufbau und dieselbe Struktur. Für die lesende Verarbeitung von Datensätzen muss jeder Datensatz aus dem Tabellenrumpf (dem Inhalt der internen Tabelle) in eine Workarea gestellt werden. Von dort aus erfolgt dann die Weiterverarbeitung. Bei der schreibenden Verarbeitung wird eine Zeile zuerst in der Workarea aufbereitet und anschließend erfolgt die Übertragung an den Tabellenrumpf, indem wir die Workarea anhängen oder einfügen.
Da die internen Tabellen im Arbeitsspeicher liegen, erfolgt der Zugriff um ein vielfaches schneller als der Zugriff auf eine Datenbanktabelle. Allerdings nimmt die Verarbeitungsgeschwindigkeit mit zunehmender Tabellengröße ab. Daher sollten Sie je nach betriebswirtschaftlicher Anforderung und voraussichtlicher Tabellengröße beim Anlegen der internen Tabelle auf den Typ achten.
Insgesamt gibt es drei Tabellentypen: Standardtabellen, sortierte Tabellen und Hash-Tabellen. Dabei werden Standardtabellen und sortierte Tabellen auch als Indextabellen bezeichnet.
Ein wesentliches Unterscheidungsmerkmal ist der Schlüssel. Dieser dient wie bei einer Datenbanktabelle der Identifizierung einer Zeile. Bei internen Tabellen existieren eindeutige UNIQUE und nicht eindeutige NON-UNIQUE Schlüssel. Bei einem eindeutigen Schlüssel können keine mehrfachen Einträge in internen Tabellen vorkommen. Bei einem nicht eindeutigen Schlüssel darf eine Zeile in der internen Tabelle auch mehrfach vorkommen.
Daneben existieren auch benutzerdefinierte Schlüssel. Dieser kann aus einer beliebigen, frei definierbaren Teilmenge von Feldern der Struktur zusammengesetzt werden. Bei der Definition des Schlüssels ist die Reihenfolge der Schlüsselfelder wichtig. Dies von Bedeutung, wenn beispielsweise nach dem Schlüssel sortiert wird.
Die Tabellenart definiert, wie ABAP auf einzelne Tabellenzeilen zugreift.

Tabellenarten

Standardtabellen

Bei Standardtabellen STANDARD TABLE kann der Zugriff über einen Schlüssel oder einen Index erfolgen. Dabei ist der Schlüssel einer Standardtabelle immer nicht eindeutig NON-UNIQUE. Daher können mehrfache identische Zellen vorkommen. Bei dem Zugriff über einen Schlüssel wächst die Zugriffszeit linear. Je mehr Zeilen, desto länger dauert es bis zur Antwort, da häufig die komplette Tabelle durchsucht wird, um den betreffenden Satz zu finden.
Dafür kann die Standardtabelle sehr schnell gefüllt werden, da nicht nach bereits vorhandenen Einträgen gesucht werden muss. So könnte man die Tabelle zuerst füllen und dann entsprechend dem Verwendungszweck sortieren und die Duplikate löschen. Verwendet man danach Schlüsselzugriffe mit der Option für binäre Suche BINARY SEARCH, so steigt der Suchaufwand mit der Anzahl der Tabelleneinträge nur noch logarithmisch.
Bei Standardtabellen wird automatisch ein interner Index SY-TABIX gepflegt. Dieser beinhaltet die Zeilen 1 bis Anzahl der Zeilen. Bei großen internen Tabellen ist eventuell der Zugriff über den Index sinnvoll.

Sortierte Tabellen

Sortierte Tabellen SORTED TABLE werden immer nach dem Schlüssel sortiert abgespeichert. Der Schlüssel kann eindeutig oder nicht-eindeutig sein. Bei der Tabellendefinition muss die Eindeutigkeit des Schlüssels als UNIQUE oder NON-UNIQUE deklariert werden. Beim Schlüsselzugriff hängt die Antwortzeit logarithmisch von der Anzahl der Tabelleneinträge ab, da der Zugriff über eine binäre Suche erfolgt. Allerdings ist der Aufbau von sortierten Tabellen langsamer, da immer die Sortierung eingehalten werden muss. Der Zugriff kann auch über den Tabellenindex erfolgen.
Sortierte Tabellen haben zwei wesentliche Vorteile. Zum einen können Sätze mit doppeltem Schlüssel automatisch verhindert werden. Doppelte Sätze werden bereits beim Füllen der Tabelle erkannt. Je nach Inhalt des Returncodes der ABAP-anweisung und der Gestaltung der Fehlerbehandlung im Coding kann in eine Fehlerbehandlung (z.B. doppelte Sätze überspringen) verzweigt werden oder es wird ein Laufzeitfehler ausgelöst. Zum anderen sind sortierte Tabellen bei Schleifen mit WHERE Bedingungen schneller. Dabei ist die Reihenfolge der Schlüsselfelder wichtig. Diese sollte so gewählt werden, dass möglichst alle Zugriffe die führenden Schlüsselfelder versorgen.
Betrachten wir das folgende Beispiel. Die sortierte Tabelle lt_demo hat die Schlüsselfelder S1, S2, S3 und S4. Dann ist bei gleicher Datenmenge der Befehl

LOOP AT lt_demo 
WHERE S1 = 'ABC'.
ENDLOOP.

deutlich schneller als die ähnliche Anweisung

LOOP AT lt_demo 
WHERE S2 = 'XYZ'
AND S3 = '123'
AND S4 = '0'.
ENDLOOP.

Bei der ersten Anweisung wird über binäre Suche genau der Anfangspunkt gesucht, bei dem S1 den Wert ABC annimmt. Dann wird die Tabelle so lange zeilenweise abgearbeitet, bis S1 nicht mehr den Wert ABC hat. In diesem Fall hilft die Sortierung der Tabelle alle relevanten Zeilen zu finden.
In der zweiten Anweisung haben wir keine Informationen über S1. Damit ist die bestehende Sortierung der Tabelle nutzlos, es muss die gesamte Tabelle gelesen werden, um die relevanten Zeilen zu finden.

Hash-Tabellen

Bei Hash-Tabellen wird kein Index erzeugt, der Zugriff erfolgt über einen eindeutigen Schlüssel. Der Schlüssel kann aus einem oder auch mehreren Feldern bestehen. Dieser Tabellentyp empfiehlt sich für große Tabellen, da durch den Hash-Algorithmus die Anwortzeit konstant ist. Dabei ist es gleichgültig, wie viele Zeilen die Tabelle hat. Achten Sie darauf, dass der Schlüssel bei Hash-Tabellen eindeutig sein muss und zu Ihrem Lesezugriff passt. Haben Sie z.B. Daten, bei denen Ihr Lesezugriff nicht eindeutig ist, sollten Sie besser nur eine Teilmenge der Daten oder eine sortierte Tabelle verwenden. Mögliche Verwendung im BW wäre zum Beispiel die Anreicherung von Bewegungsdaten.

Performance

Optimale Zugriffe

Welche Tabellenart im Einzelfall schneller ist, hängt wie so oft von diversen Faktoren ab. Insbesondere die Anzahl und die Sortierung der Sätze in der Tabelle spielen eine große Rolle. In der Regel besitzen jedoch Hash-Tabellen einen deutlichen Vorteil gegenüber sortierten Tabellen und diese wiederum gegenüber Standardtabellen. Um immer den optimalen Lesezugriff auf interne Tabellen zu finden, sind in der nachfolgenden Tabelle die möglichen Tabellenzugriffe mit den Auswirkungen auf die Laufzeit dargestellt.

Zugriffsart Standardtabelle Sortierte Tabelle Hash-Tabelle
READ TABLE tab
WITH KEY
Die Tabelle wird Zeile für Zeile durchsucht (Full Table Scan): O(n) Full Table Scan: O(n) Full Table Scan: O(n)
READ TABLE tab
WITH TABLE KEY
Full Table Scan: O(n) Es wird mittels binärer Suche gesucht: O(log n) Durch ein Hash-Verfahren erfolgt der Zugriff in nahezu konstanter Zeit: O(1)
READ TABLE tab
INDEX …
Der Zugriff erfolgt in nahezu konstanter Zeit: O(1) Der Zugriff erfolgt in nahezu konstanter Zeit: O(1) Nicht möglich
LOOP AT tab
WHERE …
Full Table Scan: O(n) Enthält die WHERE Bedingung den ersten Teil des Schlüssels, wird binär bis zum Anfangspunkt gesucht. Danach werden nur die Einträge Zeile für Zeile gelesen, die die entsprechenden Werte haben: O(log n + m). (Siehe Beispiel Sortierte Tabellen) Andernfalls wird die gesamte Tabelle Zeile für Zeile durchsucht (Full Table Scan): O(n) Full Table Scan: O(n)

Die O-Notatigion bezieht sich auf den Faktor, um den die Zugriffszeit mit der Größe der Tabelle wächst.

  • O(1) – Der Zugriff ist rechnerabhängig und wird als konstant betrachtet, die asymptotische Laufzeitkomplexität beträgt O(1).
  • O(n) – Die Zugriffszeit wächst proportional zur Anzahl der Tabelleneinträge n. Je mehr Einträge, desto länger dauert es.
  • O(log n) – Die Zugriffszeit wächst proportional zum Logarithmus der Anzahl n der Einträge. So führt zum Beispiel das Quadrieren der Tabelleneinträge n gerade einmal zur Verdoppelung der Laufzeit. So werden bei sortierten Tabellen die Einträge sortiert nach Schlüsselwerten abgelegt. Daher kann das System bei der Suche nach jedem Suchschritt die Hälfte der Werte rausschmeißen.
  • O(log n + m) – Die Zugriffszeit ist proportional zu log n + m, wobei m die Anzahl der Treffer und n die Anzahl der Tabelleneinträge ist.
ABAP Performance nach Zugriffsart

Spicker zum Herunterladen

Feldsymbole

Neben den „richtigen“ Tabellenarten und Lesezugriffen bieten Feldsymbole eine weitere Möglichkeit die Performance zu optimieren. Feldsymbole beschleunigen den Programmablauf und helfen Speicherplatz zu sparen. Feldsymbole stellen in ABAP das Äquivalent zu Zeigern in anderen Programmiersprachen dar. Sie enthalten keine physischen Daten, sondern zeigen nur auf Variablen im Arbeitsspeicher, die die Daten enthalten. Technisch beinhaltet ein Zeiger die Speicheradresse, die die Daten enthält.
In der folgenden Übersicht finden Sie die wichtigsten Befehle zur Behandlung von Feldsymbolen.

Befehl Bedeutung Anmerkung
FIELD-SYMBOLS: <fs> TYPE type. Das Feldsymbol wird definiert. Sie sollten immer typisierte Feldsymbole verwenden. Im Zweifelsfall können Sie Feldsymbole mit dem Typ ANY oder ANY TABLE typisieren.
ASSIGN var TO <fs>. Dem Feldsymbol <fs> wird die Variable var zugewiesen. Nach dieser Anweisung können Sie statt der Variablen var auch das Feldsymbol <fs> verwenden, bis <fs> einer anderen Variable zugewiesen wird.
<fs> = 1337. Dem Feldsymbol <fs> wird der Wert 1337 zugewiesen. Wenn die Variable var dem Feldsymbol <fs> zugewiesen ist, nimmt auch var diesen Wert an.
LOOP AT tab
ASSIGNING <fs>.
Während der Schleife wird dem Feldsymbol <fs> die aktuelle Zeile der Tabelle TAB zugewiesen. Bei breiten Tabellen ist der Performancevorteil am größten. Generell bringt diese Anweisung ab fünf Schleifendurchläufen Performancevorteile.
READ TABLE tab ASSIGNING <fs> ... Dem Feldsymbol <fs> wird das Ergebnis der Leseanweisung zugewiesen. Diese Anweisung bietet Performancevorteile ab einer Tabellenlänge von 1.000 Bytes.

Anbei auch ein Spicker zum Herunterladen.

Feldsymbole Anweisungen

Übersicht über Feldsymbole Befehle

Beispiele

In der Praxis sind die Standardtabellen nach wie vor der häufigste Tabellentyp. Daher beziehen sich die Beispiele in diesem Beitrag auf Standardtabellen.

Interne Tabelle anlegen

Der Prozess für das Anlegen einer internen Tabelle besteht aus drei Schritten:

  • Deklaration eines Zeilentyps
  • Deklaration der Tabelle
  • Deklaration des Arbeitsbereichs

Unsere interne Tabelle soll Smartphones mit ihren Preisen enthalten. Zunächst deklarieren wir den Zeilentyp. Die Deklaration erfolgt über die TYPES Anweisung.

TYPES: BEGIN OF zeile_typ,
  thandy TYPE zsmartphones2-thandy,
  tpreis TYPE zsmartphones2-tpreis,
  END OF zeile_typ.

Unser Zeilentyp besteht aus zwei Feldern thandy und tpreis. Bei der Deklaration verweisen wir auf die Felder bereits vorhandene Tabelle. Alternativ können wir auch auf die jeweiligen Datenelemente verweisen.

TYPES: BEGIN OF zeile_typ,
  thandy TYPE /bi0/oimaterial,
  tpreis TYPE /bi0/oiamount,
  END OF zeile_typ.

Als nächstes wird die Tabelle samt Tabellentyp deklariert. Dabei muss je nach Tabellentyp der Schlüssel festgelegt werden. Optional können Sie über die Anweisung INITIAL SIZE n den Speicherplatz für n Tabellenzeilen vorbelegen. Dies ist nur sinnvoll, wenn Sie bereits die voraussichtliche Anzahl von Zeilen in diesem Tabellentyp genau einschätzen können. Dieser Zusatz kann entfallen, wenn für n der Wert 0 eingesetzt wird und Sie es dem System überlassen wollen, den Speicherplatz zu verwalten.
Mit der folgenden Anweisung deklarieren Sie eine interne Standardtabelle. Dabei legt STANDARD TABLE oder kurz TABLE die Tabellenart fest.

DATA lt_itab TYPE STANDARD TABLE OF zeile_typ.

Eine Standardtabelle hat immer einen nicht eindeutigen Schlüssel, daher kann der Zusatz für den Schlüssel entfallen.
Um eine sortierte Tabelle zu definieren, verwenden Sie die folgende Anweisung. Der Schlüssel von sortierten Tabellen kann eindeutig oder nicht-eindeutig sein.

DATA lt_itab TYPE SORTED TABLE OF zeile_typ
             WITH UNIQUE KEY thandy.

Auch bei Hash-Tabellen muss der eindeutige Schlüssel immer explizit angegeben werden.

DATA lt_itab TYPE HASHED TABLE OF zeile_typ
             WITH UNIQUE KEY thandy.

Der Schlüssel kann auch mehrere Felder beinhalten, zum Beispiel:

DATA lt_itab TYPE HASHED TABLE OF zeile_typ
             WITH UNIQUE KEY thandy tcolor.

Anschließend deklarieren wir den Arbeitsbereich für die interne Tabelle mithilfe des Zeilentyps.

DATA ls_itab TYPE zeile_typ.

Interne Tabelle füllen

Nun zeige ich Ihnen wie Sie ein interne Tabellen füllen können. Dabei gibt es verschiedene Möglichkeiten. Sie können direkt auf die Datensätze der internen Tabelle zugreifen oder mithilfe einer Workarea (bzw. Struktur) arbeiten. Das Arbeiten mit einer eigens dazu angelegten Workarea hat den Vorteil, dass Sie den Datensatz, den Sie in die interne Tabelle einfügen, in Ruhe verarbeiten können.

1. Beispiel
Wir übertragen den Inhalt der Datenbanktabelle ZSMARTPHONES2 zeilenweise in die namensgleichen Felder der Workarea ls_zsmartphones. Die Workarea kann immer nur den Inhalt einer Zeile aufnehmen. Anschließend erfolgt die Zuweisung der Feldinhalte. So entspricht das Feld artikel in unseren internen Tabelle dem Feld thandy auf der Datenbank. Nachdem die Workarea der internen Tabelle gefüllt ist, hängen wir über die Anweisung APPEND die Feldinhalte der Workarea an die interne Tabelle lt_itab.

TYPES: BEGIN OF zeile_typ,
  artikel TYPE /bi0/oimaterial,
  preis TYPE /bi0/oiamount,
  END OF zeile_typ.

DATA: lt_itab TYPE TABLE OF zeile_typ,
      ls_itab TYPE zeile_typ,
      ls_zsmartphones TYPE zsmartphones2.

SELECT * FROM zsmartphones2 INTO ls_zsmartphones.
  ls_itab-artikel = ls_zsmartphones-thandy.
  ls_itab-preis = ls_zsmartphones-tpreis.
  APPEND ls_itab to lt_itab.
ENDSELECT.

2. Beispiel
In diesem Beispiel übertragen wir den Inhalt der Datenbanktabelle zeilenweise in die namensgleichen Felder der internen Tabelle. Zunächst wird die Workarea der Datenbanktabelle ls_zsmartphones gefüllt. Dort stehen alle Feldinhalte der Datenbankzeile. Wir übertragen aber nur einen Teil davon in die Workarea der internen Tabelle. Nur die namensgleichen Felder werden übernommen. Beachten Sie bitte, dass das System nur die Namensgleichheit prüft, nicht die Gleichheit der Feldeigenschaften. Daher sollten Sie sich bei der Deklarierung der internen Tabelle an den Datenelementen der Datenbanktabelle orientieren.

TYPES: BEGIN OF zeile_typ,
  thandy TYPE /bi0/oimaterial,
  tpreis TYPE /bi0/oiamount,
  END OF zeile_typ.

DATA: lt_itab TYPE TABLE OF zeile_typ,
      ls_itab TYPE zeile_typ,
      ls_zsmartphones TYPE zsmartphones2.

SELECT * FROM zsmartphones2 INTO ls_zsmartphones.
  MOVE-CORRESPONDING ls_zsmartphones TO ls_itab.
  APPEND ls_itab TO lt_itab.
ENDSELECT.

3. Beispiel
Sie können den Inhalt der Datenbanktabelle nicht nur zeilenweise, sondern auch blockweise in die interne Tabelle übertragen. Dabei lassen wir die Workareas außen vor. Das ist die schnellste Möglichkeit eine interne Tabelle zu füllen.
In diesem Beispiel übertragen wir alle Inhalte von namensgleichen Feldern mit einem Mal von der Datenbanktabelle in die interne Tabelle.

TYPES: BEGIN OF zeile_typ,
  thandy TYPE /bi0/oimaterial,
  tpreis TYPE /bi0/oiamount,
  END OF zeile_typ.

DATA: lt_itab TYPE TABLE OF zeile_typ.

SELECT * FROM zsmartphones2 INTO
  CORRESPONDING FIELDS OF TABLE lt_itab.
Interne Tabelle gefüllt

Daten wurden in die interne Tabelle übertragen

Interne Tabelle verarbeiten

Wie auch bei Datenbanktabellen können Sie bei internen Tabellen über eine Schleife alle Zeilen nacheinander oder auch einzelne Zeilen verarbeiten. Allerdings werden in diesem Zusammenhang unterschiedliche Anweisungen verwendet.

LOOP ... ENDLOOP
So wird zum Beispiel für eine Schleife die Anweisung LOOP mit ENDLOOP statt SELECT mit ENDSELECT verwendet. Mit einer Schleife verarbeiten Sie zeilenweise alle Sätze einer Tabelle. Bei der LOOP-Anweisung können Sie die Zeilen der internen Tabelle in eine Workarea stellen. Die Anweisung wird mit ENDLOOP abgeschlossen. Da die Workarea frei wählbar ist, müssen Sie angeben, um welche Workarea es sich handelt.

LOOP AT lt_itab INTO ls_itab.

ENDLOOP.

Mit dieser Anweisung wird die Workarea ls_itab bei jedem Schleifendurchlauf mit einer Zeile der Tabelle lt_itab gefüllt.

MODIFY
Innerhalb der Schleife könnten Sie die Einträge ändern. In dem folgenden Beispiel setzen wir den Preis konstant auf 1. Für die Änderung bestehender Einträge der internen Tabelle verwenden wir den Befehl MODIFY. Steht dieser Befehl innerhalb der Schleife, wird die aktuelle Zeile der internen Tabelle im Bezug auf die relevante Workarea aktualisiert.
Zunächst ändern wir den Inhalt der Workarea ls_itab. Anschließend wird die Zeile der internen Tabelle aus (FROM) der Workarea überschrieben.

LOOP AT lt_itab INTO ls_itab.
  ls_itab-tpreis = 1.
  MODIFY lt_itab FROM ls_itab.
ENDLOOP.

Das Ganze funktioniert natürlich auch über Feldsymbole. Verwenden Sie den LOOP-Befehl mit dem Zusatz ASSIGNING um bei jedem Schleifendurchlauf der jeweiligen Zeile ein Feldsymbol zuzuweisen.

TYPES: BEGIN OF zeile_typ,
  thandy TYPE /bi0/oimaterial,
  tpreis TYPE /bi0/oiamount,
  END OF zeile_typ.

DATA: lt_itab TYPE TABLE OF zeile_typ.
FIELD-SYMBOLS: <ls_itab> TYPE zeile_typ.

SELECT * FROM zsmartphones2 INTO
  CORRESPONDING FIELDS OF TABLE lt_itab.

LOOP AT lt_itab ASSIGNING <ls_itab>.
  <ls_itab>-tpreis = 1.
  MODIFY lt_itab FROM <ls_itab>.
ENDLOOP.

Der Befehl MODIFY ändert nur der Inhalt einer bestehenden Zeile der internen Tabelle. Es wird keine neue Zeile angelegt. Wenn die MODIFY-Anweisung in der LOOP-Schleife steht, wird immer die aktuelle Zeile geändert. Allerdings darf bei Tabellen mit einem eindeutigen Schlüssel der Schlüssel nicht geändert werden.
Steht die Anweisung außerhalb der Schleife, müssen Sie die zu ändernde Zeile über den Index angeben.

DESCRIBE TABLE
Mit der Anweisung DESCRIBE TABLE können Sie die Anzahl der Rumpfzeilen, den reservierten Speicherplatz und die Tabellenart abfragen. In unserem Beispiel wollen wir die Anzahl der Rumpfzeilen wissen. Diese können Sie über den Zusatz LINES ermitteln.

DESCRIBE TABLE lt_itab LINES lv_zeilen.

Die gefundene Anzahl der Zeilen wird in die Variable lv_zeilen vom Typ Integer geschrieben.

INSERT
Die ermittelte Anzahl von Rumpfzeilen könnten Sie verwenden, wenn Sie in die interne Tabelle eine neue Zeile einfügen wollen. Der Befehl hierfür lautet INSERT.

DESCRIBE TABLE lt_itab LINES lv_zeilen. "Anzahl der Zeilen bestimmen
*Neue Zeile
ls_itab-thandy = '000000000000000005'.
ls_itab-tpreis = '500.00'.

INSERT ls_itab INTO lt_itab INDEX lv_zeilen.

Im Gegensatz zu der Anweisung APPEND, welche die Zeilen immer am Ende des Tabellenrumpfes anhängt, können Sie mit der INSERT-Anweisung Zeilen an beliebiger Stelle einfügen. Grundsätzlich wird die neue Zeile immer vor der Position eingefügt, die Sie mit dem Zusatz INDEX angegeben haben. Wenn Sie zum Beispiel INDEX 4 angeben, wird die neue Zeile vor der alten Zeile 4 eingefügt. In unserem Beispiel sieht das Ergebnis wie folgt aus.

ABAP INSERT Anweisung mit INDEX

Neue Zeile eingefügt

Wenn Sie den Inhalt der Variable lv_zeilen um 1 erhöhen, wird die neue Zeile ganz unten angehängt. In diesem Fall ist die Wirkung der Anweisungen INSERT und APPEND identisch.

DESCRIBE TABLE lt_itab LINES lv_zeilen.
lv_zeilen = lv_zeilen + 1.

ls_itab-thandy = '000000000000000005'.
ls_itab-tpreis = '500.00'.

INSERT ls_itab INTO lt_itab INDEX lv_zeilen.
APPEND und INSERT

Neue Zeile wird angehängt

READ
Standardtabellen können Sie über einen Index oder einen Schlüssel lesen. Um die erste Zeile der Tabelle zu lesen, verwenden Sie die folgende Anweisung.

READ TABLE lt_itab INDEX 1 INTO ls_itab.

Statt der 1 können Sie auch eine Variable verwenden, wie in den obigen Beispielen. Falls Sie den Index nicht ermitteln können, können Sie auch über Schlüsselfelder auf die Tabelle zugreifen.
Interne Tabellen besitzen immer einen nicht eindeutigen NON-UNIQUE Schlüssel. Daher müssen Sie sich überlegen, durch welche Schlüsselfelder Sie eine Zeile möglichst eindeutig bestimmen können. Beachten Sie, dass in Standardtabellen die Zeilen mehrfach vorkommen können. Die READ-Anweisung zieht aber (ausgehend vom Tabellenanfang) nur den ersten passenden Satz, ohne weiter zu schauen ob es möglicherweise noch weitere Treffer gibt.
Die Syntax sieht wie folgt aus.

READ TABLE lt_itab INTO ls_itab
WITH KEY tpreis = '100.00'.

Dabei wird aus den Rumpfzeilen der internen Tabelle lt_itab die erste passende Zeile in die Workarea ls_itab, bei der das Feld tpreis den Inhalt 100 hat. Es könnten in der Tabelle jedoch mehrere Zeilen mit diesem Feldinhalt stehen. So könnte es mehrere Smartphonemodelle geben, die 100 Euro kosten. Die 100 könnten auch in verschiedenen Währungen in der Tabelle abgelegt werden. Die READ-Anweisung prüft dies jedoch nicht mehr. Sie schnappt sich den erstbesten Treffer.
Wenn Sie eine Standardtabelle über die Anweisung SORT sortieren, können Sie mit dem Zusatz BINARY SEARCH eine binäre Suche durchführen.

DELETE
Auch beim Löschen einer Zeile können Sie auf den Index zugreifen. Wenn Sie zum Beispiel die erste Zeile löschen wollen, verwenden Sie den folgenden Befehl.

DELETE lt_itab INDEX 1.

Alternativ können Sie die relevante Zeile über den Inhalt des Arbeitsbereichs identifizieren. Wie bei der READ-Anweisung sucht DELETE, vom Tabellenanfang aus, der ersten passenden Satz in den Rumpfzeilen und löscht auch nur diesen. Verwenden Sie dabei den Zusatz TABLE.

ls_itab-thandy = '000000000000000001'.
ls_itab-tpreis = '100.00'.

DELETE TABLE lt_itab FROM ls_itab.

DELETE ADJACENT DUPLICATES
Die Anweisung DELETE ADJACENT DUPLICATES bietet die Möglichkeit redundante Zeilen zu löschen. Zuvor müssen Sie die interne Tabelle entsprechend sortieren. Anschließend werden die redundanten Zeilen bis auf eine gelöscht.

SORT lt_itab BY thandy.
DELETE ADJACENT DUPLICATES FROM lt_itab.

Inhalte von internen Tabellen löschen

Die Inhalte der Workarea und der internen Tabelle bleiben so lange erhalten, bis sie überschrieben werden. Das kann unter Umständen zu unsinnigen Ergebnissen führen, siehe Beispiel unten.

Felder nicht überschrieben

Unsinnige Ergebnisse

Je nach Aufgabenstellung kann es daher erforderlich sein, die Workarea und den Tabellenrumpf zu leeren. Hierzu gibt es verschiedene Möglichkeiten.

CLEAR
Interne Tabellen können durch die Anweisung CLEAR initialisiert (gelöscht) werden. Mit dem folgenden Befehl löschen sie alle Rumpfzeilen.

CLEAR lt_itab.

Mit demselben Befehl können Sie auch die Workarea initialisieren.

CLEAR ls_itab.

Sie können die Anweisung natürlich auch als Kettensatz formulieren.

CLEAR: lt_itab, ls_itab.

FREE
Alternativ können Sie auch den Befehl FREE verwenden.

FREE lt_itab, ls_itab.

Während bei CLEAR der zugewiesene Speicherplatz reserviert bleibt, gibt FREE den gesamten durch die Tabelle beanspruchten Speicher frei. Zwar kann die interne Tabelle jederzeit erneut angesprochen werden, allerdings muss das System zuerst den Speicherplatz wieder reservieren. Das kann Performance kosten.

Quellen:
Karl-Heinz Kühnhauser, Thorsten Franz (2011): Discover ABAP, 3. Auflage, Bonn
Dirk Herzog (2012): ABAP-Programmierung für SAP NetWeaver BW – Kundeneigene Erweiterungen, 3. Auflage, Bonn

Diese ABAP Tricks machen Ihr Leben leichter!

  • In meinem Newsletter gebe ich eine Menge Tipps und Kniffe rund um ABAP.
  • Die Mini-Tutorials unterstützen Sie dabei, Software in ABAP effizienter zu entwickeln.
  • Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung Ihrer Arbeit.
  • Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „ABAP Tipps und Tricks“ als Willkommensgeschenk.
ABAP Tipps und Tricks

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.

SAP Hilfe – Interne Tabellen
SAP Hilfe – Binäre Suche bei Standard-Tabellen
SAP Hilfe – Interne Tabellen bearbeiten
SAP Hilfe – ABAP-Systemfelder

Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.

7. Mai 2014/2 Kommentare/von Denis
Eintrag teilen
  • Teilen auf Facebook
  • Teilen auf X
  • Teilen auf WhatsApp
  • Teilen auf Pinterest
  • Teilen auf LinkedIn
  • Teilen auf Tumblr
  • Teilen auf Vk
  • Teilen auf Reddit
  • Per E-Mail teilen
https://www.denisreis.com/wp-content/uploads/2016/09/logo.png 0 0 Denis https://www.denisreis.com/wp-content/uploads/2016/09/logo.png Denis2014-05-07 17:00:372018-10-16 02:49:53Interne Tabellen in ABAP
Das könnte Dich auch interessieren
How To SAP BI – Query trotz RSZC Fehler kopieren
Debuggen in ABAP Debuggen in ABAP
BAdI Funktion zum Runden für BPC 10.0 NW erstellen BAdI Funktion zum Runden für BPC 10.0 NW erstellen
Kontenmodell zu Kennzahlenmodell zu Kontenmodell umwandeln How To BI – Data Source über BAdI erweitern
Kontenmodell zu Kennzahlenmodell zu Kontenmodell umwandeln Customer Exit Variablen in SAP BI IP
Kontenmodell zu Kennzahlenmodell zu Kontenmodell umwandeln Kontenmodell zu Kennzahlenmodell zu Kontenmodell umwandeln
2 Kommentare
  1. Stefan Horn
    Stefan Horn sagte:
    7. November 2017 um 17:27

    Schöner Artikel. Im ersten Satz („In diesem Artikel stelle interne Tabellen vor.“) fehlt ein „ich“.

    Antworten
    • Denis
      Denis sagte:
      8. November 2017 um 07:05

      Hallo Stefan, vielen Dank! Fixed.

      Antworten

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar Antwort abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

Stay connected

  • RSS abonnieren
  • XING
  • LinkedIn
  • Twitter
  • Facebook
  • Newsletter

Ich lese gerade

12 Rules for Life: An Antidote to Chaos

SAP BI Buchempfehlung

SAP Analysis for Microsoft Office: Reporting leicht gemacht: BI-Werkzeug für MS Excel

Kategorien

  • Allgemein
  • BPC
  • Buchnotizen
  • CSS
  • Excel
  • How-To Tutorials SAP BI BA
  • Know-How SAP
  • Projektmanagement und Führung
  • VBA

Hörfutter

Hol dir ein kostenloses Hörbuch!

Anzeige

ABAP Buchempfehlung

Lernen Sie ABAP schnell und effizient! Einstieg in ABAP: Die Neuauflage von Discover ABAP
Beliebt
  • Bestimmte Zeilen in eine andere Tabelle kopieren
    Excel VBA – Bestimmte Zeilen in eine andere Tabelle...9. März 2014 - 22:14
  • Excel VBA - Wie Sie den Blattschutz ohne Kennwort aufheben
    Excel VBA – Wie Sie den Blattschutz ohne Kennwort...24. Oktober 2017 - 12:58
  • Excel VBA - Zeichen ersetzen mit Replace
    Excel VBA – Zeichen ersetzen mit Replace12. Oktober 2014 - 20:15
  • Wie sie das aktuelle Datum in einer Liste finden
    Excel VBA – Wie Sie das aktuelle Datum in einer Liste...30. Januar 2018 - 12:57
Kürzlich
  • SAP BDC Connect für Databricks
    SAP BDC Connect für Databricks leicht gemacht10. September 2026 - 08:28
  • Datasphere CLI einrichten
    Wie Sie Datasphere CLI einrichten20. Juni 2026 - 10:57
  • Linux Spickzettel
    Linux Spickzettel24. April 2026 - 20:38
  • SAP Datasphere als Remote Quelle für SAP HANA nutzen
    SAP Datasphere als Remote Quelle für SAP HANA nutzen23. März 2026 - 09:27
Kommentare
  • PaulSuper Artikel, leider gibt es diesen FuBa bei BW/4HANA 2023...3. März 2026 - 13:34 von Paul
  • MichaelHallo, ich habe diesen Beitrag gefunden, gerade der Tipp...1. August 2023 - 14:52 von Michael
  • CarportDanke für die tolle Arbeit die hier geleistet wurde, hier...14. Februar 2023 - 12:15 von Carport
  • Tobias IsenbergHi, kann nur davon abraten/warnen, das Sprachpaket zu...19. Oktober 2022 - 14:31 von Tobias Isenberg

Werbung

Schlagwörter

ABAP AI Analysis Aufwandsschätzung BAdI BDC berechtigungen BPC BTP Controlling CSS Datasphere Delegation Design Studio EPM EvDRE Excel HTML JavaScript Meeting PM Prozessketten Python SAC SAP Script Logic Scrum SQL SQLScript Tabellen Transformationsroutinen Tutorial VBA Workshop

Archiv

  • September 2026
  • Juni 2026
  • April 2026
  • März 2026
  • Februar 2026
  • Januar 2026
  • Dezember 2025
  • November 2025
  • Oktober 2025
  • September 2025
  • August 2025
  • Juli 2025
  • Juni 2025
  • Mai 2025
  • April 2025
  • März 2025
  • Februar 2025
  • Januar 2025
  • Dezember 2024
  • November 2024
  • Oktober 2024
  • September 2024
  • August 2024
  • Juli 2024
  • Juni 2024
  • Mai 2024
  • April 2024
  • März 2024
  • Februar 2024
  • Januar 2024
  • Dezember 2023
  • November 2023
  • Oktober 2023
  • September 2023
  • August 2023
  • Juli 2023
  • Juni 2023
  • Mai 2023
  • April 2023
  • März 2023
  • Februar 2023
  • Januar 2023
  • Dezember 2022
  • November 2022
  • Oktober 2022
  • September 2022
  • August 2022
  • Juli 2022
  • Juni 2022
  • Mai 2022
  • April 2022
  • März 2022
  • Februar 2022
  • Januar 2022
  • Dezember 2021
  • November 2021
  • Oktober 2021
  • September 2021
  • August 2021
  • Juli 2021
  • Juni 2021
  • Mai 2021
  • April 2021
  • März 2021
  • Februar 2021
  • Januar 2021
  • Dezember 2020
  • November 2020
  • Oktober 2020
  • September 2020
  • August 2020
  • Juli 2020
  • Juni 2020
  • Mai 2020
  • April 2020
  • März 2020
  • Februar 2020
  • Januar 2020
  • Dezember 2019
  • November 2019
  • Oktober 2019
  • September 2019
  • August 2019
  • Juli 2019
  • Juni 2019
  • Mai 2019
  • April 2019
  • März 2019
  • Februar 2019
  • Januar 2019
  • Dezember 2018
  • November 2018
  • Oktober 2018
  • Juli 2018
  • Juni 2018
  • Mai 2018
  • April 2018
  • März 2018
  • Februar 2018
  • Januar 2018
  • Dezember 2017
  • November 2017
  • Oktober 2017
  • September 2017
  • August 2017
  • Juli 2017
  • Juni 2017
  • Mai 2017
  • April 2017
  • März 2017
  • Februar 2017
  • Januar 2017
  • Dezember 2016
  • November 2016
  • Oktober 2016
  • September 2016
  • August 2016
  • Juli 2016
  • Juni 2016
  • Mai 2016
  • April 2016
  • März 2016
  • Februar 2016
  • Januar 2016
  • Dezember 2015
  • November 2015
  • Oktober 2015
  • September 2015
  • August 2015
  • Juli 2015
  • Juni 2015
  • Mai 2015
  • April 2015
  • März 2015
  • Februar 2015
  • Januar 2015
  • Dezember 2014
  • November 2014
  • Oktober 2014
  • September 2014
  • August 2014
  • Juli 2014
  • Juni 2014
  • Mai 2014
  • April 2014
  • März 2014
  • Februar 2014
  • Januar 2014
  • Dezember 2013
  • November 2013
  • Oktober 2013
  • September 2013
  • August 2013
  • Juli 2013
  • Juni 2013
  • Mai 2013
  • April 2013
  • März 2013
  • Februar 2013
  • Januar 2013
  • Dezember 2012
  • November 2012
  • Oktober 2012
  • September 2012
  • August 2012
  • Juli 2012
  • Juni 2012
  • Mai 2012
  • April 2012
  • März 2012
  • Februar 2012
  • Januar 2012
© Copyright - Denis Reis - Lumen accipe et imperti - Impressum - Datenschutz
  • Link zu X
  • Link zu Facebook
  • Link zu Xing
  • Link zu LinkedIn
  • Link zu Rss dieser Seite
  • Link zu Mail
Link to: How To BI – Data Source über BAdI erweitern Link to: How To BI – Data Source über BAdI erweitern How To BI – Data Source über BAdI erweitern Link to: Excel VBA – Druckbereich bestimmen Link to: Excel VBA – Druckbereich bestimmen Excel VBA – Druckbereich bestimmen
Nach oben scrollen Nach oben scrollen Nach oben scrollen

Diese Website benutzt Cookies. Wenn du die Website weiter nutzt, erteilst du eine Einverständniserklärung zur Erhebung personenbezogener Daten nach der DSGVO. Weitere Informationen zu Cookies und insbesondere dazu, wie Sie deren Verwendung widersprechen können, finden Sie in unseren Datenschutzhinweisen.

Akzeptieren


Wie wir Cookies verwenden

Wir können Cookies anfordern, die auf Ihrem Gerät eingestellt werden. Wir verwenden Cookies, um uns mitzuteilen, wenn Sie unsere Websites besuchen, wie Sie mit uns interagieren, Ihre Nutzererfahrung verbessern und Ihre Beziehung zu unserer Website anpassen.

Klicken Sie auf die verschiedenen Kategorienüberschriften, um mehr zu erfahren. Sie können auch einige Ihrer Einstellungen ändern. Beachten Sie, dass das Blockieren einiger Arten von Cookies Auswirkungen auf Ihre Erfahrung auf unseren Websites und auf die Dienste haben kann, die wir anbieten können.

Notwendige Website Cookies

Diese Cookies sind unbedingt erforderlich, um Ihnen die auf unserer Webseite verfügbaren Dienste und Funktionen zur Verfügung zu stellen.

Da diese Cookies für die auf unserer Webseite verfügbaren Dienste und Funktionen unbedingt erforderlich sind, hat die Ablehnung Auswirkungen auf die Funktionsweise unserer Webseite. Sie können Cookies jederzeit blockieren oder löschen, indem Sie Ihre Browsereinstellungen ändern und das Blockieren aller Cookies auf dieser Webseite erzwingen. Sie werden jedoch immer aufgefordert, Cookies zu akzeptieren / abzulehnen, wenn Sie unsere Website erneut besuchen.

Wir respektieren es voll und ganz, wenn Sie Cookies ablehnen möchten. Um zu vermeiden, dass Sie immer wieder nach Cookies gefragt werden, erlauben Sie uns bitte, einen Cookie für Ihre Einstellungen zu speichern. Sie können sich jederzeit abmelden oder andere Cookies zulassen, um unsere Dienste vollumfänglich nutzen zu können. Wenn Sie Cookies ablehnen, werden alle gesetzten Cookies auf unserer Domain entfernt.

Wir stellen Ihnen eine Liste der von Ihrem Computer auf unserer Domain gespeicherten Cookies zur Verfügung. Aus Sicherheitsgründen können wie Ihnen keine Cookies anzeigen, die von anderen Domains gespeichert werden. Diese können Sie in den Sicherheitseinstellungen Ihres Browsers einsehen.

Andere externe Dienste

Wir nutzen auch verschiedene externe Dienste wie Google Webfonts, Google Maps und externe Videoanbieter. Da diese Anbieter möglicherweise personenbezogene Daten von Ihnen speichern, können Sie diese hier deaktivieren. Bitte beachten Sie, dass eine Deaktivierung dieser Cookies die Funktionalität und das Aussehen unserer Webseite erheblich beeinträchtigen kann. Die Änderungen werden nach einem Neuladen der Seite wirksam.

Google Webfont Einstellungen:

Google Maps Einstellungen:

Google reCaptcha Einstellungen:

Vimeo und YouTube Einstellungen:

Datenschutzrichtlinie

Sie können unsere Cookies und Datenschutzeinstellungen im Detail in unseren Datenschutzrichtlinie nachlesen.

Datenschutz
Einstellungen akzeptieren