Die DATA
-Anweisung ist die fundamentale Anweisung in ABAP zur Deklaration von Variablen. Variablen sind benannte
Datenobjekte (Speicherbereiche), deren Inhalt bzw. Wert während der Programmlaufzeit verändert werden kann. Sie sind
das Kernstück der Datenverarbeitung in ABAP, da sie es ermöglichen, Informationen zu speichern, zu lesen, zu berechnen
und zu manipulieren.
Im Gegensatz zu Konstanten (deklariert mit CONSTANTS
), deren Wert nach der Deklaration feststeht, sind Variablen
flexibel. Jede Variable besitzt einen Datentyp, der festlegt, welche Art von Daten sie speichern kann (z. B. Text, Zahl,
Datum) und wie viel Speicherplatz sie benötigt.
Syntax
Die Deklaration von Variablen mit DATA
kann auf verschiedene Weisen erfolgen:
1. Deklaration einer einzelnen Variablen
DATA <variablenname> TYPE <datentyp> [LENGTH <länge>] [DECIMALS <dezimalstellen>] [VALUE <startwert> | IS INITIAL].
<variablenname>
: Der Name der Variablen (muss den ABAP-Namenskonventionen entsprechen).TYPE <datentyp>
: Bevorzugte Methode. Gibt den Datentyp an (z. B.I
,P
,C
,STRING
,D
,T
,F
,XSTRING
, ein Dictionary-Typ wieMARA-MATNR
, ein globaler Typ aus der SE11 oder ein lokaler Typ).LIKE <anderes_datenobjekt>
: Ältere Methode, sollte in neuem Code möglichst durchTYPE
ersetzt werden. Die Variable erbt Datentyp und Eigenschaften eines anderen, bereits deklarierten Datenobjekts (z. B. einer anderen Variablen, einer Strukturkomponente, eines Dictionary-Feldes wieMARA-MATNR
).LENGTH <länge>
: Optionale explizite Längenangabe für bestimmte Typen (C
,N
,X
,P
).DECIMALS <dezimalstellen>
: Notwendig für TypP
(gepackte Zahl), um die Anzahl der Nachkommastellen zu definieren.VALUE <startwert>
: Optional. Weist der Variablen direkt bei der Deklaration einen Anfangswert zu.VALUE IS INITIAL
: Optional. Weist explizit den typspezifischen Initialwert zu. Dies ist das Standardverhalten, wennVALUE
fehlt.
2. Deklaration mehrerer Variablen (Kettenanweisung)
DATA: <var1> TYPE <typ1> [VALUE <wert1>], <var2> LIKE <feld2>, <var3> TYPE <typ3>, ... .
Mit einem Doppelpunkt nach DATA
können mehrere Variablen, durch Kommas getrennt, deklariert werden. Die Anweisung
endet mit einem Punkt.
3. Deklaration einer Strukturvariablen
DATA: BEGIN OF <struktur_name>, <komponente1> TYPE <typ1> [VALUE <wert1>], <komponente2> LIKE <feld2>, ... END OF <struktur_name>.
Definiert eine Variable, die eine Gruppe von Komponenten (Feldern) enthält.
4. Deklaration einer internen Tabelle
DATA <tabelle> TYPE [STANDARD | SORTED | HASHED] TABLE OF <zeilentyp> [WITH <schlüsseldefinition>] [INITIAL SIZE <n>].
Definiert eine interne Tabelle, eine dynamische Datenstruktur zur Haltung mehrerer Zeilen desselben Typs (
<zeilentyp>
).
5. Deklaration einer Referenzvariablen
DATA <ref_variable> TYPE REF TO <typ> | <klasse> | <interface> | DATA.
Definiert eine Variable, die keine Daten direkt enthält, sondern auf andere Datenobjekte oder Instanzen von Klassen/Interfaces zeigt (ähnlich einem Zeiger).
Initialisierung / Standardwerte
Wenn bei der Deklaration mit DATA
kein VALUE
-Zusatz angegeben wird, wird die Variable automatisch mit dem *
typspezifischen Initialwert* initialisiert:
- Numerische Typen (
I
,P
,F
):0
- Zeichenartige Typen (
C
,N
,STRING
): Leerzeichen (C
,N
) oder leerer String (STRING
) - Datum/Zeit (
D
,T
):'00000000'
bzw.'000000'
- Byteartige Typen (
X
,XSTRING
): Hexadezimal 0 (X'00'
) oder leerer Byte-String (XSTRING
) - Referenzen (
REF TO
):NULL
-Referenz (zeigt auf nichts)
Inline-Deklaration (Moderner ABAP-Stil >= 7.40)
Eine sehr gebräuchliche, moderne Alternative ist die Inline-Deklaration. Dabei wird die Variable direkt an der Stelle deklariert, an der ihr zum ersten Mal ein Wert zugewiesen wird:
DATA(<neue_variable>) = <ausdruck>.
" Beispiele:DATA(lv_datum) = sy-datum. " lv_datum erhält automatisch den Typ DDATA(lo_instance) = NEW zcl_meine_klasse( ). " lo_instance erhält Typ REF TO zcl_meine_klasseSELECT SINGLE * FROM t001 WHERE bukrs = '0001' INTO @DATA(ls_t001). " ls_t001 erhält Typ T001
Der Typ der Variablen wird vom Compiler automatisch aus dem Kontext (z. B. dem Ergebnis des Ausdrucks auf der rechten
Seite oder der SELECT
-Anweisung) abgeleitet. Dies reduziert den Deklarationsaufwand und hält die Deklaration nahe an
der Verwendung.
Gültigkeitsbereich (Scope)
Der Ort der DATA
-Deklaration bestimmt, wo die Variable gültig (sichtbar und verwendbar) ist:
- Global: Deklaration im globalen Deklarationsteil eines Programms (REPORT, FUNCTION-POOL, CLASS-POOL). Die Variable ist im gesamten Programm/Objekt gültig.
- Lokal: Deklaration innerhalb einer Prozedur (METHOD, FUNCTION, FORM). Die Variable ist nur innerhalb dieser Prozedur gültig.
Beispiele
1. Einfache Variablen
DATA counter TYPE i. " Integer, Initialwert 0DATA message TYPE string VALUE `Hallo`. " String mit StartwertDATA customer_id TYPE n LENGTH 10. " Numerischer Text, 10 Stellen, Initialwert '0000000000'DATA valid_until TYPE d. " Datum, Initialwert '00000000'DATA company_name TYPE name1. " Dictionary-Typ (z.B. aus KNA1)DATA total_amount LIKE bseg-wrbtr. " Typ von Feld WRBTR aus Struktur BSEG (ältere Syntax)
2. Kettenanweisung
DATA: first_name TYPE string, last_name TYPE string, age TYPE i VALUE 30, city TYPE string.
3. Strukturvariable
DATA: BEGIN OF person, name TYPE string, geb_dat TYPE d, " Geburtsdatum plz TYPE ad_pstcd1, " Postleitzahl (Dictionary-Typ) ort TYPE string, END OF person.
person-name = 'Mustermann'.person-geb_dat = '19900101'.
4. Interne Tabelle
TYPES: BEGIN OF ty_material_s, matnr TYPE matnr, maktx TYPE maktx, END OF ty_material_s.
DATA materials TYPE STANDARD TABLE OF ty_material_s WITH EMPTY KEY.DATA user_list TYPE HASHED TABLE OF syuname WITH UNIQUE KEY table_line.
5. Referenzvariable
DATA alv_grid TYPE REF TO cl_gui_alv_grid.DATA data_ref TYPE REF TO data.
6. Inline-Deklaration in Aktion
DATA(lv_user) = sy-uname.WRITE: / 'Aktueller Benutzer:', lv_user.
LOOP AT materials INTO DATA(ls_material). " ls_material wird inline deklariert (Typ: ty_material_s) WRITE: / ls_material-matnr, ls_material-maktx.ENDLOOP.
TRY. DATA(lo_calculator) = NEW zcl_simple_calculator( ). " lo_calculator ist REF TO zcl_simple_calculator DATA(lv_result) = lo_calculator->add( val1 = 5 val2 = 10 ). " lv_result ist I (falls Methode I zurückgibt) WRITE: / 'Ergebnis:', lv_result. CATCH cx_root INTO DATA(lx_error). " lx_error ist REF TO cx_root WRITE: / 'Fehler:', lx_error->get_text( ).ENDTRY.
Zusammenfassend: Die DATA
-Anweisung ist unverzichtbar für das Arbeiten mit veränderlichen Daten in ABAP. Die
moderne Inline-Deklaration DATA(...)
vereinfacht die Variablendefinition erheblich und ist heute Standard in vielen
Entwicklungsszenarien.