Interne Tabellen (ABAP): Unterschied zwischen den Versionen

Aus MattWiki
Keine Bearbeitungszusammenfassung
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.


== Anlegen von Strukturen, Tabellentypen und internen Tabellen ==
== Aufbau von internen Tabellen ==
Der für die interne Tabelle benötigte Tabellentyp kann global im Dictionary oder lokal im ABAP Code definiert werden.
 
Beispiel für implizite Definition:<syntaxhighlight lang="abap">
DATA: gt_buchregal TYPE TABLE OF gst_buch
</syntaxhighlight>Beispiele für explizite Definition:<syntaxhighlight lang="abap">
" Struktur für Buch
TYPES: BEGIN OF gst_buch,
        buch_titel type string,
        anz_seiten type int4,
      END OF gst_buch.
 
" Tabellentyp für Standard-Tabelle
TYPES: gtt_buchregal TYPE STANDARD TABLE OF gst_buch
      WITH NON-UNIQUE DEFAULT KEY.
 
DATA: gt_buchregal TYPE gtt_buchregal.
</syntaxhighlight>Dabei könnte die Struktur <code>gst_buch</code>und der Tabellentyp <code>gtt_buchregal</code> auch im Dictionary definiert werden.
 
Eine Struktur kann auch auf Basis einer internen Tabelle erstellt werden:
 
<syntaxhighlight lang="abap">
" Definition einer internen Tabelle auf Basis eines Tabellentyps
" una anschließende Erstellung einer passenden Struktur
DATA: gt_biblio TYPE gtt_biblio.
      gs_biblio LIKE LINE OF gt_biblio. 
</syntaxhighlight>Alternativ kann eine Struktur auf Basis einer transparenten Tabelle erstellt werden:<syntaxhighlight lang="abap">
" Wenn zbiblio eine transp. Tabelle im Dictionary ist
DATA: gs_bibio TYPE zbiblio
 
" Allgemeine Formulierung
DATA: <wa> TYPE <transp_table>
</syntaxhighlight>Alternativ kann die interne Tabelle auf Basis von eine transparenten Tabelle angelegt werden:<syntaxhighlight lang="abap">
" Interne Tabelle auf Basis transp. Tabelle
DATA: lt_cust TYPE TABLE OF zcust.
</syntaxhighlight>
 
== Aufbau von Tabellentypen ==
Interne Tabellen benötigen einen Tabellentyp. Ein Tabellentyp kann per Code oder im Dictionary definiert werden. Er definiert:
Interne Tabellen benötigen einen Tabellentyp. Ein Tabellentyp kann per Code oder im Dictionary definiert werden. Er definiert:
* '''Zeilentyp''', z. B. ein Strukturtyp
* '''Zeilentyp''', z. B. ein Strukturtyp
Zeile 123: Zeile 86:
|Einträge müssen eindeutige Schlüsselwerte tragen
|Einträge müssen eindeutige Schlüsselwerte tragen
|}
|}
== Erstellen von internen Tabellen ==
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
TYPES: BEGIN OF gst_buch,
        buch_titel type string,
        anz_seiten type int4,
      END OF gst_buch.
</syntaxhighlight>Beispiel für implizite Definition einer internen Tabells aus einer Struktur:<syntaxhighlight lang="abap">
DATA: gt_buchregal TYPE TABLE OF gst_buch
</syntaxhighlight>Beispiele für explizite Definition eines Tabellentyps. Dieser könnte auch im Dictionary definiert werden:<syntaxhighlight lang="abap">
" Tabellentyp für Standard-Tabelle
TYPES: gtt_buchregal TYPE STANDARD TABLE OF gst_buch  " Definition gst_buch siehe oben
      WITH NON-UNIQUE DEFAULT KEY.
DATA: gt_buchregal TYPE gtt_buchregal.
</syntaxhighlight>Für die Bearbeitung einer internen Tabelle wird ein Strukturtyp, manchmal auch als Workarea bezeichnet, benötigt.
Eine Struktur kann auf Basis einer internen Tabelle folgendermaßen erstellt werden:
<syntaxhighlight lang="abap">
" Definition einer internen Tabelle auf Basis eines Tabellentyps
DATA: gt_biblio TYPE gtt_biblio.
" Erstellung einer passenden Struktur
DATA: gs_biblio LIKE LINE OF gt_biblio. 
</syntaxhighlight>Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) erstellt werden:<syntaxhighlight lang="abap">
" Gegeben ist, dass zbiblio eine Datenbanktabelle ist
DATA: gs_bibio TYPE zbiblio
" Allgemeine Formulierung
DATA: <wa> TYPE <dbtab>
</syntaxhighlight>Erstellen eine interne Tabella auf Basis einer Datenbanktabelle:<syntaxhighlight lang="abap">
" Interne Tabelle auf Basis transp. Tabelle
DATA: lt_cust TYPE TABLE OF zcust.
</syntaxhighlight>


== Lesen von Daten ==
== Lesen von Daten ==

Version vom 4. September 2016, 19:49 Uhr

Interne Tabellen sind Tabellen, die im Hauptspeicher gehalten werden. Im Gegensatz dazu werden Datenbanktabellen im Datenbanksystem abgelegt.

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: gtt_buchregal_sortiert TYPE SORTED TABLE OF gst_buch
       WITH NON-UNIQUE DEFAULT KEY.

" Tabellentyp für hashed Tabelle
TYPES: gtt_buchregal_hashed TYPE HASHED TABLE OF gst_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: gtt_buchregal_sortiert TYPE SORTED TABLE OF gst_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

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 gst_buch,
         buch_titel type string,
         anz_seiten type int4,
       END OF gst_buch.

Beispiel für implizite Definition einer internen Tabells aus einer Struktur:

DATA: gt_buchregal TYPE TABLE OF gst_buch

Beispiele für explizite Definition eines Tabellentyps. Dieser könnte auch im Dictionary definiert werden:

" Tabellentyp für Standard-Tabelle
TYPES: gtt_buchregal TYPE STANDARD TABLE OF gst_buch   " Definition gst_buch siehe oben
       WITH NON-UNIQUE DEFAULT KEY.

DATA: gt_buchregal TYPE gtt_buchregal.

Für die Bearbeitung einer internen Tabelle wird ein Strukturtyp, manchmal auch als Workarea bezeichnet, benötigt.

Eine Struktur kann auf Basis einer internen Tabelle folgendermaßen erstellt werden:

" Definition einer internen Tabelle auf Basis eines Tabellentyps
DATA: gt_biblio TYPE gtt_biblio.

" Erstellung einer passenden Struktur
DATA: gs_biblio LIKE LINE OF gt_biblio.

Alternativ kann eine Struktur auf Basis einer Datenbanktabelle (transparenten Tabelle) erstellt werden:

" Gegeben ist, dass zbiblio eine Datenbanktabelle ist
DATA: gs_bibio TYPE zbiblio

" Allgemeine Formulierung
DATA: <wa> TYPE <dbtab>

Erstellen eine interne Tabella auf Basis einer Datenbanktabelle:

" 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

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