12.3 Interne Standardtabelle anlegen 

Betrachten wir zunächst die reguläre Anlage einer Standardtabelle.
12.3.1 Objektorientierte Schreibweise mit Workarea 

In der modernen Schreibweise gibt es eine klare Trennung zwischen Datenobjekt – das konkret mit Werten belegt wird – und Datentyp. Ein Datentyp ist eine Strukturbeschreibung, die beim Deklarieren eines Datenobjektes als Muster dient und in mehreren Datenobjekten wiederverwendet werden kann. Datentypen können elementar (ein einzelnes Feld) oder komplex (aus anderen Datentypen zusammengesetzt) sein. Ist ein Datentyp komplex, d. h. aus anderen Datentypen zusammengesetzt, können diese wiederum elementar oder komplex sein. Dieses Zusammensetzen im »Baukastenprinzip« lässt sich beliebig fortsetzen, sodass Sie komplexe Datentypen erstellen können, die wiederum aus Datentypen zusammengesetzt sind. Erst hierdurch ist es beispielsweise möglich, eine interne Tabelle anzulegen, die eine interne Tabelle enthält etc.
[+] Vorteile der Abstraktion
Der Vorteil dieser Abstraktion liegt zum einen in der Modularisierung und Wiederverwendbarkeit solcher Datentypen und zum anderen darin, dass hierdurch alle zusammengehörenden Datenobjekte auch in zusammengehörende Arbeitsbereiche gelegt und verarbeitet werden können.
Um eine interne Tabelle zu deklarieren, benötigen Sie für die objektorientierte Denk- und Schreibweise vier Stufen, die häufig, aber nicht zwingend in dieser Reihenfolge deklariert werden:
-
Deklaration der Tabelle
Zunächst sieht das Durchgehen dieser Stufen nach viel Aufwand aus; dies kann allerdings täuschen: Bei großen und komplexen Programmen kommt der Vorteil zum Tragen, dass die Typdeklarationen von Tabellen und Tabellenzeilen wiederverwendbar sind. Sie können für weitere Tabellen oder für Schnittstellen verwendet werden, und Sie können sie nach Bedarf schachteln und in neue Typen integrieren.
Bezogen auf unser erstes Beispiel, würden Sie für die Deklaration der internen Tabelle ITAB01 zunächst den Zeilentyp ZEILE01_TYP mit der Anweisung TYPES deklarieren:
TYPES: BEGIN OF zeile01_typ,
zzkurstitel TYPE zteilnehmer02-zzkurstitel,
tkurspreis TYPE zteilnehmer02-tkurspreis,
END OF zeile01_typ.
Der Zeilentyp besteht aus zwei Feldern, ZZKURSTITEL und TKURSPREIS, bei deren Deklaration wiederum auf das ABAP Dictionary verwiesen wird. Die Deklaration der Felder, genau genommen der Feldtypen, erfolgt hier ebenfalls mit der TYPES- und nicht mit der DATA-Anweisung. Die TYPES-Anweisung ist im Beispiel als Kettensatz aufgebaut.
Der Tabellentyp wird ebenfalls mit der TYPES-Anweisung deklariert. Für den Tabellentyp ITAB01_TYP soll gelten, dass es sich immer um einen Standardtabellentyp mit dem Zeilentyp ZEILE01_TYPE handelt. Eine Standardtabelle hat immer einen nicht eindeutigen Schlüssel; der Zusatz für den Schlüssel kann deshalb entfallen.
Ebenso entfallen kann in den meisten Fällen der Zusatz für den initialen Speicherplatz der internen Tabelle. Dieser ist nur sinnvoll, wenn Sie die voraussichtliche Anzahl von Zeilen bei diesem Tabellentyp bereits in diesem Stadium genauer schätzen könnten und die richtige Schätzung auch in irgendeiner Weise relevant für eine gute Performance Ihres Programms wäre, was nur in seltenen Sonderfällen bei sehr großen oder vielfach erzeugten Tabellen der Fall ist. Der Zusatz hierfür lautet INITIAL SIZE n. Er kann entfallen, wenn für n der Wert 0 eingesetzt wird und Sie es wieder dem System überlassen möchten, wie es den Speicherplatz verwaltet.
Der Zusatz STANDARD TABLE OF ist erforderlich, um die Tabellenart festzulegen. Wenn Sie den Typ ITAB01_TYP für eine Standardtabelle mit der Zeilenstruktur vom Typ ZEILE01_TYP anlegen möchten, schreiben Sie:
TYPES itab01_typ TYPE STANDARD TABLE OF zeile01_typ.
Nur zum Vergleich und zum besseren Verständnis ein kurzer Hinweis auf die Deklaration einer internen sortierten Tabelle mit eindeutigem Schlüssel: Angenommen, die interne Tabelle soll eine sortierte Tabelle mit eindeutigem Schlüssel werden, dann müssten Sie den Tabellentyp anders deklarieren. Der Tabellentyp wäre dann vom Typ SORTED TABLE. Den eindeutigen Schlüssel, im Beispiel das Feld ZZKURSTITEL, deklarieren Sie dann mit dem Zusatz WITH UNIQUE KEY:
TYPES itab01_typ TYPE SORTED TABLE OF zeile01_typ
WITH UNIQUE KEY zzkurstitel.
[ ! ] Eindeutigkeit des Schlüssels
Beachten Sie, dass der Schlüssel in diesem Beispiel wirklich eindeutig sein muss. Es dürfen keine zwei Zeilen mit demselben Schlüssel, d. h. mit denselben Feldinhalten der Schlüsselfelder vorkommen. Der Schlüssel selbst kann aus mehreren Komponenten bestehen. Sie werden als Feldliste – getrennt durch ein Leerzeichen – geschrieben.
Damit wären die erforderlichen Typdeklarationen abgeschlossen. Wie erwähnt, sind diese Typdeklarationen für andere interne Tabellen und Typdeklarationen wiederverwendbar. Leider sieht man die Vorteile nicht bei kleinen Beispielprogrammen, sondern erst in der Praxis.
Was noch fehlt, sind die Deklarationen der internen Tabelle selbst und die der zugeordneten Workarea.
Die Tabelle ITAB01 deklarieren Sie ohne Kopfzeile mit der Anweisung:
DATA itab01 TYPE itab01_typ.
Den Arbeitsbereich für die Tabelle ITAB01 deklarieren Sie mithilfe des Zeilentyps ZEILE01_TYP:
DATA wa_itab01 TYPE zeile01_typ.
Die Workarea ist technisch nicht an die interne Tabelle gebunden, sondern Sie können sie beliebig verwenden. Sie müssen selbst durch die geeigneten Anweisungen dafür sorgen, dass die Workarea zum richtigen Zeitpunkt die richtigen Inhalte hat. Ob Sie diese Inhalte dann verwenden, um interne Tabellen zu verarbeiten oder zu anderen Zwecken, ist Ihre Entscheidung.
12.3.2 Obsolete Schreibweise mit Kopfzeile 

Die obsolete Schreibweise, um eine interne Tabelle zu deklarieren, verwendet ausschließlich die DATA-Anweisung. Die TYPES-Anweisung wird nicht verwendet, denn die dargestellte Trennung zwischen Datentyp und Datenobjekt entfällt; ebenso gibt es keine von der internen Tabelle unabhängige Workarea, sondern eine an die Tabelle gekoppelte Kopfzeile erfüllt diese Funktion. Mit Zusätzen der DATA-Anweisung bilden Sie eine Struktur, die Beginn und Ende der internen Tabelle kennzeichnet. Dazwischen stehen die Felder, die eine Zeile beschreiben. Struktur und Felder werden als Kettensatz mit der DATA-Anweisung deklariert.
Möchten Sie z. B. eine interne Tabelle mit dem Namen ITAB01 anlegen, die Felder für die Kursbezeichnung und den Kurspreis haben soll, deklarieren Sie diese folgendermaßen:
DATA: BEGIN OF itab01 OCCURS 0,
zzkurstitel LIKE zteilnehmer02-zzkurstitel,
tkurspreis LIKE zteilnehmer02-tkurspreis,
END OF itab01.
Mit der Anweisung DATA: BEGIN OF itab01 deklarieren Sie den Strukturanfang, d. h. den Beginn der internen Tabelle. Durch den Doppelpunkt (:) nach der DATA-Anweisung leiten Sie den Kettensatz ein. Der Zusatz BEGIN OF kennzeichnet den Beginn der internen Tabelle ITAB01. Die Deklaration der internen Tabelle ITAB01 wird mit der DATA-Anweisung und dem Zusatz END OF beendet.
Nach dem Namen der internen Tabelle geben Sie mit dem Zusatz OCCURS eine Schätzung ab, wie viele Zeilen die Tabelle voraussichtlich haben wird. Das System reserviert daraufhin einen entsprechenden Speicherbereich. Ist der reservierte Bereich zu groß, verschwenden Sie Ressourcen; ist der reservierte Platz zu klein, legt das System automatisch Erweiterungen im Arbeitsspeicher an. Die erste Erweiterung wird mit der doppelten Größe des reservierten Speichers, maximal aber mit acht Kilobytes angelegt; jede folgende Erweiterung mit zwölf Kilobytes. Mit dem Zusatz OCCURS 0 überlassen Sie es dem System, wie groß es den ersten, initialen Speicherbereich anlegt. In der Praxis können Sie häufig mit dieser Option arbeiten.
Der Zusatz OCCURS hat noch eine andere wesentliche Bedeutung: Er unterscheidet bei der Deklaration eine interne Tabelle von einer flachen Struktur bzw. einem Arbeitsbereich. Fehlt der Zusatz, ist es die Deklaration für einen Arbeitsbereich, d. h. eine Workarea; ist er vorhanden, legt das System eine interne Standardtabelle mit Kopfzeile an.
Die DATA-Anweisung als Kettensatz wird mit dem Doppelpunkt begonnen, und jede Anweisung wird mit einem Komma beendet; nur die letzte Anweisung der Kette wird mit einem Punkt abgeschlossen. Im angeführten Codebeispiel beendet die Anweisung END OF itab01., die Struktur nach den Felddeklarationen.
In der Struktur stehen die Anweisungen für die Deklarationen der Tabellenfelder der internen Tabelle. Sie beschreiben eine Zeile. Der Zeilentyp könnte wiederum durch eine Struktur oder durch eine Mischform beschrieben sein. Für die Deklaration der einzelnen Felder gelten die allgemeinen Regeln der DATA-Anweisung.
[+] Namensgleiche Felder
Für die Arbeit mit internen Tabellen kann es von Vorteil sein, wenn Felder mit gleicher Bedeutung namensgleich mit den jeweiligen Feldern der Datenbanktabellen sind. Aus technischen Gründen ist dies allerdings nicht notwendig. Dies gilt analog auch für die Attribute der namensgleichen Felder. Beispiele hierzu finden Sie im folgenden Abschnitt.