ABAP - Inline Deklarationen (DATA)
Anlegen von Datentypen zur Laufzeit und im Coding? Nun kein Problem mehr mit Inline Deklarationen.
Inhaltsverzeichnis
Wie sahen für dich bisher viele Programme aus, wenn du zum ersten Mal in fremden Code geschaut hast? Wahrscheinlich bist du über viele Zeilen von Variablendefintionen am Anfang jedes Programms, Forms oder Methode gestolpert. Bevor die eigentliche Bussiness Logik begann wurden zuerst einmal alle Variablen aufgelistet, die es für dieses Stück Code benötigt.
Hier gab es zum Glück die ersten großen Anpassungen und der Befehl DATA wurde einmal ordentlich überarbeitet und ABAP typisch implementiert.
Datendefinitionen - ALT
Wie wurden bisher Variablen definiert, dazu ein kurzes Beispiel:
Wir lesen Daten aus einer Tabelle, merken uns die Anzahl für eine spätere Ausgabe und verarbeiten die Daten im Anschluss, wobei wir uns den Zeilenindex merken, da wir vielleicht noch Einträge entfernen möchten, die mit bestimmten Kriterien nicht übereinstimmen:
" Definition der Variablen im Kopf
DATA:
lt_address TYPE STANDARD TABLE OF adrc,
ls_address TYPE adrc,
ld_tabix TYPE sytabix,
ld_count TYPE i.
" ... Lesen der Daten
" Anzahl merken
ld_count = LINES( lt_address ).
" Verarbeitung
LOOP AT lt_address INTO ls_address.
" Index merken
ld_tabix = sy-tabix.
" ... Logik
ENDLOOP.
Wenn wir nun in dieser Routine noch mehr Datenbankzugriffe und Verarbeitungen implementieren, wir der DATA Teil immer länger werden, was das Ganze etwas unübersichtlicher macht.
Datendefinition - NEU
Die Definition wurde nun soweit angepasst das Variablen zum Aufrufpunkt definiert werden können. Das gleiche Beispiel von oben haben wir nun auf die neue Welt umgestellt, die Ermittlung der Daten erzeugt die Tabelle, deshalb fehlt dort die DATA Anweisung. Die Erstellung von internen Variablen bei SELECTs ist aber noch ein zusätzliches Thema mit dem wir uns noch beschäftigen werden.
" ... Lesen der Daten
" Anzahl merken
DATA(ld_count) = LINES( lt_address ).
" Verarbeitung
LOOP AT lt_address INTO DATA(ls_address).
" Index merken
DATA(ld_tabix) = sy-tabix.
" ... Logik
ENDLOOP.
Alle Variablen werden zur Laufzeit erzeugt und ermitteln sich aus dem Quelldatentyp:
- LINES gibt einen Integer zurück, damit bekommt ld_count den Typen i
- im LOOP bekommt ls_address den Typ der Tabelle lt_adress
- ld_tabix bekommt den Typen der Variable aus der Zuweisung
Verwendung
Nach dem Schlüsselwort DATA und FIELD-SYMBOL wird direkt eine Klammer gesetzt und die Variable dazwischen definiert. Anders als bei bisherigen Befehlen werden keine Leerzeichen zwischen den Klammern verwendet. Wie du schon richtig vermutet hast, funktioniert das Ganze auch mit Feldsymbolen, die man nun zur Laufzeit erzeugen kann.
" Loops
LOOP AT lt_address ASSIGNING FIELD-SYMBOL(<ls_address>).
ENDLOOP.
LOOP AT lt_address REFERENCE INTO DATA(lr_address).
ENDLOOP.
" Assigns
ASSIGN COMPONENT 'COUNTRY' OF STRUCTURE ls_address TO FIELD-SYMBOL(<ld_country>).
Voraussetzung für die Verarbeitung ist aber die vollständige Typisierung der Quellvariable, damit aus dem Kontext heraus der Datentyp abgeleitet werden kann.
Gültigkeit
Die Variable ist ab der Zeile der Definition gültig und verwendebar. Variablen die im LOOP oder in einem IF erzeugt werden, sind auch außerhalb dieses Ausdrucks gültig. Sollten als mehrere Loops hintereinander die selbe Variable verwenden wollen, muss diese nur in der ersten Schleife definiert werden.
Hinweis: Hier solltest du aufpassen, wenn du Logik verschiebst, dass deine abhängige Datendeklaration noch verfügbar und an der richtigen Stelle im Coding ist.
Quelle:
SAP Blog Inline Deklaration