Mit ABAP 7.40 wurden zahlreiche neue Sprachkonstrukte eingeführt, die den Code kompakter, flexibler und lesbarer machen. Besonders Inline-Deklarationen, neue Operatoren und verbesserte Tabellenverarbeitung vereinfachen viele gängige Programmieraufgaben. In diesem Artikel werfen wir einen Blick auf einige dieser neuen Features, darunter DATA() für Inline-Deklarationen, CONV für Typkonvertierungen, REDUCE für Berechnungen über interne Tabellen und viele mehr. Durch diese Verbesserungen wird nicht nur der Entwicklungsaufwand reduziert, sondern auch die Wartbarkeit des Codes erheblich erhöht.
Wenn du noch tiefer in die Welt der Konstruktor-Ausdrücke und -Operatoren in ABAP 7.40 eintauchen möchtest, findest Du in im Artikel „Die wichtigsten Konstruktor Operatoren in ABAP“ eine umfassende Erklärung mit zahlreichen praktischen Beispielen. Ich zeige dir nicht nur die Syntax und Funktionsweise, sondern auch frühere Alternativen, damit du die Vorteile der neuen Operatoren optimal nutzen kannst.
Inline-Deklaration – DATA
Ab ABAP 7.40 SP2
Mit Inline-Deklarationen können Variablen genau dort definiert werden, wo sie erstmals verwendet werden, also dort, wo ihnen zum ersten Mal ein Wert zugewiesen wird. In vielen Fällen ergibt sich der Datentyp einer Variablen bereits aus dem Kontext, was den Code kompakter und lesbarer macht.
Mit DATA(<Variable>) kann eine Variable direkt an der Stelle definiert werden, an der sie benötigt wird.
LOOP AT lt_tabelle INTO DATA(ls_struktur). ... ENDLOOP.
Der Hauptvorteil der Inline-Deklaration liegt neben dem kompakteren Code in der größeren Flexibilität. Wenn sich die Feldliste ändert, wird der Datentyp automatisch angepasst. Besonders bei JOIN-Operationen gibt es oft keine geeignete Strukturdefinition.
SELECT * FROM spfli INTO TABLE @DATA(lt_spfli).
Field-Symbole können ebenfalls mit Inline-Deklarationen einem bestehenden Speicherbereich zugewiesen werden.
LOOP AT ... ASSIGNING FIELD-SYMBOL(<fs_struktur>). READ TABLE ... ASSIGNING FIELD-SYMBOL(<fs_struktur2>) ...
Konvertierung Datentyp – CONV
Ab ABAP 7.40
Mit dem CONV-Operator lassen sich Datentypen unkompliziert konvertieren. Das ist besonders hilfreich bei Methodenparametern, wenn der Inhalt einer Variablen passt, aber der Datentyp nicht.
DATA lv_text2 TYPE char255. DATA(lv_xstr2) = cl_abap_codepage=>convert_to( source = CONV #( lv_text2 ) ). methode( TEXT = CONV #( sy-datum ) ).
Referenzvariablen mit CAST hoch- und runtercasten
Ab ABAP 7.40
Früher wurde ein Upcast durch eine einfache Zuweisung (=) durchgeführt, der Downcast mit ?=. Dies erforderte oft eine Hilfsvariable. Der CAST-Operator macht dies kompakter:
DATA: lo_unterklasse TYPE REF TO zcl_unterklasse, lo_oberklasse TYPE REF TO zcl_oberklasse. lo_oberklasse = CAST #( lo_unterklasse ). DATA(lo_oberklasse2) = CAST zcl_oberklasse( lo_unterklasse ).
Fallunterscheidung – COND und SWITCH
Ab ABAP 7.40 SP2
Diese Konstruktor-Ausdrücke ähneln der CASE-Anweisung in SQL.
cl_demo_output=>display( |Hallo { SWITCH #( lv_alter WHEN 'F' THEN 'Frau' WHEN 'M' THEN 'Herr' ELSE '' ) } { lv_name } | ).
Komplexere Bedingungen mit COND:
cl_demo_output=>display( |Der Status ist { COND #( WHEN lv_prio > 3 AND lv_faellig_bis <= SY-DATUM THEN 'Kritisch'. WHEN lv_prio > 2 THEN 'Mittel'. ELSE 'Niedrig' ) }| ).
Werte aus internen Tabellen berechnen – REDUCE
Ab ABAP 7.40
Der REDUCE-Operator berechnet Werte durch Iteration über interne Tabellen.
*---------------------------------------------------------------------* * Mit implizitem Datentyp *---------------------------------------------------------------------* DATA(lv_sum) = REDUCE #( INIT s = 0 FOR i = 1 UNTIL i > 100 NEXT s = s + i ). *---------------------------------------------------------------------* * Mit angegebenem Datentyp *---------------------------------------------------------------------* DATA(lv_sum2) = REDUCE i( INIT s = 0 FOR i = 1 UNTIL i > 100 NEXT s = s + i ).
Interne Tabellen filtern – FILTER
Ab ABAP 7.40
Der FILTER-Operator erstellt interne Tabellen aus bestehenden Tabellen durch Filterung.
DATA lt_daten TYPE SORTED TABLE OF I_CountryText WITH UNIQUE KEY LANGUAGE COUNTRY. SELECT * FROM i_countrytext INTO TABLE @lt_daten. cl_demo_output=>display( FILTER #( lt_daten WHERE LANGUAGE = 'D' ) ).
DATA lt_daten TYPE SORTED TABLE OF I_CountryText WITH UNIQUE KEY COUNTRY. DATA(lt_filter) = VALUE #( ( COUNTRY = 'DE' ) ( COUNTRY = 'US' ) ). SELECT * FROM i_countrytext WHERE LANGUAGE = 'D' INTO TABLE @lt_daten. cl_demo_output=>display( FILTER #( lt_daten IN lt_filter WHERE COUNTRY = COUNTRY ) ).
Daten kopieren – CORRESPONDING
Ab ABAP 7.40 SP5
CORRESPONDING ähnelt MOVE-CORRESPONDING und kopiert Daten mit gleichen Feldnamen.
TYPES: BEGIN OF lty_itab, carrid TYPE sflight-carrid, connid TYPE sflight-connid, flight_on TYPE sflight-fldate, paymentsum TYPE int8, END OF lty_itab. DATA: ls_sflight TYPE sflight, ls_itab TYPE lty_Itab, lt_sflight TYPE TABLE OF sflight, lt_itab TYPE STANDARD TABLE OF lty_itab. SELECT * FROM sflight INTO TABLE lt_sflight. lt_itab = CORRESPONDING #( lt_sflight MAPPING carrid = carrid connid = connid flight_on = fldate EXCEPT paymentsum ). cl_demo_output=>display( lt_itab ).
Tabellenausdrücke
Ab ABAP 7.40
Tabellenausdrücke erlauben einen direkteren Zugriff auf Tabellenzeilen.
DATA: lt_values TYPE SORTED TABLE OF zdemo_value WITH UNIQUE KEY id. lt_values = VALUE #( ( id = 1 value = 'Test1' ) ( id = 2 value = 'Test2' ) ( id = 3 value = 'Test3' ) ( id = 4 value = 'Test4' ) ( id = 5 value = 'Test5' ) ( id = 6 value = 'Test6' ) ). TRY. DATA(ls_value) = lt_values[ value = 'Test2' ]. DATA(lv_value) = ls_value-value. CATCH cx_sy_itab_line_not_found. cl_demo_output=>display( 'Line not found' ). ENDTRY. cl_demo_output=>display( lv_value ).
Gruppenverarbeitung
Ab ABAP 7.40 SP8
Die neue Gruppenverarbeitung ersetzt AT NEW/END durch GROUP BY in LOOP-Anweisungen.
DATA: lt_values TYPE SORTED TABLE OF zdemo_value WITH UNIQUE KEY id. lt_values = VALUE #( ( id = 1 value = 'Test1' ) ( id = 2 value = 'Test1' ) ( id = 3 value = 'Test1' ) ( id = 4 value = 'Test2' ) ( id = 5 value = 'Test2' ) ( id = 6 value = 'Test3' ) ). LOOP AT lt_values INTO DATA(ls_value) GROUP BY ls_value-value INTO DATA(ls_value_grouped). WRITE: / ls_value_grouped. ENDLOOP.
Verkettung Zeichenketten – &&
Ab ABAP 7.02
Strings lassen sich mit dem Operator && elegant verketten, ohne auf CONCATENATE und eine Hilfsvariable zurückgreifen zu müssen.
cl_demo_output=>display( `Es ist das Jahr ` && sy-datum(4) `.` ).
Beim Zusammenstellen von Strings, beispielsweise für HTML-Generierung, ist &&= eine kompakte Alternative zu CONCATENATE.
lv_html &&= `<b>Hallo</b>`.
String Templates
Ab ABAP 7.02
String-Templates sind Ausdrücke, die einen Zeichenstring erzeugen. Sie beginnen und enden mit | und können eingebettete Ausdrücke enthalten.
cl_demo_output=>display( |Heute: { sy-datum DATE = USER }| ).
Zusätzlich unterstützen String-Templates Formatierungsoptionen wie:
- WIDTH = <Länge> (Breite in Zeichen)
- ALIGN = <Ausrichtung> (LEFT, RIGHT oder CENTER)
- DATE = USER (Datumsformat gemäß Benutzerstammsatz)
- TIME = USER (Zeitformat gemäß Benutzerstammsatz)
" Beispiel cl_demo_output=>display( |Heute ist { sy-datum WIDTH = 10 ALIGN = RIGHT }| ).
Enumerationen
Ab ABAP 7.51
Mit Enumerationen lassen sich typsichere Werte definieren, wodurch Fehler bereits zur Designzeit erkannt werden.
" Definition TYPES: BEGIN OF ENUM eColour, Black, White, Red, Green, Blue, END OF ENUM eColour. "Verwendung DATA MyColour TYPE eColour. MyColour = Blue.
Tabellen, Struktur und Objekte erzeugen – VALUE und NEW
Ab ABAP 7.40
Mit den Operatoren VALUE
und NEW
lassen sich Daten und Objekte effizient erzeugen. Während VALUE
direkt Werte liefert, gibt NEW
eine Referenz auf das erstellte Objekt zurück. Werden keine Parameter übergeben, erzeugen beide Operatoren leere Datenobjekte.
Beim Erstellen von Strukturen können die einzelnen Komponenten direkt als Parameter übergeben werden. Nicht zugewiesene Komponenten erhalten ihren Initialwert.
DATA(ls_zeile) = VALUE tadir( obj_name = 'ZCL_DEMO' object = 'CLAS' ).
Einzelne Zeilen einer internen Tabelle werden in runden Klammern eingeschlossen:
DATA lt_zeitraum TYPE RANGE OF dats. lt_zeitraum = VALUE #( ( sign = 'I' option = 'EQ' low = '20250101' ) ( sign = 'I' option = 'EQ' low = '20251231' ) ).
Gemeinsame Komponenten können vor den runden Klammern definiert werden:
lt_zeitraum = VALUE #( sign = 'I' option = 'EQ' ( low = '20250101' ) ( low = '20251231' ) ).
Mit BASE
kann eine bestehende Struktur oder Tabelle als Ausgangswert festgelegt werden. Unzugewiesene Komponenten übernehmen dann die Werte dieser Basisstruktur.
Für Strukturen:
lt_zeitraum_neu = VALUE #( BASE DateRange ( sign = 'I' option = 'EQ' low = '20250101' ) ).
Für interne Tabellen entspricht dies einem APPEND:
lt_zeitraum_neu = VALUE #( BASE DateRange ( low = '20250101' ) ).
Innerhalb des VALUE-Operators können auch FOR-Schleifen verwendet werden, wie sie beim REDUCE-Operator zum Einsatz kommen.
Instanzen von Klassen lassen sich mit NEW erzeugen:
NEW <Klasse>( <Konstruktorparameter> ).
LINE_EXISTS
AB ABAP 7.40 SP2
Um zu überprüfen, ob ein bestimmter Wert in einer internen Tabelle enthalten ist oder nicht, kann die eingebaute Tabellenfunktion LINE_EXISTS verwendet werden.
DATA lt_values TYPE SORTED TABLE OF zdemo_value WITH UNIQUE KEY id. lt_values = VALUE #( ( id = 1 value = 'Test1' ) ( id = 2 value = 'Test2' ) ( id = 3 value = 'Test3' ) ( id = 4 value = 'Test4' ) ( id = 5 value = 'Test5' ) ( id = 6 value = 'Test6' ) ). IF line_exists( lt_values[ id = 6 ] ). DATA(lv_value) = lt_values[ id = 6 ]-value. cl_demo_output=>display( lv_value ). ELSE. cl_demo_output=>display( 'Line not found' ). ENDIF.
LINES
AB ABAP 7.40
Die Funktion LINES() ermittelt die Zeilenanzahl einer Tabelle und ähnelt damit DESCRIBE TABLE. Im Gegensatz dazu ermöglicht LINES() eine direkte Verwendung an der Operandenposition und erspart eine zusätzliche Codezeile.
DATA lt_values TYPE SORTED TABLE OF zdemo_value WITH UNIQUE KEY id. lt_values = VALUE #( ( id = 1 value = 'Test1' ) ( id = 2 value = 'Test2' ) ( id = 3 value = 'Test3' ) ( id = 4 value = 'Test4' ) ( id = 5 value = 'Test5' ) ( id = 6 value = 'Test6' ) ). DATA(lv_lines) = lines( lt_values ).
Über den Autor
Mein Name ist Andreas Geiger und ich bin ein erfahrener Senior SAP Berater. Mit mehr als 10 Jahren Berufserfahrung habe ich mehrere SAP-Projekte erfolgreich abgeschlossen und umfangreiche Kenntnisse in verschiedenen Bereichen wie SAP FI, SAP MM und ABAP erworben. Nun möchte ich mein Wissen mit Dir teilen, um Dir einen Mehrwert zu bieten und Dich bei Deiner täglichen Arbeit mit dem SAP-System zu unterstützen.
ERP UP unterstützen
Wenn Du mit ERP UP zufrieden bist, kannst Du mich gerne unterstützen. Dabei gibt es unzählige Möglichkeiten, wie Du mich einfach und schnell unterstützen kannst. Wie Du genau ERP UP unterstützen kannst, erfährst Du hier. Vielen Dank.