This is a test message to test the length of the message box.
Login
ABAP FINAL
Erstellt von Software-Heroes

ABAP - FINAL

432

In diesem Artikel schauen wir uns einmal das neue FINAL Sprachkonstrukt an, wie es funktioniert und was du damit anstellen kannst.

Werbung


Mit dem ABAP Release für die Cloud sind wieder ein paar neue Sprachkonstrukte in ABAP aufgetaucht. Eines dieser neuen Konstrukte wollen wir uns Heute einmal anschauen.

 

Einleitung

Um was geht es nun eigentlich bei FINAL, vor allem da es das Schlüsselwort bereits im Zusammenhang mit Klassendefinitionen gibt? Vielleicht ist der Name nicht ganz so gut gewählt, aber bei FINAL geht es um die Definition von Variablen, so wie bei DATA. Es werden allerdings Variablen erzeugt, deren Wert nur einmal gesetzt werden kann, danach sind alle ändernden Zugriffe verboten.

 

Variablen

Erzeugen wir in den ersten Beispielen einmal ein paar Variablen und schauen uns die allgemeine Syntax an. Dabei wird dir auffallen, dass sie an den gleichen Stellen verwendet werden kann, wie DATA:

FINAL(ld_name) = `My name is John`.

FINAL(lt_partner) = VALUE tt_partner(
  ( partner = '1' name = 'Partner One' )
  ( partner = '2' name = 'Partner Two' )
).

 

In dem gezeigten Beispiel erzeugen wir einen String und eine Tabelle, deren Werte wir jeweils vorbelegen.

 

Tabellen

Im nächsten Beispiel schauen wir uns einmal die Verarbeitung mit Tabellen an. Dazu befüllen wir über einen SELECT unsere Tabelle und definieren sie direkt beim Lesen mit FINAL. Dadurch wir die Tabelle mit Daten befüllt, kann im Anschluss aber nicht verändert wird. Dann versuchen wir verschiedene Arten von Loops:

SELECT FROM zbs_dmo_partner
  FIELDS *
  INTO TABLE @FINAL(lt_partner).

LOOP AT lt_partner INTO DATA(ls_partner) FROM 1 TO 3.
ENDLOOP.

LOOP AT lt_partner REFERENCE INTO DATA(lr_partner) FROM 1 TO 3.
ENDLOOP.

 

Das Lesen der Daten funktioniert ohne Probleme, auch die Loops funktionieren ohne Fehler. Solange du im zweiten Loop nicht versuchst die Daten zu verändern, kommt es zu keinem Fehler.

 

Schleife

Betrachten wir uns im nächsten Beispiel einmal den Loop und die Verwendung von FINAL in einer Schleife. Dazu befüllen wir Tabelle einmal mit Dummy-Daten, die Tabelle wurde mit DATA deklariert und wäre damit änderbar. Dann implementieren wir zwei Schleifen, eine bei der der Arbeitsbereich per FINAL definiert wird und eine bei der wir eine Kopie mit FINAL erstellen.

DATA(lt_partner) = VALUE tt_partner(
  ( partner = '1' name = 'Partner One' )
  ( partner = '2' name = 'Partner Two' )
  ( partner = '3' name = 'Partner Three' )
  ( partner = '4' name = 'Partner Four' )
).

LOOP AT lt_partner INTO FINAL(ls_final_partner).
ENDLOOP.

LOOP AT lt_partner INTO DATA(ls_partner).
  FINAL(ls_copy) = ls_partner.
ENDLOOP.

 

Bei Schleifen funktionieren ohne Probleme, das mehrfache Durchlaufen der FINAL Anweisung ist kein Problem. Wichtig ist, dass die Variable nur an einer Stelle mit FINAL gesetzt wird. Wird diese Stelle mehrfach durchlaufen, so ändert sich der Inhalt der Variable.

 

CHANGING

Das letzte Beispiel in diesem Artikel befasst sich mit der Übergabe von solchen definierten Variablen an Methoden mit Changing Parameter. Das folgende Beispiel ist nicht möglich und kann auch nicht aktiviert werden, auch wenn die Variable in der Methode nicht geändert wird:

FINAL(ls_partner) = VALUE ts_partner( partner = '3' name = 'Partner Three' ).

changing_final_variable(
  CHANGING
    cs_partner = ls_partner
).

 

Fehler

Bei einigen der gezeigten Beispiele ist bereits die Aktivierung von Quellcode nicht möglich, da das System erkennt, dass das Feld geändert wird und der Compiler verhindert die Aktivierung:

 

Im Falle des Loops mit Referenz lässt der Compiler die Aktivierung zu und zeigt keine Fehler an. Wenn du den Code allerdings ausführst, kommt es zu einer unbehandelbaren Ausnahme MOVE_TO_LIT_NOTALLOWED_NODATA:

SELECT FROM zbs_dmo_partner
  FIELDS *
  INTO TABLE @FINAL(lt_partner).

LOOP AT lt_partner REFERENCE INTO DATA(lr_partner) FROM 1 TO 3.
  lr_partner->street = 'Dummy'.
ENDLOOP.

 

Komplettes Beispiel

Wie immer am Ende des Artikels noch einmal das vollständige Beispiel des heutigen Artikels. Die Tabelle haben wir aus dem Datenmodell für die CDS Views entnommen:

CLASS zcl_bs_demo_langu_final DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_oo_adt_classrun.

    TYPES:
      BEGIN OF ts_partner,
        partner TYPE zbs_dmo_partner-partner,
        name    TYPE zbs_dmo_partner-name,
        country TYPE zbs_dmo_partner-country,
      END OF ts_partner,
      tt_partner TYPE SORTED TABLE OF ts_partner WITH UNIQUE KEY partner.

  PROTECTED SECTION.
  PRIVATE SECTION.
    METHODS:
      set_variables
        IMPORTING
          io_out TYPE REF TO if_oo_adt_classrun_out,

      select_from_table
        IMPORTING
          io_out TYPE REF TO if_oo_adt_classrun_out,

      final_in_loop
        IMPORTING
          io_out TYPE REF TO if_oo_adt_classrun_out,

      call_method_with_changing
        IMPORTING
          io_out TYPE REF TO if_oo_adt_classrun_out,

      changing_final_variable
        CHANGING
          cs_partner TYPE ts_partner.
ENDCLASS.


CLASS zcl_bs_demo_langu_final IMPLEMENTATION.
  METHOD if_oo_adt_classrun~main.
    set_variables( out ).
    select_from_table( out ).
    final_in_loop( out ).
    call_method_with_changing( out ).
  ENDMETHOD.


  METHOD set_variables.
    FINAL(ld_name) = `My name is John`.
    io_out->write( ld_name ).

    FINAL(lt_partner) = VALUE tt_partner(
      ( partner = '1' name = 'Partner One' )
      ( partner = '2' name = 'Partner Two' )
    ).
    io_out->write( lt_partner ).

*    INSERT VALUE #( partner = '3' name = 'Partner Three' ) INTO TABLE lt_partner.
  ENDMETHOD.


  METHOD select_from_table.
    SELECT FROM zbs_dmo_partner
      FIELDS *
      INTO TABLE @FINAL(lt_partner).

    LOOP AT lt_partner INTO DATA(ls_partner) FROM 1 TO 3.
      io_out->write( ls_partner ).
    ENDLOOP.

    LOOP AT lt_partner REFERENCE INTO DATA(lr_partner) FROM 1 TO 3.
      " Will dump
*      lr_partner->street = 'Dummy'.
    ENDLOOP.
  ENDMETHOD.


  METHOD final_in_loop.
    DATA(lt_partner) = VALUE tt_partner(
      ( partner = '1' name = 'Partner One' )
      ( partner = '2' name = 'Partner Two' )
      ( partner = '3' name = 'Partner Three' )
      ( partner = '4' name = 'Partner Four' )
    ).

    LOOP AT lt_partner INTO FINAL(ls_final_partner).
      io_out->write( ls_final_partner ).
    ENDLOOP.

    LOOP AT lt_partner INTO DATA(ls_partner).
      FINAL(ls_copy) = ls_partner.
      io_out->write( ls_copy ).
    ENDLOOP.
  ENDMETHOD.


  METHOD call_method_with_changing.
    FINAL(ls_partner) = VALUE ts_partner( partner = '3' name = 'Partner Three' ).

*    changing_final_variable(
*      CHANGING
*        cs_partner = ls_partner
*    ).
  ENDMETHOD.


  METHOD changing_final_variable.
    " No implementation
  ENDMETHOD.
ENDCLASS.

 

Fazit

Das heute gezeigte Statement erweitert deine Kenntnisse zur Definition von Variablen. Die Benamung ist Geschmackssache und nicht unbedingt konsistent durchgezogen. Am Ende kannst du damit Werte und Tabellen zur Verfügung stellen, die auch einen Schreibschutz mitbringen und du dir keine Angst vor Anpassungen in Unterroutinen machen musst.

 

Quelle:
SAP Dokumentation - FINAL


Enthaltene Themen:
Modernes ABAPFINAL
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 - XCO Excel

Kategorie - ABAP

Was kann eigentlich die XCO Bibliothek für Excel in ABAP? Hier schauen wir uns den aktuellen Stand der API an.

29.11.2024

ABAP - XCO Strings

Kategorie - ABAP

In diesem Artikel schauen wir uns die XCO Klasse zur Erzeugung und Verarbeitung von Strings für ABAP Cloud an und vergleichen sie mit den klassischen Statements.

22.11.2024

ABAP - XCO Bibliotheken

Kategorie - ABAP

Was kannst du mit der Bibliothek in ABAP und ABAP Cloud machen und wie nutzt du die Objekte am besten? Hier erfährst du mehr.

12.11.2024

ABAP - Type Casting

Kategorie - ABAP

Wie kommst du eigentlich an den ursprünglichen Typ einer Klasse bzw. Instanz, wenn diese in einer generischen Tabelle übergeben wird? In diesem Artikel prüfen wir die Möglichkeiten.

16.04.2024

ABAP - RETURN value

Kategorie - ABAP

Nach all den Jahren ist nun endlich der "echte" Return in ABAP angekommen, in diesem Artikel zeigen wir dir, wie der funktioniert und was er kann.

13.02.2024