Anfang des Inhaltsbereichs

Interne Tabellentypen Dokument im Navigationsbaum lokalisieren

In diesem Abschnitt wird auf die Definition programmlokaler interner Tabellen eingegangen. Interne Tabellen können aber auch programmübergreifend als Datentypen im ABAP Dictionary angelegt werden.

Wie alle programmlokalen Datentypen werden auch interne Tabellen mit der Anweisung TYPES definiert. Wenn nicht mit dem TYPE- oder LIKE-Zusatz auf bekannte Tabellentypen Bezug genommen wird, dient die TYPES-Anweisung der Konstruktion einer programmlokalen, neuen internen Tabelle:

TYPES <t> TYPE|LIKE <tabkind> OF <linetype> [WITH <key>]
          [INITIAL SIZE <n>].

Hinter TYPE bzw. LIKE steht hier kein Verweis auf einen bekannten Datentyp, sondern der Typkonstruktor:

<tabkind> OF <linetype> [WITH <key>]

Der Typkonstruktor definiert Tabellenart <tabkind>, Zeilentyp <linetype> und Schlüssel <key> der internen Tabelle <t>.

Optional kann mit dem Zusatz INITIAL SIZE der initiale Hauptspeicherbedarf beeinflußt werden.

Tabellenart

Für die Tabellenart <tabkind> können folgende Angaben gemacht werden:

Diese Grafik wird im zugehörigen Text erklärt

Generische Tabellenarten

INDEX TABLE

für das Anlegen eines generischen Tabellentyps mit Index-Zugriffen

ANY TABLE

für das Anlegen eines beliebigen generischen Tabellentyps

Datentypen, die mit den generischen Tabellenarten definiert werden, können zur Zeit nur zur Typisierung von Feldsymbolen und von Schnittstellenparametern in Prozeduren verwendet werden. Der generische Typ INDEX TABLE faßt Standard-Tabellen und sortierte Tabellen zusammen, auf denen Index-Zugriffe erlaubt sind. An solcherart typisierte Feldsymbole oder Schnittstellenparameter können keine Hash-Tabellen übergeben werden. Der generische Typ ANY TABLE faßt alle Tabellenarten zusammen. An solcherart typisierte Feldsymbole oder Schnittstellenparameter können alle Tabellen übergeben werden. Auf solchen Feldsymbolen oder Parametern sind dann aber auch nur Operationen erlaubt, die für alle Tabellenarten möglich sind, also keine Index-Zugriffe.

Vollständig spezifizierte Tabellenarten

STANDARD TABLE oder kurz TABLE

für das Anlegen einer Standard-Tabelle.

SORTED TABLE

für das Anlegen einer sortierten Tabelle.

HASHED TABLE

für das Anlegen einer Hash-Tabelle.

Die vollständig spezifizierten Tabellenarten legen fest, wie bei Schlüsseloperationen auf die Einträge einer internen Tabelle zugegriffen wird, nämlich mit linearer Suche bei Standard-Tabellen, mit binärer Suche bei sortierten Tabellen und mit einem Hash-Algorithmus bei Hash-Tabellen.

Zeilentyp

Für den Zeilentyp <linetype> kann

Alle Zeilen der internen Tabelle erhalten die vollständig spezifizierten technischen Eigenschaften des angegebenen Datentyps.

Schlüssel

Für den Schlüssel <key> können folgende Angaben gemacht werden:

[UNIQUE|NON-UNIQUE] KEY <col1>... <col n>

Bei Tabellen mit strukturiertem Zeilentyp können alle Komponenten <coli> als Schlüsselfelder erklärt werden, die selber weder interne Tabellen sind noch interne Tabellen enthalten. Die einzelnen Schlüsselfelder können selbst geschachtelte Strukturen sein. Die Unterstrukturen werden beim Schlüsselzugriff komponentenweise aufgelöst. Die Reihenfolge der Schlüsselfeldangabe wird beachtet.

[UNIQUE|NON-UNIQUE] KEY table_line

Bei Tabellen, mit elementarem Zeilentyp (C, D, F, I, N, P, T, X) kann so die gesamte Zeile als Schlüssel definiert werden. Bei Tabellen, deren Zeilentyp wieder eine Tabelle ist, führt die Anweisung zu einem Syntaxfehler. Bei Tabellen mit strukturiertem Zeilentyp ist es zwar möglich, die gesamte Zeile als Schlüssel anzugeben, man sollte sich aber im klaren sein, die gesamte Zeile bei strukturierten Zeilentypen in der Regel kein geeigneter Schlüssel ist.

[UNIQUE|NON-UNIQUE] DEFAULT KEY

Es werden die Felder des Standardschlüssels als Schlüsselfelder definiert. Bei strukturiertem Zeilentyp ist der Standardschlüssel aus allen Spalten der internen Tabelle aufgebaut, die einen zeichenartigen Typ (C, D, T, N, X, STRING, XSTRING) haben. Bei internen Tabellen mit geschachtelter Zeilenstruktur ergibt sich der Standard-Schlüssel durch Linearisierung der Zeilenstruktur. Bei elementarem Zeilentyp ist der Standardschlüssel die Zeile selbst. Bei elementaren Tabellen, deren Zeilentyp wieder ein interne Tabelle ist, ist der Standardschlüssel leer.

Die Angabe des Schlüssels ist optional. Ohne Angabe des Schlüssels wird ein generischer Tabellentyp mit beliebigem Schlüssel definiert, der zur Zeit nur zur Typisierung von Feldsymbolen und von Schnittstellenparametern in Prozeduren verwendet werden kann (Ausnahme: Besonderheiten bei Standard-Tabellen).

Die optionalen Zusätze UNIQUE bzw. NON-UNIQUE legen fest, ob der Schlüssel eindeutig oder nicht eindeutig ist, also ob eine interne Tabelle doppelte Einträge enthalten kann oder nicht. Ohne Angabe von UNIQUE bzw. NON-UNIQUE ist der Tabellentyp bezüglich der Eindeutigkeit des Schlüssels generisch, also nur für Typisierungen verwendbar. Dabei ist aber zu beachten, daß bei gleichzeitiger Angabe der Tabellenart folgende Einschränkungen gelten:

Initialer Hauptspeicherbedarf

Der initiale Hauptspeicherbedarf eines internen Tabellenobjekts kann schon bei der Definition des Datentyps mit dem Zusatz

INITIAL SIZE <n>

beeinflußt werden. Diese Größe gehört nicht zum Datentyp der internen Tabelle und hat keinen Einfluß auf eine Typüberprüfung. Mit obigem Zusatz kann man Speicherplatz für <n> Tabellenzeilen während der Deklaration eines entsprechenden Tabellenobjekts vorbelegen.

Wenn der initiale Hauptspeicher beim Füllen der Tabelle erschöpft ist, wird zusätzlicher Platz in der doppelten Größe des initialen Bereichs angelegt, sofern diese nicht die Grenze von 8 Kilobyte übersteigt. Weitere Bereiche werden dann bei Bedarf mit einer konstanten Größe in der Größenordnung von 12 Kilobyte angelegt.

Die Bestimmung des initialen Hauptspeicherbedarfs kann in den meisten Fällen dem System überlassen werden. Beim erstmaligen Füllen der internen Tabelle wird nur wenig Speicher belegt. Der belegte Platz entspricht je nach Zeilenbreite einer Angabe von 16 <= <n> <= 100.

Die Angabe eines konkreten Werts <n> ist nur dann sinnvoll, wenn die Anzahl der Einträge in der Tabelle von vornherein feststeht und der initiale Hauptspeicherbedarf möglichst passend dimensioniert werden soll (Ausnahme: Ranglisten beim Tabellenzeilen anhängen). Dies kann insbesondere bei tiefen internen Tabellen wichtig sein, bei denen die inneren Tabellen nur wenige (z.B. nicht mehr als 5 Einträge) enthalten.

Um übergroße Speicheranforderungen zu vermeiden, werden große Werte für <n> wie folgt behandelt: Der größtmögliche Wert für <n> ergibt sich aus 8 Kilobyte geteilt durch die Zeilenlänge. Wird <n> größer angegeben, ersetzt das System den Wert von <n> so, daß das Produkt n ´ Zeilenbreite in der Größenordnung von 12 Kilobyte liegt.

Beispiel

TYPES: BEGIN OF line,
         column1 TYPE i,
         column2 TYPE i,
         column3 TYPE i,
       END OF LINE.

TYPES itab TYPE SORTED TABLE OF line WITH UNIQUE KEY column1.

Es wird ein Tabellentyp ITAB definiert. Die Tabellenart ist eine sortierte Tabelle, der Zeilentyp ist die Struktur LINE und der eindeutige Schlüssel ist durch die Komponente COLUMN1 definiert.

Beispiel

TYPES vector TYPE HASHED TABLE OF i WITH UNIQUE KEY table_line.

TYPES: BEGIN OF line,
column1 TYPE i,
column2 TYPE i,
column3 TYPE i,
END OF line.

TYPES itab TYPE SORTED TABLE OF line WITH UNIQUE KEY column1.

TYPES: BEGIN OF deepline,
field TYPE c,
table1 TYPE vector,
table2 TYPE itab,
END OF deepline.

TYPES deeptable TYPE STANDARD TABLE OF deepline
WITH DEFAULT KEY.

Es wird ein Tabellentyp VECTOR der Tabellenart Hash-Tabelle, dem elementaren Zeilentyp I und der gesamten Zeile als eindeutigem Schlüssel definiert. Der zweite Tabellentyp entspricht dem vorherigem Beispiel. Die Struktur DEEPLINE enthält diese internen Tabellen als Komponenten. Der Tabellentyp DEEPTABLE hat den Zeilentyp DEEPLINE. Elemente dieser internen Tabelle sind also selbst interne Tabellen. Der Schlüssel ist der Standardschlüssel, also die Spalte FIELD. Der Schlüssel ist nicht eindeutig, da die Tabellenart eine Standardtabelle ist.

 

 

Ende des Inhaltsbereichs