12.4 Interne Standardtabelle füllen 

In diesem Abschnitt wollen wir uns damit beschäftigen, mit welchen Techniken interne Tabellen gefüllt werden. Für die verschiedenen Arten von Tabellen stehen unterschiedliche Methoden zur Verfügung, die Sie im Folgenden kennenlernen.
12.4.1 Interne Tabelle mit Workarea füllen 

Als Erstes füllen wir eine mit modernem ABAP erzeugte interne Tabelle ohne Kopfzeile. Hierfür verwenden wir eine Workarea. Zwar gibt es auch Techniken, mit denen der direkte Zugriff auf Datensätze innerhalb einer internen Tabelle möglich ist, doch normalerweise greifen Sie nicht direkt auf die Zeilen einer internen Tabelle zu. Es ist komfortabler und sicherer, mit einer eigens dazu angelegten Workarea zu arbeiten: In dieser können Sie den Datensatz, den Sie in die interne Tabelle einfügen oder ändern möchten, in Ruhe vorbereiten und dann in einem Schritt in die Tabelle übernehmen. Da die Workarea von der internen Tabelle technisch getrennt ist, erfolgt die Verknüpfung von Workarea und interner Tabelle nur explizit durch die in ihnen erstellten Anweisungen im Programm – und nicht etwa als impliziter Automatismus wie bei Tabellen mit Kopfzeile.
[zB] Beispiel 1: Zeilenweise Füllung einer internen Tabelle
Sie möchten den Inhalt der Datenbanktabelle ZTEILNEHMER02 zeilenweise in die namensgleichen Felder der Workarea WA_ITAB03 übertragen. Die Workarea kann immer nur den Inhalt einer Zeile aufnehmen. Von dort aus soll die interne Tabelle ITAB03 gefüllt werden.
Zum besseren Verständnis folgen zunächst wieder die Beschreibung der internen Tabelle ITAB03, der zugeordneten Typen und deren Workareas. Der Zeilentyp der internen Tabelle wird durch die drei Felder BEZEICHNUNG, PREIS und MAXTEIL beschrieben.
TYPES: BEGIN OF zeile03_typ,
bezeichnung TYPE zteilnehmer02-zzkurstitel,
preis TYPE zteilnehmer02-tkurspreis,
maxteil TYPE i,
END OF zeile03_typ.
Der Tabellentyp der internen Tabelle ist eine Standardtabelle mit nicht eindeutigem Schlüssel:
TYPES itab03_typ TYPE STANDARD TABLE OF zeile03_typ.
Das Datenobjekt »interne Tabelle« wird deklariert über:
DATA itab03 TYPE itab03_typ.
Das Datenobjekt »Workarea« wird deklariert mit:
DATA wa_itab03 TYPE zeile03_typ.
Unter diesen Voraussetzungen übertragen Sie in einer SELECT-Schleife jede Zeile der Datenbanktabelle in den explizit angelegten Arbeitsbereich der Datenbanktabelle WA_ZTEILNEHMER02; anschließend werden die Feldinhalte zugewiesen. Beispielsweise erhält das Feld WA_ITAB03-BEZEICHNUNG der Workarea für die interne Tabelle den Inhalt des Feldes WA_ZTEILNEHMER02 aus der Workarea der Datenbanktabelle.
Nachdem die Workarea der internen Tabelle vollständig gefüllt ist, werden mit der APPEND-Anweisung die Feldinhalte der Workarea an die interne Tabelle ITAB03 angehängt:
SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02.
wa_itab03-bezeichnung = wa_zteilnehmer02-zzkurstitel.
wa_itab03-preis = wa_zteilnehmer02-tkurspreis.
APPEND wa_itab03 TO itab03.
ENDSELECT.
[zB] Beispiel 2: Inhalte namensgleicher Felder einfügen
Sie möchten den Inhalt der Datenbanktabelle wieder zeilenweise und die Inhalte der namensgleichen Felder in die interne Tabelle übertragen.
Der Weg führt wieder über den Arbeitsbereich der Datenbanktabelle und die Workarea der internen Tabelle. Der Zeilentyp für die interne Tabelle ITAB01 besteht aus den beiden Feldern ZZKURSTITEL und TKURSPREIS; beide Felder beziehen sich in ihrer Deklaration auf die entsprechenden Felder der Datenbanktabelle. Damit sind auch die Feldeigenschaften in beiden Tabellen gleich.
TYPES: BEGIN OF zeile01_typ,
zzkurstitel TYPE zteilnehmer02-zzkurstitel,
tkurspreis TYPE zteilnehmer02-tkurspreis,
END OF zeile01_typ.
Der Tabellentyp, der für die interne Tabelle vorgesehen ist, soll wieder eine Standardtabelle mit dem Zeilentyp ZEILE01_TYP sein:
TYPES itab01_typ TYPE STANDARD TABLE OF zeile01_typ.
Die interne Tabelle ITAB01 wird ohne Kopfzeile deklariert:
DATA itab01 TYPE itab01_typ.
Die notwendige Workarea deklarieren Sie mit:
DATA wa_itab01 TYPE zeile01_typ.
Im Verarbeitungsteil füllen Sie in einer SELECT-Schleife zunächst die Workarea der Datenbanktabelle WA_ZTEILNEHMER02. Dort stehen noch alle Feldinhalte einer Datenbankzeile. Dann übertragen Sie die namensgleichen Felder von der Workarea der Datenbanktabelle in die der internen Tabelle.
[ ! ] Prüfung nur auf Namensgleichheit hin
Beachten Sie an dieser Stelle, dass das System nur auf Namensgleichheit hin prüft, nicht auf die Gleichheit der Feldeigenschaften hin. In den meisten Fällen empfiehlt es sich deshalb, die Feldeigenschaften über das ABAP Dictionary zu verknüpfen. Nur dann ist auch für die Zukunft gewährleistet, dass die Feldeigenschaften der internen Tabelle und deren Workarea mit den Feldeigenschaften der Datenbanktabelle übereinstimmen.
Die Inhalte aller namensgleichen Felder stehen anschließend aktualisiert in der Workarea WA_ITAB01. Von dort aus werden sie mit der APPEND-Anweisung an den Rumpf der internen Tabelle angehängt:
SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02.
MOVE-CORRESPONDING wa_zteilnehmer02 TO wa_itab01.
APPEND wa_itab01 TO itab01.
ENDSELECT.
[zB] Beispiel 3: Blockweises Einfügen der Zeilen
Im Gegensatz zu den beiden vorangegangenen Beispielen sollen die Zeilen der Datenbanktabelle hier nicht zeilenweise, sondern blockweise in die interne Tabelle übertragen werden. Wie erwähnt, ist das blockweise Übertragen die schnellste Möglichkeit, die interne Tabelle zu füllen.
Obwohl die Arbeitsbereiche von Datenbanktabelle und interner Tabelle bei der blockweisen Übertragung überhaupt nicht angesprochen werden, sollen deren Deklarationen, auch zum besseren Verständnis der nachfolgenden Beispiele, hier beschrieben werden.
Der Typ einer Zeile sei deklariert mit:
TYPES BEGIN OF zeile02_typ.
INCLUDE TYPE zeile01_typ.
TYPES minteiln TYPE i.
TYPES END OF zeile02_typ.
Diese Typdeklaration ist nicht als Kettensatz dargestellt. Die INCLUDE-Anweisung ist eine eigenständige ABAP-Anweisung und kein Zusatz zur TYPES-Anweisung. Der Datentyp ZEILE01_TYP entspricht dem Typ aus Beispiel 2. Zusätzlich enthält der Typ noch das Feld MINTEILN für die Mindestanzahl von Kursteilnehmern.
Der Datentyp für die Tabelle sei eine Standardtabelle mit dem Zeilentyp ZEILE02_TYP:
TYPES itab02_typ TYPE STANDARD TABLE OF zeile02_typ.
Die interne Tabelle wird ohne Kopfzeile deklariert über:
DATA itab02 TYPE itab02_typ.
Die Workarea für die interne Tabelle entspricht ebenfalls dem Zeilentyp ZEILE02_TYP:
DATA wa_itab02 TYPE zeile02_typ.
Im Verarbeitungsteil des Reports füllen Sie die interne Tabelle mit einem einzigen Kommando. Alle Inhalte von namensgleichen Feldern werden blockweise – am Stück und mit einem Mal – von der Datenbanktabelle in die interne Tabelle übertragen:
SELECT * FROM zteilnehmer02
INTO CORRESPONDING FIELDS OF TABLE itab02.
Das System prüft wiederum nur auf die Namensgleichheit von Feldern hin. Denken Sie auch daran, dass es sich bei dieser Schreibweise nicht um eine Struktur handelt, wie beispielsweise um eine Schleife. Deshalb gibt es in diesem Fall auch keine Anweisung ENDSELECT.
12.4.2 Interne Tabelle mit Kopfzeile füllen 

Wie schon erwähnt, ist diese Technik in modernem ABAP obsolet und führt im Kontext von ABAP Objects zu Syntaxfehlern. Sie wird hier dennoch vorgestellt, weil Sie bei Ihrer Arbeit mit dem SAP-System immer wieder mit älteren Programmen konfrontiert sein werden, in denen diese Technik noch verwendet wird. Schließlich sollen Sie in der Lage sein, auch diese Programme zu verstehen, im Fehlerfall zu korrigieren und vielleicht eines Tages zu modernisieren und auf ABAP Objects umzustellen.
Der Weg sowohl zum Schreiben als auch zum Lesen führt bei diesen internen Tabellen immer über die Kopfzeile. In der Kopfzeile wird beim Füllen der internen Tabelle eine Zeile komplett aufgebaut und dann an den Tabellenrumpf angehängt. Beim Lesen von Datensätzen aus dem Tabellenrumpf ist der Weg umgekehrt. Der zu verarbeitende Datensatz wird komplett in die Kopfzeile gestellt und von dort aus weiterverarbeitet.
Für das Füllen der internen Tabelle gibt es mehrere Möglichkeiten. Exemplarisch beschreiben wir im Folgenden, wie Sie die Tabelle Satz für Satz füllen.
[zB] Beispiel 4: Interne Tabelle satzweise füllen
Sie möchten den Inhalt der Datenbanktabelle ZTEILNEHMER02 in einer Schleife satzweise über den Arbeitsbereich der Datenbanktabelle und über die Kopfzeile der internen Tabelle in die Rumpfzeilen der internen Tabelle ITAB03 übertragen und anhängen.
Die interne Tabelle sollte folgendermaßen deklariert sein:
DATA: BEGIN OF itab03 OCCURS 0,
bezeichnung TYPE zteilnehmer02-zzkurstitel,
preis TYPE zteilnehmer02-tkurspreis,
maxteil TYPE i VALUE 10,
END OF itab03.
Bei zwei Feldern der internen Tabelle verweisen Sie damit auf die Attribute von Feldern einer Datenbanktabelle. Die Feldnamen BEZEICHNUNG und PREIS in der internen Tabelle sollen sich zunächst von den Feldnamen der Datenbanktabelle unterscheiden. In der Praxis kann es durchaus Gründe geben, Feldnamen in internen Tabellen abweichend zu benennen, aber hier dient es hauptsächlich dem Verständnis und der Demonstration. Das dritte Feld MAXTEIL für die maximale Teilnehmerzahl deklarieren Sie als Integer und versorgen es mit dem Startwert 10.
Das Füllen der internen Tabelle erfolgt in einer SELECT-Schleife. Jeder Satz wird in die Workarea der Datenbanktabelle ZTEILNEHMER02 gestellt.
SELECT * FROM zteilnehmer02 INTO wa_zteilnehmer02.
* Anweisungsblock interne Tabelle füllen
ENDSELECT.
Anschließend werden die Felder in der Kopfzeile der internen Tabelle mit Werten versorgt. Dies geschieht durch die Zuweisung von Feldwerten aus der Workarea der Datenbanktabelle. Bei einer anderen Aufgabenstellung wären hier entsprechend andere Verarbeitungsschritte einzusetzen.
* Anweisungsblock interne Tabelle füllen
itab03-bezeichnung = wa_zteilnehmer02-zzkurstitel.
itab03-preis = wa_zteilnehmer02-tkurspreis.
Das Feld ITAB03-BEZEICHNUNG erhält den Inhalt des Feldes WA_ZTEILNEHMER02-ZZKURSTITEL und das Feld ITAB03-PREIS den Inhalt des Feldes WA_ZTEILNEHMER02-TKURSPREIS. Das dritte Feld der internen Tabelle ist durch seinen Startwert bereits vorbelegt und soll aus Vereinfachungsgründen so übernommen werden. Am Ende dieses Prozesses ist die Kopfzeile der internen Tabelle vollständig gefüllt. Der neue Datensatz ist sozusagen fertig.
Nun fehlt noch ein kleiner, aber wichtiger Schritt: Der Inhalt der Kopfzeile muss in den Tabellenrumpf übertragen werden. Bei einer Standardtabelle mit Standardschlüssel wird der neue Datensatz als neue Zeile an den Tabellenrumpf angehängt.
Dies erfolgt ebenfalls in der SELECT-Schleife im Anweisungsblock zum Füllen der internen Tabelle mithilfe folgender Anweisung:
APPEND itab03.
Beachten Sie, dass hier im Gegensatz zum ersten Beispiel nicht die Workarea angegeben wird, aus der der Datensatz an die interne Tabelle angehängt wird. Bei der hier verwendeten Variante der APPEND-Anweisung für interne Tabellen mit Kopfzeile wird implizit die gleichnamige Kopfzeile verwendet, die an die Tabelle gekoppelt ist.
Im Stress der Arbeit und wegen der irreführenden Namensgleichheit von interner Tabelle und Kopfzeile wird diese Anweisung leicht vergessen. Man wundert sich dann, warum die interne Tabelle leer bleibt nur die Kopfzeile den Inhalt des letzten Verarbeitungsschrittes hat. Auch diese leicht verwirrende Eigenschaft von Tabellen mit Kopfzeile ist ein Grund, weshalb das Konstrukt heute obsolet ist.
Ähnlich wie beim Arbeiten mit einer Workarea können Sie die interne Tabelle auch durch Zuweisung namensgleicher Felder oder blockweise befüllen. Wir möchten jedoch an dieser Stelle dem obsoleten Konstrukt interner Tabellen mit Kopfzeile nicht zu viel Raum geben und verzichten darauf, diese Möglichkeiten im Detail auszuführen. Stattdessen verweisen wir auf das »Codebeispiel zu ITAB mit Kopfzeile« in Abschnitt 12.8.