Neue Sprachfeatures in ABAP – Die Evolution der Sprache

In der Welt der Softwareentwicklung gibt es kaum etwas Aufregenderes als neue Funktionen und Werkzeuge, die das Programmieren effizienter machen. Dies gilt besonders für ABAP, eine Sprache, die sich seit den frühen Tagen von SAP stetig weiterentwickelt. Seit der Einführung von SAP NetWeaver 7.02 und insbesondere den Versionen 7.4 und 7.5 hat ABAP einen enormen Wandel durchlaufen. Dabei geht es nicht nur darum, die Menge an Code zu reduzieren – wie etwa durch die Vereinfachung von CONCATENATE-Anweisungen – sondern auch darum, völlig neue Funktionalitäten hinzuzufügen. Diese Verbesserungen verdeutlichen, dass ABAP alles andere als eine veraltete Programmiersprache ist, wie es in den frühen 2000er Jahren befürchtet wurde, als Diskussionen über einen möglichen Wechsel zu Java aufkamen.

ABAP-Versionen – Mehr Namen, mehr Funktionen

Mit der Einführung von ABAP 7.53, auch bekannt als 1809 (veröffentlicht im September 2018), hat SAP einen neuen Trend gesetzt: Die Versionen von ABAP erscheinen jetzt regelmäßig in kurzen Abständen. Im Rahmen der SAP Business Technology Platform (BTP) wird eine neue ABAP-Version durchschnittlich alle drei Monate veröffentlicht, was zu Bezeichnungen wie 1812, 1903 oder 2108 geführt hat. Auch die ABAP-Versionen für SAP S/4HANA folgen diesem Schema und werden seit 2019 jährlich veröffentlicht. Jedes dieser Releases bringt neue Funktionen und Optimierungen mit sich, wobei ABAP seit der Version 7.53 nur noch mit einer SAP HANA-Datenbank und einem Linux-Betriebssystem funktioniert. Dies zeigt, wie stark ABAP mit den neuesten Technologien von SAP verknüpft ist.

Datentyp-Deklarationen überspringen – Weniger Code, mehr Übersicht

Mit ABAP 7.4 wurde es möglich, Datentyp-Deklarationen in vielen Fällen ganz wegzulassen. Der Compiler erkennt den benötigten Datentyp automatisch, wodurch die Notwendigkeit, ihn explizit zu deklarieren, entfällt. Diese Neuerung reduziert die Anzahl der Codezeilen und macht den Code übersichtlicher. Anstatt den Datentyp explizit zu definieren, wie etwa in:

  1 DATA: benutzername TYPE string.
  2 benutzername = 'Max Mustermann'.

kann dies nun vereinfacht werden:

  1 DATA(benutzername) = 'Max Mustermann'.

Der Compiler übernimmt die Aufgabe, den Datentyp zu ermitteln, was die Fehleranfälligkeit verringert und die Wartbarkeit verbessert. Ein weiteres Beispiel zeigt, wie man die Anzahl von Einträgen in einer Tabelle zählen kann. Statt den Datentyp für die Variable explizit zu definieren:

  1 DATA: anzahl_von_einträgen TYPE i.
  2 anzahl_von_einträgen = LINES(tabellenname).

kann dies nun vereinfacht werden:

  1 DATA(anzahl_von_einträgen) = LINES(tabellenname).

Auch hier sorgt der Compiler für die automatische Typzuweisung. Diese Inline-Deklarationen sind besonders nützlich in komplexen Programmen, da sie den Code kürzer und lesbarer machen.

Einfache Handhabung und Typensicherheit

In ABAP ist der Aufruf von Funktionen und Methoden ein wesentlicher Bestandteil der Programmierung. Mit den Neuerungen in ABAP 7.4 wird das Deklarieren von Variablen zur Übergabe an Funktionen erheblich erleichtert und gleichzeitig das Risiko von Typenfehlern verringert. Statt Variablen zu deklarieren und auf deren Kompatibilität zu achten, können Sie jetzt die Variablen direkt beim Funktionsaufruf angeben. Angenommen, wir haben eine Funktion, die die Eigenschaften eines Autos aktualisiert: Vor ABAP 7.4 könnte der Code so ausgesehen haben:

  1 DATA: auto TYPE REF TO zcl_auto,
  2       auto_update TYPE string VALUE 'update to next model',
  3       auto_modell TYPE string,
  4       auto_status TYPE string.
  5 
  6 CREATE OBJECT auto EXPORTING modell = 'Tesla Model S'.
  7 
  8 CALL METHOD auto->update_properties
  9   EXPORTING
  10     update = auto_update
  11   IMPORTING
  12     model = auto_modell
  13     status = auto_status.

In dieser Version mussten wir sicherstellen, dass die Typen der Variablen übereinstimmen, um Laufzeitfehler zu vermeiden. Mit ABAP 7.4 können wir das nun viel einfacher gestalten:

  1 DATA(auto) = NEW zcl_auto( modell = 'Tesla Model S' ).
  2 DATA(auto_update) = 'update to next model'.
  3 
  4 CALL METHOD auto->update_properties
  5   EXPORTING
  6     update = auto_update
  7   IMPORTING
  8     model = DATA(auto_modell)
  9     status = DATA(auto_status).

Durch die Inline-Deklaration wird der Code nicht nur kompakter, sondern reduziert auch die Gefahr von Typenfehlern erheblich, da die Variablen direkt bei der Zuweisung in der Methode definiert werden. Diese Verbesserungen machen das Arbeiten mit Funktionen in ABAP einfacher und weniger fehleranfällig.

Stringverarbeitung – Effiziente Handhabung von Zeichenfolgen

In der Programmierung mit ABAP ist die Verarbeitung von Zeichenketten ein alltäglicher Vorgang, insbesondere wenn es darum geht, Informationen über Autos zu verwalten. In früheren Versionen war es oft notwendig, komplexe Funktionen zu verwenden, um führende Nullen aus den Modellnummern von Autos zu entfernen. Vor ABAP 7.4 könnte der Code so ausgesehen haben:

  1 DATA: auto_modell TYPE z4de_auto_modell VALUE '00001'.
  2 
  3 " Entfernen führender Nullen für die Ausgabe
  4 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
  5   EXPORTING
  6     input = auto_modell
  7   IMPORTING
  8     output = auto_modell.
  9 
  10 DATA(text) = |Das Auto Modell ist: auto_modell|.

Ab ABAP 7.4 können wir das viel einfacher und leserlicher mit der ALPHA-Formatierungsoption erledigen:

  1 DATA(auto_modell) = '00001'.
  2 
  3 DATA(text) = |Das Auto Modell ist: { auto_modell ALPHA = OUT }|.

In diesem Beispiel bleibt die ursprüngliche Variable auto_modell unverändert, während die Ausgabe für den Benutzer formatiert wird. Dies verbessert nicht nur die Lesbarkeit des Codes, sondern auch die Effizienz, da die Verwendung von Funktionalitäten reduziert wird, die nur für die Formatierung erforderlich sind. Diese neuen Möglichkeiten machen es einfacher, mit Strings zu arbeiten und sicherzustellen, dass die Benutzer die Informationen in einem benutzerfreundlichen Format erhalten.

Objekte mit NEW erstellen – Weniger Code, klarere Struktur

Die Erstellung von Objekten in ABAP war früher oft kompliziert und erforderte mehrere Zeilen Code. Mit der Einführung des NEW-Befehls in ABAP 7.4 wurde dieser Prozess erheblich vereinfacht. Anstatt ein Objekt wie folgt zu erstellen:

  1 DATA: auto TYPE REF TO zcl_auto.
  2 CREATE OBJECT auto EXPORTING modell = 'Tesla Model S'.

kann dies jetzt in einer einzigen Zeile geschehen:

  1 DATA(auto) = NEW zcl_auto( modell = 'Tesla Model S' ).

Hier wird nicht nur der Code reduziert, sondern verbessert auch die Lesbarkeit. Der NEW-Befehl ermöglicht es, den Typ der Variablen direkt bei der Objekterstellung zu sehen, was den Code klarer und einfacher nachvollziehbar macht. Dies fördert eine bessere Struktur und erleichtert die Wartung des Codes, da weniger Zeilen erforderlich sind und die Informationen über das Objekt an einem Ort zusammengefasst sind.

Strukturen und interne Tabellen beim Erstellen füllen – Effizienz durch VALUE

Mit der Einführung von ABAP 7.4 hat das VALUE-Statement eine bedeutende Weiterentwicklung erfahren. Früher war es notwendig, Variablen einzeln zu deklarieren und anschließend Werte zuzuweisen. Nehmen wir an, wir möchten eine interne Tabelle für verschiedene Auto-Modelle erstellen. Vor ABAP 7.4 hätte man dies folgendermaßen getan:

  1 DATA:
  2 lt_auto TYPE TABLE OF ztt_auto,
  3 ls_auto TYPE ztt_auto.
  4 
  5 ls_auto-modell = 'Tesla Model S'.
  6 ls_auto-farbe = 'Rot'.
  7 APPEND ls_auto TO lt_auto.
  8 
  9 ls_auto-modell = 'BMW i8'.
  10 ls_auto-farbe = 'Blau'.
  11 APPEND ls_auto TO lt_auto.

In ABAP 7.4 und später kann dies nun viel eleganter mit dem VALUE-Statement realisiert werden:

  1 DATA(lt_auto) = VALUE ztt_auto_table(
  2     ( modell = 'Tesla Model S' farbe = 'Rot' )
  3     ( modell = 'BMW i8' farbe = 'Blau' )
  4 ).

Diese Methode reduziert den benötigten Code erheblich, indem die Definition der Werte in einer einzigen Zeile zusammengefasst wird. Der Einsatz von VALUE ermöglicht es, die Struktur sofort beim Erstellen der internen Tabelle zu befüllen, was die Lesbarkeit und Wartbarkeit des Codes verbessert.

Interne Tabellen aus anderen Tabellen füllen

In ABAP 7.4 wurde das FOR-Anweisung eingeführt, dass das Befüllen interner Tabellen aus anderen Tabellen erheblich vereinfacht. Nehmen wir an, wir haben eine interne Tabelle mit verschiedenen Automodellen und wir möchten nur die Autos mit einem bestimmten Preis in eine neue Tabelle übertragen.

  1 SELECT * FROM z4t_tesla_cars
  2   INTO TABLE @DATA(all_tesla_cars).
  3 
  4 DATA(expensive_tesla_cars) = VALUE z4tt_tesla_header(
  5   FOR car_details IN all_tesla_cars
  6   WHERE ( price > 30000 )
  7     ( name = car_details-name, color = car_details-color )
  8 ).

Der Code wählt alle Tesla-Autos aus der Tabelle z4t_tesla_cars und speichert sie in der internen Tabelle all_tesla_cars. Anschließend wird gefiltert, um nur die Tesla-Modelle zu behalten, deren Preis über 30.000 liegt. Von diesen gefilterten Autos werden die Felder Name und Farbe extrahiert und in der Tabelle expensive_tesla_cars gespeichert, die der Struktur z4tt_tesla_header folgt.

Enumerationen – Eindeutige Werte für spezifische Eigenschaften

Mit der Einführung von Enumerationen in ABAP 7.51 können Entwickler nun sicherstellen, dass Variablen nur einen bestimmten Satz von Werten annehmen. Dies ist besonders nützlich, wenn es darum geht, klar definierte Werte zu verwenden, wie zum Beispiel die verschiedenen Automarken, die wir in unserem Programm verwalten möchten. Statt mehrere Konstanten für die Automarken zu definieren, können wir eine Enumeration erstellen:

  1 TYPES: BEGIN OF ENUM auto_marke,
  2   tesla,
  3   bmw,
  4   mercedes,
  5 END OF ENUM auto_marke.
  6 
  7 DATA(auto) TYPE auto_marke.

Jetzt können wir die Variable auto mit einem der definierten Werte füllen:

  1 auto = tesla.

Wenn wir versuchen würden, der Variable auto einen nicht definierten Wert zuzuweisen, würde der Compiler sofort einen Fehler anzeigen, was uns vor möglichen Programmierfehlern schützt:

  1 auto = 'Audi'.  " Dies würde einen Syntaxfehler verursachen

Durch die Verwendung von Enumerationen wird der Code nicht nur sicherer, sondern auch lesbarer, da die Absicht des Entwicklers klarer wird. Der Leser des Codes kann sofort erkennen, dass die Variable auto nur einen der vordefinierten Markenwerte annehmen kann, was die Wartbarkeit des Codes erheblich verbessert.

Konstruktoroperatoren zur Konvertierung von Zeichenketten – Vereinfachte Typumwandlung

In ABAP ist es häufig erforderlich, Werte von einem Datentyp in einen anderen zu konvertieren. Früher war es notwendig, Hilfsvariablen zu verwenden, um Werte korrekt in den erforderlichen Typ zu übertragen. Zum Beispiel:

  1 DATA: helper  TYPE c LENGTH 60,
  2       auto_id TYPE n LENGTH 4 VALUE '1234'.
  3 
  4 helper = auto_id.
  5 
  6 DATA(auto_props) = auto->get_properties( id = helper ).

In diesem Fall haben wir eine Hilfsvariable verwendet, um die ID des Autos in einen String umzuwandeln, was den Code weniger effizient und schwerer lesbar macht. Mit der Einführung von Konstruktoroperatoren wie CONV in ABAP 7.4 können wir dies jedoch eleganter lösen:

  1 DATA: auto_id TYPE n LENGTH 4 VALUE '1234'.
  3 DATA(auto_props) = auto->get_properties( id = CONV #( auto_id ) ).

Hier verwenden wir den Konstruktoroperator CONV, um die ID direkt in die korrekte Form zu konvertieren, ohne eine zusätzliche Hilfsvariable deklarieren zu müssen. Diese Methode macht den Code nicht nur kompakter, sondern verbessert auch die Lesbarkeit und Wartbarkeit, da sie die Notwendigkeit verringert, mehrere Variablen zu verwalten. Der Einsatz von Konstruktoroperatoren trägt dazu bei, die Programmierung in ABAP effizienter zu gestalten.

Die COND-Anweisung als Ersatz für IF/ELSE – Flexibilität bei Bedingungen

In ABAP 7.4 wurde die COND-Anweisung eingeführt, um die Handhabung von Bedingungen zu vereinfachen und lesbarer zu gestalten. Diese neue Syntax ermöglicht es Entwicklern, komplexe Bedingungen zu formulieren, ohne auf die herkömmliche IF/ELSE-Struktur zurückgreifen zu müssen. Angenommen, wir möchten den Zustand eines Autos basierend auf seiner Laufleistung bewerten. Vor der Einführung von COND hätte der Code so ausgesehen:

  1 DATA: auto_laufleistung TYPE i VALUE 60000. 
  2       zustand TYPE string.
  3 
  4 IF auto_laufleistung > 100000.
  5   zustand = 'Alt'.
  6 ELSEIF auto_laufleistung > 50000.
  7   zustand = 'Gebraucht'.
  8 ELSE.
  9   zustand = 'Neu'.
  10 ENDIF.

Obwohl dieser Ansatz funktional ist, kann die Verwendung von COND den Code erheblich vereinfachen:

  1 DATA(auto_laufleistung) = 60000.
  2 
  3 DATA(zustand) = COND string(
  4   WHEN auto_laufleistung > 100000 THEN 'Alt'
  5   WHEN auto_laufleistung > 50000 THEN 'Gebraucht'
  6   ELSE 'Neu'
  7 ).

Durch die Verwendung der COND-Anweisung können wir die Bedingungen prägnant und klar in einer einzigen Zeile formulieren. Dies macht den Code nicht nur kürzer, sondern auch leserlicher, da die Zuweisung der Variablen zustand auf einfache Weise zusammengefasst wird.

Diese Verbesserungen tragen dazu bei, dass der Code in ABAP moderner und wartungsfreundlicher wird, da weniger Zeilen benötigt werden und die Logik der Bedingungen auf einen Blick erkennbar ist.

SWITCH-Anweisung als Ersatz für CASE – Klarere Bedingungen

In ABAP ist die Möglichkeit, unterschiedliche Bedingungen klar und übersichtlich zu formulieren, entscheidend für die Lesbarkeit und Wartbarkeit des Codes. Mit der Einführung der SWITCH-Anweisung in ABAP 7.4 wird das Handling von Bedingungen wesentlich vereinfacht. Angenommen, wir möchten den Editiermodus für verschiedene Automodelle festlegen. Früher hätten wir die CASE-Anweisung verwendet, um den Editiermodus festzulegen:

  1 DATA: edit_mode TYPE /bobf/conf_edit_mode.
  2 
  3 CASE auto_model.
  4   WHEN 'Tesla Model S'.
  5     edit_mode = /bobf/if_conf_c=>sc_edit_read_only.
  6   WHEN 'BMW i8'.
  7     edit_mode = /bobf/if_conf_c=>sc_edit_exclusive.
  8   WHEN OTHERS.
  9     RAISE EXCEPTION TYPE zcx_auto_exceptions.
  10 ENDCASE.

Obwohl diese Methode funktional war, musste die Zielvariable in jeder Bedingung wiederholt werden, was den Code länger und weniger übersichtlich machte. Mit der SWITCH-Anweisung kann der gleiche Vorgang jedoch viel kompakter durchgeführt werden:

  1 DATA(edit_mode) =
  2   SWITCH /bobf/conf_edit_mode( auto_model
  3     WHEN 'Tesla Model S' THEN /bobf/if_conf_c=>sc_edit_read_only
  4     WHEN 'BMW i8' THEN /bobf/if_conf_c=>sc_edit_exclusive
  5     ELSE THROW zcx_auto_exceptions( )
  6   ).

Durch diese neue Syntax können wir die Bedingungen klar und prägnant formulieren, ohne die Zielvariable in jeder Zeile wiederholen zu müssen. Dies verbessert nicht nur die Lesbarkeit des Codes, sondern erleichtert auch spätere Änderungen, da nur die Bedingungen innerhalb des SWITCH-Blocks angepasst werden müssen. Diese Neuerung trägt dazu bei, den Code in ABAP moderner und benutzerfreundlicher zu gestalten.

Fazit und Ausblick

In den letzten Abschnitten haben wir paar der neuen Funktionen von ABAP erkundet, die darauf abzielen, die Programmierung effizienter und lesbarer zu gestalten. Von der Vereinfachung der Variablendeklaration bis hin zur Einführung moderner Syntax wie SWITCH und COND – diese Neuerungen bieten Entwicklern zahlreiche Möglichkeiten, den Code zu optimieren und gleichzeitig die Lesbarkeit zu verbessern. Im nächsten Beitrag werden wir uns eingehender mit den neuen Features von internen Tabellen in ABAP befassen. Bleiben Sie dran!