Interne Tabellen (ABAP): Unterschied zwischen den Versionen
Matt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Matt (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 1: | Zeile 1: | ||
Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt. | Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt. | ||
== Strukturtyp definieren == | |||
Für die nachfolgenden Beispiele sei die folgende Struktur gegeben. Diese könnte auch im Dictionary definiert sein.<syntaxhighlight lang="abap"> | Für die nachfolgenden Beispiele sei die folgende Struktur gegeben. Diese könnte auch im Dictionary definiert sein.<syntaxhighlight lang="abap"> | ||
" Struktur für Buch | " Struktur für Buch | ||
Zeile 97: | Zeile 98: | ||
Beispiel für implizite Definition einer internen Tabells aus einer Struktur:<syntaxhighlight lang="abap"> | Beispiel für implizite Definition einer internen Tabells aus einer Struktur:<syntaxhighlight lang="abap"> | ||
DATA: lt_buchregal TYPE TABLE OF lst_buch | DATA: lt_buchregal TYPE TABLE OF lst_buch | ||
</syntaxhighlight>Beispiele für explizite Definition eines Tabellentyps. | </syntaxhighlight>Beispiele für explizite Definition eines Tabellentyps und anschließende definition einer internen Tabelle. Der Tabelelntyp könnte auch im Dictionary definiert werden:<syntaxhighlight lang="abap"> | ||
" Tabellentyp für Standard-Tabelle | " Tabellentyp für Standard-Tabelle | ||
TYPES: ltt_buchregal TYPE STANDARD TABLE OF lst_buch " Definition lst_buch siehe oben | TYPES: ltt_buchregal TYPE STANDARD TABLE OF lst_buch " Definition lst_buch siehe oben | ||
Zeile 103: | Zeile 104: | ||
DATA: lt_buchregal TYPE ltt_buchregal. | DATA: lt_buchregal TYPE ltt_buchregal. | ||
</syntaxhighlight>Für die Bearbeitung einer internen Tabelle wird | </syntaxhighlight>Für die Bearbeitung einer internen Tabelle wird eine Arbeitsstruktur, manchmal auch als Workarea bezeichnet, benötigt. | ||
Eine | Eine Arbeitsstruktur kann mittels LIKE LINE OF auf Basis einer internen Tabelle erstellt werden: | ||
<syntaxhighlight lang="abap"> | <syntaxhighlight lang="abap"> | ||
Zeile 113: | Zeile 114: | ||
" Erstellung einer passenden Struktur | " Erstellung einer passenden Struktur | ||
DATA: ls_biblio LIKE LINE OF lt_biblio. | DATA: ls_biblio LIKE LINE OF lt_biblio. | ||
</syntaxhighlight>Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) erstellt werden:<syntaxhighlight lang="abap"> | </syntaxhighlight>Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) mit TYPE erstellt werden:<syntaxhighlight lang="abap"> | ||
" Gegeben ist, dass zbiblio eine Datenbanktabelle ist | " Gegeben ist, dass zbiblio eine Datenbanktabelle ist | ||
DATA: gs_bibio TYPE zbiblio | DATA: gs_bibio TYPE zbiblio | ||
Zeile 119: | Zeile 120: | ||
" Allgemeine Formulierung | " Allgemeine Formulierung | ||
DATA: <wa> TYPE <dbtab> | DATA: <wa> TYPE <dbtab> | ||
</syntaxhighlight> | </syntaxhighlight>Eine interne Tabelle kann mit TYPE TABLE OF auf Basis einer Datenbanktabelle erstellt werden:<syntaxhighlight lang="abap"> | ||
" Interne Tabelle auf Basis transp. Tabelle | " Interne Tabelle auf Basis transp. Tabelle | ||
DATA: lt_cust TYPE TABLE OF zcust. | DATA: lt_cust TYPE TABLE OF zcust. | ||
Zeile 144: | Zeile 145: | ||
=== Einzelne Datensätze lesen === | === Einzelne Datensätze lesen === | ||
Einzelne Datensätze aus interner Tabelle in eine Arbeitsstruktur lesen.<syntaxhighlight lang="abap"> | |||
READ TABLE <itab> INTO <wa> WITH [TABLE] KEY <s1> = <f1>. | |||
</syntaxhighlight> | |||
== Einfügen / Schreiben von Daten == | == Einfügen / Schreiben von Daten == | ||
Zeile 151: | Zeile 155: | ||
</syntaxhighlight>Bei SORTED- oder HASHED-Tabellen kann auch INSERT verwendet werden:<syntaxhighlight lang="abap"> | </syntaxhighlight>Bei SORTED- oder HASHED-Tabellen kann auch INSERT verwendet werden:<syntaxhighlight lang="abap"> | ||
INSERT <wa> INTO TABLE <itab> | INSERT <wa> INTO TABLE <itab> | ||
</syntaxhighlight>Abhängig von Tabellenart passiert jedoch etwas anderes: | </syntaxhighlight>Abhängig von Tabellenart passiert bei INSERT jedoch etwas anderes: | ||
{| class="wikitable" | {| class="wikitable" | ||
!Tabellenart | !Tabellenart |
Version vom 4. September 2016, 19:23 Uhr
Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt.
Strukturtyp definieren
Für die nachfolgenden Beispiele sei die folgende Struktur gegeben. Diese könnte auch im Dictionary definiert sein.
" Struktur für Buch
TYPES: BEGIN OF lst_buch,
buch_titel type string,
anz_seiten type int4,
END OF lst_buch.
Aufbau von internen Tabellen
Interne Tabellen benötigen einen Tabellentyp. Ein Tabellentyp kann per Code oder im Dictionary definiert werden. Er definiert:
- Zeilentyp, z. B. ein Strukturtyp
- Tabellenart, z. B. STANDARD
- Schlüsseldefinition: z. B. WITH NON_UNIQUE DEFAULT KEY
Tabellenarten
Typ | ANY* | ||
---|---|---|---|
Generisch | INDEX TABLE* | Hashed Table | |
Tabellenart | STANDARD TABLE | SORTED TABLE | HASHED TABLE |
Indexzugriff | Ja | Ja | Nein |
Schlüsselzugriff | Ja | Ja | Ja |
Schlüsseleindeutigkeit | NON-UNIQUE | UNIQUE oder NON-UNIQUE | UNIQUE |
Bemerkung | Kann und muss im
Schlüssel keine eindeutigen Werte enthalten. |
Kann und muss im
Schlüssel eindeutige Werte enthalten. |
Schlüssel muss
eindeutige Werte |
*) ANY und INDEX TABLE können als Typisierung für Schnittstellen von Methode, Funktionsbausteinen etc. verwendet werden.
Beispiel für explizite Definition:
" Tabellentyp für sortierte Tabelle
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
WITH NON-UNIQUE DEFAULT KEY.
" Tabellentyp für hashed Tabelle
TYPES: ltt_buchregal_hashed TYPE HASHED TABLE OF lst_buch
WITH UNIQUE DEFAULT KEY.
Schlüsseldefinition
Der Standardschlüssel DEFAULT KEY
umfasst alle nicht numerischen Felder des Strukturtyps.
Beispiel für explizite Definition:
" Tabellentyp für sortierte Tabelle mit Schlüsselfeld anz_seiten
TYPES: ltt_buchregal_sortiert TYPE SORTED TABLE OF lst_buch
WITH NON-UNIQUE KEY anz_seiten.
Wichtig sind folgende Einschänkungen zur Schlüsseleindeutigkeit:
Tabellenart | Schlüsseleindeutigkeit | Beschreibung |
---|---|---|
STANDARD | NON-UNIQUE | Kann mehrere Einträge mit identischen Schlüsselwerten enthalten |
SORTED | UNIQUE und NON-UNIQUE | Eindeutigkeit der Schlüsselwerte ist optional |
HASHED | UNIQUE | Einträge müssen eindeutige Schlüsselwerte tragen |
Erstellen von internen Tabellen
Beispiel für implizite Definition einer internen Tabells aus einer Struktur:
DATA: lt_buchregal TYPE TABLE OF lst_buch
Beispiele für explizite Definition eines Tabellentyps und anschließende definition einer internen Tabelle. Der Tabelelntyp könnte auch im Dictionary definiert werden:
" Tabellentyp für Standard-Tabelle
TYPES: ltt_buchregal TYPE STANDARD TABLE OF lst_buch " Definition lst_buch siehe oben
WITH NON-UNIQUE DEFAULT KEY.
DATA: lt_buchregal TYPE ltt_buchregal.
Für die Bearbeitung einer internen Tabelle wird eine Arbeitsstruktur, manchmal auch als Workarea bezeichnet, benötigt.
Eine Arbeitsstruktur kann mittels LIKE LINE OF auf Basis einer internen Tabelle erstellt werden:
" Definition einer internen Tabelle auf Basis eines Tabellentyps
DATA: lt_biblio TYPE ltt_biblio.
" Erstellung einer passenden Struktur
DATA: ls_biblio LIKE LINE OF lt_biblio.
Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) mit TYPE erstellt werden:
" Gegeben ist, dass zbiblio eine Datenbanktabelle ist
DATA: gs_bibio TYPE zbiblio
" Allgemeine Formulierung
DATA: <wa> TYPE <dbtab>
Eine interne Tabelle kann mit TYPE TABLE OF auf Basis einer Datenbanktabelle erstellt werden:
" Interne Tabelle auf Basis transp. Tabelle
DATA: lt_cust TYPE TABLE OF zcust.
Lesen von Daten
Gesamte interne Tabelle lesen
Früher: Interne Tabellen wurden mit Kopfzeilen angelegt (Stichwort ABAP-Anweisung OCCURS).
Das heißt, die Kopfzeile ist die Arbeitsstruktur in die die Daten der Tabelle geschrieben werden.
Diese Arbeitsstruktur ist namensgleich mit dem Tabellenkorpus. Damit war eine verkürzte Notation möglich:
" Verkürzte Notation
LOOP AT <itab>.
" Code
ENDLOOP.
Empfehlung heute: Interne Tabellen ohne Kopfzeilen anlegen. Damit ist der Weg für optimierten Zugriff auf die Tabelleninhalte frei.
" Lange Notation
LOOP AT <itab> INTO <wa>.
" Code
ENDLOOP.
Einzelne Datensätze lesen
Einzelne Datensätze aus interner Tabelle in eine Arbeitsstruktur lesen.
READ TABLE <itab> INTO <wa> WITH [TABLE] KEY <s1> = <f1>.
Einfügen / Schreiben von Daten
Datensätze können in interne Tabellen mit INSERT oder APPEND geschrieben werden.
" Anhängen von Daten am Ende der internen Tabelle
APPEND <wa> TO <itab>
Bei SORTED- oder HASHED-Tabellen kann auch INSERT verwendet werden:
INSERT <wa> INTO TABLE <itab>
Abhängig von Tabellenart passiert bei INSERT jedoch etwas anderes:
Tabellenart | Erläuterung |
---|---|
STANDARD | Datensatz wird angehängt |
SORTED | Datensatz wird laut Schlüsselfeldern sortiert eingefügt |
HASHED | Datensatz wird laut schlüssel eingefügt, jedoch nicht sortiert |
Sortieren
Interne Tabellen können sortiert werden:
SORT <itab> BY <spalte> [ASCENDING|DESCENDING]
Dies passiert auf dem Applikationsserver.
Leeren von internen Tabellen
CLEAR initialisiert interne Tabellen ohne den Speicher frei zu geben:
" Leeren der Tabelle und der Arbeitsstruktur
CLEAR lt_itab.
CLEAR ls_itab.
" Optional in einem Kettensatz
CLEAR: lt_itab, ls_itab.
FREE gibt den von der Tabelle beanspruchten Speicher frei:
FREE: lt_itab, ls_itab.
Wenn die Tabelle nach einem FREE erneut angesprochen wird, wird der Speicher wieder reserviert, was Performance kostet.