ABAP DATA-Anweisung: Variablen deklarieren, Syntax und Beispiele

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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 wie MARA-MATNR, ein globaler Typ aus der SE11 oder ein lokaler Typ).
  • LIKE <anderes_datenobjekt>: Ältere Methode, sollte in neuem Code möglichst durch TYPE ersetzt werden. Die Variable erbt Datentyp und Eigenschaften eines anderen, bereits deklarierten Datenobjekts (z. B. einer anderen Variablen, einer Strukturkomponente, eines Dictionary-Feldes wie MARA-MATNR).
  • LENGTH <länge>: Optionale explizite Längenangabe für bestimmte Typen (C, N, X, P).
  • DECIMALS <dezimalstellen>: Notwendig für Typ P (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, wenn VALUE 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 D
DATA(lo_instance) = NEW zcl_meine_klasse( ). " lo_instance erhält Typ REF TO zcl_meine_klasse
SELECT 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 0
DATA message TYPE string VALUE `Hallo`. " String mit Startwert
DATA 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.