This is a test message to test the length of the message box.
Login
ABAP in der Praxis Modern ABAP
Erstellt von Software-Heroes

ABAP in der Praxis - Modern ABAP

242

In dieser kleinen Aufgabe schauen wir uns bestehenden klassischen ABAP Quellcode an und versuchen diesen nach Modern ABAP zu optimieren.

Werbung


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.


Enthaltene Themen:
TippABAP in der PraxisModern ABAP
Kommentare (0)



Und weiter ...

Bist du zufrieden mit dem Inhalt des Artikels? Wir posten jeden Freitag neuen Content im Bereich ABAP und unregelmäßig in allen anderen Bereichen. Schaue bei unseren Tools und Apps vorbei, diese stellen wir kostenlos zur Verfügung.


ABAP in Praxis - String Verarbeitung

Kategorie - ABAP

In diesem praktischen Beispiel schauen wir uns die String Verarbeitung zur Ermittlung der CDS Namen in CamelCase an und wie du das mit ABAP umsetzen kannst.

15.10.2024

ABAP in der Praxis - Test Driven Development

Kategorie - ABAP

Wie funktioniert eigentlich TDD in der Praxis und gibt es einfache Beispiele zum Lernen in ABAP? In dieser Übung gehen wir auf den praktischen Teil ein.

24.09.2024

ABAP in der Praxis - Datenmenge zusammenführen

Kategorie - ABAP

Wir führen wir zwei unterschiedliche Datenmengen in ABAP zusammen, vor allem im Hinblick auf das Moderne ABAP? Eine praktische Aufgabe zum Thema.

17.09.2024

ABAP Tipp - Performance Datenfilterung

Kategorie - ABAP

Welche Anweisung verwendest du in ABAP zur Filterung von internen Tabellen und ist diese performant? In diesem Artikel mehr dazu.

13.08.2024

ABAP in der Praxis - Typkonvertierung

Kategorie - ABAP

Wie würdest du diese Typkonvertierung in ABAP durchführen? Ein Beispiel aus der Praxis und ein Lösungsvorschlag.

16.07.2024