
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 demTYPE - oder LIKE -Zusatz auf bekannte Tabellentypen Bezug genommen wird, dient dieTYPES -Anweisung der Konstruktion einer programmlokalen, neuen internen Tabelle:
TYPES type TYPE|LIKE tabkind OF linetype [WITH key] [INITIAL SIZE n].
HinterTYPE bzw.LIKE steht hier kein Verweis auf einen bekannten Datentyp, sondern der Typkonstruktor:
tabkind OF linetype [WITH key]
Der Typkonstruktor definiert Tabellenarttabkind , Zeilentyp linetype und Schlüsselkey der internen Tabelle type .
Optional kann mit dem ZusatzINITIAL SIZE der initiale Hauptspeicherbedarf beeinflußt werden.
Für die Tabellenarttabkind können folgende Angaben gemacht werden:
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 TypINDEX TABLE fasst 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 TypANY TABLE fasst 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.
STANDARD TABLE oder kurzTABLE
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.
Für den Zeilentyplinetype kann
Alle Zeilen der internen Tabelle erhalten die vollständig spezifizierten technischen Eigenschaften des angegebenen Datentyps.
Für den Schlüsselkey können folgende Angaben gemacht werden:
Bei Tabellen mit strukturiertem Zeilentyp können alle Komponenten col 1 … col n 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.
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.
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ätzeUNIQUE 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, dass bei gleichzeitiger Angabe der Tabellenart folgende Einschränkungen gelten:
Der initiale Hauptspeicherbedarf eines internen Tabellenobjekts kann schon bei der Definition des Datentyps mit dem Zusatz
INITIAL SIZE n
beeinflusst 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 Wertsn 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ürn wie folgt behandelt: Der größtmögliche Wert fürn ergibt sich aus 8 Kilobyte geteilt durch die Zeilenlänge. Wirdn größer angegeben, ersetzt das System den Wert vonn so, dass das Produkt n ´ Zeilenbreite in der Größenordnung von 12 Kilobyte liegt.
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 Tabellentypitab definiert. Die Tabellenart ist eine sortierte Tabelle, der Zeilentyp ist die Strukturline und der eindeutige Schlüssel ist durch die Komponentecolumn1 definiert.
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 Tabellentypvector der Tabellenart Hash-Tabelle, dem elementaren Zeilentypi und der gesamten Zeile als eindeutigem Schlüssel definiert. Der zweite Tabellentyp entspricht dem vorherigem Beispiel. Die Strukturdeepline enthält diese internen Tabellen als Komponenten. Der Tabellentypdeeptable 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.