ABAP in der Praxis - Modern ABAP
In dieser kleinen Aufgabe schauen wir uns bestehenden klassischen ABAP Quellcode an und versuchen diesen nach Modern ABAP zu optimieren.
Inhaltsverzeichnis
In dieser Aufgabe geht es um die Optimierung eines Stück Quellcode mit ABAP Hilfsmitteln des Modern ABAP. Am Ende findest du einige Vorschläge von unserer Seite.
Einleitung
Modern ABAP ermöglicht es dir, als ABAP Entwickler bisherigen ABAP Code viel kürzer zu schreiben. Das reduziert den Aufwand zum Lesen von Quellcode, aber auch den Aufwand zum Erstellen von neuem Code. Dazu wurden viele neue funktionale Statements in der Sprache eingeführt, die bisherige Sprachkonstrukte obsolet machen.
Vorbereitung
Als Vorbereitung legen wir eine neue Klasse im System an und übernehmen den Quellcode ins System. In der Methode TASK findest du den Quellcode, der optimiert werden soll, in der Methode SUGGESTION kannst du deinen Vorschlag implementieren.
CLASS zcl_bs_demo_puzzle DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
TYPES: BEGIN OF ts_data,
field1 TYPE c LENGTH 1,
field2 TYPE c LENGTH 1,
field3 TYPE c LENGTH 1,
field4 TYPE c LENGTH 1,
field5 TYPE c LENGTH 1,
field6 TYPE c LENGTH 1,
END OF ts_data.
TYPES tt_data TYPE STANDARD TABLE OF ts_data WITH EMPTY KEY.
PRIVATE SECTION.
METHODS task
IMPORTING it_some_data TYPE tt_data.
METHODS suggestion
IMPORTING it_some_data TYPE tt_data.
METHODS do_something
IMPORTING is_data TYPE ts_data.
ENDCLASS.
CLASS zcl_bs_demo_puzzle IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA(lt_some_data) = VALUE tt_data(
( field1 = '1' field2 = '2' field3 = '3' field4 = '4' field5 = '5' field6 = '6' )
( field1 = ' ' field2 = '7' field3 = '8' field4 = '9' field5 = 'A' field6 = 'B' ) ).
task( lt_some_data ).
suggestion( lt_some_data ).
ENDMETHOD.
METHOD task.
DATA ls_mapped TYPE ts_data.
LOOP AT it_some_data INTO DATA(ls_some_data).
CLEAR ls_mapped.
MOVE-CORRESPONDING ls_some_data TO ls_mapped.
CLEAR:
ls_mapped-field3,
ls_mapped-field4,
ls_mapped-field6.
do_something( ls_mapped ).
ENDLOOP.
ENDMETHOD.
METHOD suggestion.
" Start here
ENDMETHOD.
METHOD do_something.
" Method to demonstrate further handlings
ENDMETHOD.
ENDCLASS.
Aufgabe
Die Aufgabe besteht nun darin, den folgenden Quellcode einmal zu optimieren. Wir verarbeiten die Daten in der Methode, führen ein Mapping durch und übergeben die Daten an die nächste Methode zur Verarbeitung. Den Prozess wollen wir nun einmal mit Modern ABAP Mitteln abbilden.
DATA ls_mapped TYPE ts_data.
LOOP AT it_some_data INTO DATA(ls_some_data).
CLEAR ls_mapped.
MOVE-CORRESPONDING ls_some_data TO ls_mapped.
CLEAR:
ls_mapped-field3,
ls_mapped-field4,
ls_mapped-field6.
do_something( ls_mapped ).
ENDLOOP.
Hinweis: Im nächsten Abschnitt werden wir auf die Lösung eingehen, wenn du die Aufgabe erst einmal selbstständig machen möchtest, solltest du hier pausieren.
Lösung
Als Lösung gibt es von unserer Seite zwei Vorschläge, wie du recht einfach und elegant mit einem Statement das Mapping abbilden kannst. Durch die Verwendung von Inline-Deklaration und einem Konstruktor-Statement, sparen wir uns das Anlegen und Löschen der Variable im ersten Schritt.
Vorschlag 1
Im ersten Vorschlag verwenden wir Value, um das Mapping durchzuführen. Mit der Angabe des Typs können wir uns die Variable per Inline-Deklaration anlegen. Über den Zusatz Base verwenden wir die Felder aus LS_SOME_DATA und setzen zum Abschluss die Felder auf Leer, was das CLEAR ersetzt.
LOOP AT it_some_data INTO DATA(ls_some_data).
DATA(ls_mapped) = VALUE ts_data( BASE CORRESPONDING #( ls_some_data ) field3 = '' field4 = '' field6 = '' ).
do_something( ls_mapped ).
ENDLOOP.
Vorschlag 2
Etwas einfacher und kürzer ist der zweite Vorschlag, hier verwenden wir nur CORRESPONDING und können ebenfalls per Inline-Deklaration die Variable anlegen. Beim Mapping können wir mit dem Zusatz EXCEPT die Felder ignorieren und leer lassen.
LOOP AT it_some_data INTO DATA(ls_some_data).
DATA(ls_mapped) = CORRESPONDING ts_data( ls_some_data EXCEPT field3 field4 field6 ).
do_something( ls_mapped ).
ENDLOOP.
Komplettes Beispiel
Hier findest du die komplette Klasse mit beiden Möglichkeiten. Da die Variante mit Corresponding kürzer ist, ist diese auch im Code aktiv.
CLASS zcl_bs_demo_puzzle DEFINITION
PUBLIC FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_oo_adt_classrun.
TYPES: BEGIN OF ts_data,
field1 TYPE c LENGTH 1,
field2 TYPE c LENGTH 1,
field3 TYPE c LENGTH 1,
field4 TYPE c LENGTH 1,
field5 TYPE c LENGTH 1,
field6 TYPE c LENGTH 1,
END OF ts_data.
TYPES tt_data TYPE STANDARD TABLE OF ts_data WITH EMPTY KEY.
PRIVATE SECTION.
METHODS task
IMPORTING it_some_data TYPE tt_data.
METHODS suggestion
IMPORTING it_some_data TYPE tt_data.
METHODS do_something
IMPORTING is_data TYPE ts_data.
ENDCLASS.
CLASS zcl_bs_demo_puzzle IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA(lt_some_data) = VALUE tt_data(
( field1 = '1' field2 = '2' field3 = '3' field4 = '4' field5 = '5' field6 = '6' )
( field1 = ' ' field2 = '7' field3 = '8' field4 = '9' field5 = 'A' field6 = 'B' ) ).
task( lt_some_data ).
suggestion( lt_some_data ).
ENDMETHOD.
METHOD task.
DATA ls_mapped TYPE ts_data.
LOOP AT it_some_data INTO DATA(ls_some_data).
CLEAR ls_mapped.
MOVE-CORRESPONDING ls_some_data TO ls_mapped.
CLEAR:
ls_mapped-field3,
ls_mapped-field4,
ls_mapped-field6.
do_something( ls_mapped ).
ENDLOOP.
ENDMETHOD.
METHOD suggestion.
LOOP AT it_some_data INTO DATA(ls_some_data).
DATA(ls_mapped) = CORRESPONDING ts_data( ls_some_data EXCEPT field3 field4 field6 ).
do_something( ls_mapped ).
ENDLOOP.
* LOOP AT it_some_data INTO DATA(ls_some_data).
* DATA(ls_mapped) = VALUE ts_data( BASE CORRESPONDING #( ls_some_data ) field3 = '' field4 = '' field6 = '' ).
* do_something( ls_mapped ).
* ENDLOOP.
ENDMETHOD.
METHOD do_something.
" Method to demonstrate further handlings
ENDMETHOD.
ENDCLASS.
Fazit
Modern ABAP macht viele Entwicklungsaufgaben einfacher und reduziert den zu schreibenden Quellcode ungemein, ohne an Komplexität dazu zu gewinnen. Hast du eine weitere Lösung, dann gern in die Kommentare damit.