Rheinwerk < openbook > SAP-Wissen aus erster Hand
SAP-Wissen aus erster Hand.
 
Inhaltsverzeichnis
Vorwort zur vierten Auflage
1 ABAP und die ersten Schritte im SAP-System
2 ABAP Dictionary
3 Programmieren im ABAP Editor
4 Felder und Berechnungen
5 Modifikation von Zeichenketten
6 Debugging von Programmen
7 Modifikation von transparenten Datenbanktabellen
8 Rechnen mit Datum und Zeit, Mengen und Währungen
9 Mit Daten in einer Datenbanktabelle arbeiten
10 Programmablaufsteuerung und logische Ausdrücke
11 Selektionsbildschirme
12 Interne Tabellen
13 Modularisierung von Programmen
14 Weiterführende Themen
A Icons auf einen Blick
B Abkürzungsverzeichnis
C Die Autoren
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 23 KB

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Einstieg in ABAP von Karl-Heinz Kühnhauser, Thorsten Franz
Buch: Einstieg in ABAP

Einstieg in ABAP
Pfeil 12 Interne Tabellen
Pfeil 12.1 Sinn und Zweck interner Tabellen
Pfeil 12.2 Aufbau und Arten von internen Tabellen
Pfeil 12.3 Interne Standardtabelle anlegen
Pfeil 12.3.1 Objektorientierte Schreibweise mit Workarea
Pfeil 12.3.2 Obsolete Schreibweise mit Kopfzeile
Pfeil 12.4 Interne Standardtabelle füllen
Pfeil 12.4.1 Interne Tabelle mit Workarea füllen
Pfeil 12.4.2 Interne Tabelle mit Kopfzeile füllen
Pfeil 12.5 Interne Tabelle zeilenweise verarbeiten
Pfeil 12.5.1 Interne Tabelle mit Workarea verarbeiten
Pfeil 12.5.2 Interne Tabelle mit Kopfzeile verarbeiten
Pfeil 12.6 Inhalte von internen Tabellen löschen
Pfeil 12.6.1 Workareas und interne Tabellen mit Workarea löschen
Pfeil 12.6.2 Interne Tabellen mit Kopfzeile löschen
Pfeil 12.7 Codebeispiel zu ITAB mit Workarea
Pfeil 12.8 Codebeispiel zu ITAB mit Kopfzeile
 
Zum Seitenanfang

12.4    Interne Standardtabelle füllen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 
Zum Seitenanfang

12.4.1    Interne Tabelle mit Workarea füllen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 
Zum Seitenanfang

12.4.2    Interne Tabelle mit Kopfzeile füllen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Einstieg in ABAP Einstieg in ABAP
Jetzt Buch bestellen

 Buchempfehlungen
Zum Rheinwerk-Shop: SAP – Der technische Einstieg
SAP – Der technische Einstieg


Zum Rheinwerk-Shop: ABAP Objects – Das umfassende Handbuch
ABAP Objects – Das umfassende Handbuch


Zum Rheinwerk-Shop: ABAP-Entwicklung für SAP S/4HANA
ABAP-Entwicklung für SAP S/4HANA


Zum Rheinwerk-Shop: Kundeneigene Erweiterungen mit ABAP
Kundeneigene Erweiterungen mit ABAP


Zum Rheinwerk-Shop: Schrödinger programmiert ABAP
Schrödinger programmiert ABAP


Zum Rheinwerk-Shop: Migration nach SAP S/4HANA
Migration nach SAP S/4HANA


Zum Rheinwerk-Shop: Design Thinking mit SAP
Design Thinking mit SAP


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2020
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 
[Rheinwerk]

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern