Die Konstruktorausdrücke VALUE und NEW sind fundamentale Features des modernen ABAP (ab 7.40). Sie ermöglichen die Inline-Erstellung von Daten und Objekten ohne separate Deklaration und Zuweisung.
VALUE – Daten inline erstellen
Der VALUE-Operator erstellt Werte für Strukturen, interne Tabellen und elementare Datentypen.
Syntax
VALUE <typ>( [Komponenten/Zeilen] )VALUE #( [Komponenten/Zeilen] ) " Typ wird abgeleitetBeispiele für VALUE
1. Struktur erstellen
TYPES: BEGIN OF ty_person, name TYPE string, age TYPE i, city TYPE string, END OF ty_person.
" Klassisch (alt)DATA: ls_person TYPE ty_person.ls_person-name = 'Max'.ls_person-age = 30.ls_person-city = 'Berlin'.
" Modern mit VALUEDATA(ls_person2) = VALUE ty_person( name = 'Max' age = 30 city = 'Berlin').
" Mit Typ-Ableitung (#)DATA: ls_target TYPE ty_person.ls_target = VALUE #( name = 'Anna' age = 25 city = 'München' ).2. Interne Tabelle erstellen
TYPES: ty_names TYPE TABLE OF string WITH EMPTY KEY.
" Tabelle mit Werten füllenDATA(lt_names) = VALUE ty_names( ( `Anna` ) ( `Bernd` ) ( `Clara` )).
" Strukturierte TabelleDATA(lt_persons) = VALUE ty_persons( ( name = 'Max' age = 30 city = 'Berlin' ) ( name = 'Anna' age = 25 city = 'München' ) ( name = 'Peter' age = 35 city = 'Hamburg' )).3. Bestehende Tabelle erweitern (BASE)
DATA: lt_numbers TYPE TABLE OF i.
lt_numbers = VALUE #( ( 1 ) ( 2 ) ( 3 ) ).
" Weitere Zeilen hinzufügen mit BASElt_numbers = VALUE #( BASE lt_numbers ( 4 ) ( 5 ) ( 6 )).
" Ergebnis: 1, 2, 3, 4, 5, 64. Verschachtelte Strukturen
TYPES: BEGIN OF ty_address, street TYPE string, zip TYPE string, city TYPE string, END OF ty_address,
BEGIN OF ty_customer, id TYPE i, name TYPE string, address TYPE ty_address, END OF ty_customer.
DATA(ls_customer) = VALUE ty_customer( id = 1 name = 'Müller GmbH' address = VALUE #( street = 'Hauptstraße 1' zip = '10115' city = 'Berlin' )).5. Initialwert mit VALUE
DATA: ls_person TYPE ty_person.
" Struktur initialisieren (alle Felder auf Initialwert)ls_person = VALUE #( ).
" Nur bestimmte Felder setzen, Rest initialls_person = VALUE #( name = 'Test' )." age und city sind 0 bzw. leer6. OPTIONAL und DEFAULT
DATA: lt_customers TYPE TABLE OF ty_customer.
" Zeile suchen - bei Nicht-Treffer: InitialwertDATA(ls_found) = VALUE #( lt_customers[ id = 999 ] OPTIONAL ).
" Bei Nicht-Treffer: StandardwertDATA(ls_default) = VALUE #( lt_customers[ id = 999 ] DEFAULT VALUE #( id = 0 name = 'Unbekannt' )).7. VALUE mit LET (lokale Hilfsvariablen)
DATA(ls_result) = VALUE ty_person( LET prefix = 'Dr. ' suffix = ' (CEO)' IN name = prefix && 'Max Müller' && suffix age = 45 city = 'Frankfurt')." name = 'Dr. Max Müller (CEO)'8. FOR in VALUE (Tabellenaufbau)
" Tabelle aus anderer Tabelle erstellenDATA(lt_names_only) = VALUE ty_names( FOR ls_p IN lt_persons ( ls_p-name )).
" Mit BedingungDATA(lt_adults) = VALUE ty_persons( FOR ls_p IN lt_persons WHERE ( age >= 18 ) ( ls_p )).
" Mit TransformationDATA(lt_upper_names) = VALUE ty_names( FOR ls_p IN lt_persons ( to_upper( ls_p-name ) )).NEW – Objekte inline erstellen
Der NEW-Operator erstellt Instanzen von Klassen oder anonyme Datenobjekte.
Syntax
NEW <klassenname>( [Konstruktorparameter] )NEW #( [Konstruktorparameter] ) " Typ wird abgeleitetBeispiele für NEW
1. Objekt erstellen
CLASS lcl_calculator DEFINITION. PUBLIC SECTION. METHODS: add IMPORTING iv_a TYPE i iv_b TYPE i RETURNING VALUE(rv_result) TYPE i.ENDCLASS.
CLASS lcl_calculator IMPLEMENTATION. METHOD add. rv_result = iv_a + iv_b. ENDMETHOD.ENDCLASS.
" Klassisch (alt)DATA: lo_calc TYPE REF TO lcl_calculator.CREATE OBJECT lo_calc.
" Modern mit NEWDATA(lo_calc2) = NEW lcl_calculator( ).
" Direkt verwendenDATA(lv_sum) = NEW lcl_calculator( )->add( iv_a = 5 iv_b = 3 ).2. Objekt mit Konstruktorparametern
CLASS lcl_person DEFINITION. PUBLIC SECTION. METHODS: constructor IMPORTING iv_name TYPE string iv_age TYPE i. DATA: mv_name TYPE string READ-ONLY, mv_age TYPE i READ-ONLY.ENDCLASS.
CLASS lcl_person IMPLEMENTATION. METHOD constructor. mv_name = iv_name. mv_age = iv_age. ENDMETHOD.ENDCLASS.
" Objekt mit Parametern erstellenDATA(lo_person) = NEW lcl_person( iv_name = 'Max Müller' iv_age = 30).
WRITE: / lo_person->mv_name, lo_person->mv_age.3. Anonyme Datenobjekte (Datenreferenzen)
" Integer-Referenz erstellenDATA(lr_int) = NEW i( 42 ).WRITE: / lr_int->*. " 42
" String-ReferenzDATA(lr_string) = NEW string( 'Hallo Welt' ).
" Struktur-ReferenzDATA(lr_person) = NEW ty_person( name = 'Test' age = 25).4. Tabellen in Objekten
" Interne Tabelle als ReferenzDATA(lr_table) = NEW ty_persons( ( name = 'A' age = 20 ) ( name = 'B' age = 30 )).
LOOP AT lr_table->* INTO DATA(ls_p). WRITE: / ls_p-name.ENDLOOP.5. Typ-Ableitung mit
DATA: lo_obj TYPE REF TO lcl_calculator.
" Typ wird von lo_obj abgeleitetlo_obj = NEW #( ).
" Bei MethodenparameternMETHODS: process IMPORTING io_calc TYPE REF TO lcl_calculator.
" Aufrufprocess( io_calc = NEW #( ) ).CONV – Typkonvertierung
Der CONV-Operator konvertiert Werte in einen anderen Typ:
" String zu IntegerDATA(lv_int) = CONV i( '42' ).
" Integer zu StringDATA(lv_str) = CONV string( 42 ).
" DezimalzahlDATA(lv_dec) = CONV decfloat34( '123.456' ).
" Bei BerechnungenDATA(lv_result) = CONV f( 10 / 3 ). " 3.333...Vergleich: Klassisch vs. Modern
" === KLASSISCH ===
" StrukturDATA: ls_person TYPE ty_person.ls_person-name = 'Max'.ls_person-age = 30.
" TabelleDATA: lt_persons TYPE ty_persons, ls_temp TYPE ty_person.ls_temp-name = 'Max'.ls_temp-age = 30.APPEND ls_temp TO lt_persons.
" ObjektDATA: lo_calc TYPE REF TO lcl_calculator.CREATE OBJECT lo_calc.
" === MODERN ===
" StrukturDATA(ls_person) = VALUE ty_person( name = 'Max' age = 30 ).
" TabelleDATA(lt_persons) = VALUE ty_persons( ( name = 'Max' age = 30 )).
" ObjektDATA(lo_calc) = NEW lcl_calculator( ).Wichtige Hinweise / Best Practice
VALUE #()leitet den Typ aus dem Kontext ab – verwenden Sie es bei Zuweisungen.VALUE typ()gibt den Typ explizit an – nötig beiDATA()Inline-Deklarationen.BASEerhält bestehende Tabelleninhalte beim Erweitern.NEW #()für Objekterzeugung,VALUE #()für Daten.- Kombinieren Sie mit
FORfür mächtige Tabellenoperationen. OPTIONALgibt Initialwert zurück,DEFAULTeinen spezifischen Wert.LETermöglicht lokale Hilfsvariablen innerhalb des Ausdrucks.- Nutzen Sie
CONDundCORRESPONDINGfür weitere Konstruktorausdrücke.