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

ABAP - Predicative Method Call

435

Durch das OO Konzept werden für komplexe Abfragen meist eigene Methoden verwendet. In diesem Artikel geht es um den Vergleich des Ergebnisses aus solchen Methoden.

Werbung


Heute stellen wir dir den aktuell letzten Punkt aus unserer Statement-Liste vor und schließen damit erst einmal das Kapitel "Modernes ABAP" ab. Dabei geht es um eine verkürzte Schreibweise von Vergleichen in Bezug auf Methoden. Wie du solche Vergleiche effektiv nutzen kannst, zeigen wir dir in diesem Artikel.

 

Vorbedingung

Damit du den Predicative Method Call verwenden kannst, brauchst du erst einmal eine sauber definierte Methode, die nur Import- und Returning-Parameter besitzt. Solche Methoden solltest du in den meisten Fällen auch verwenden, da sie eine sehr kurze Schreibweise zur Verfügung stellen und im OO Kontext als die Effektivesten gelten. Dazu definieren wir eine Klasse mit drei Methoden, die uns verschiedene Dinge zur Verfügung stellen.

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

  PROTECTED SECTION.
  PRIVATE SECTION.
    DATA:
      mt_list TYPE string_table.

    METHODS:
      is_item_in_list
        IMPORTING
                  id_index         TYPE i
        RETURNING VALUE(rd_result) TYPE abap_bool,

      has_user_authority
        RETURNING VALUE(rd_result) TYPE abap_bool,

      select_company_text
        IMPORTING
                  id_company_code  TYPE t001-bukrs
        RETURNING VALUE(rd_result) TYPE t001-butxt.
ENDCLASS.


CLASS zcl_test_predicative_call IMPLEMENTATION.
  METHOD if_oo_adt_classrun~main.

  ENDMETHOD.


  METHOD has_user_authority.
    AUTHORITY-CHECK OBJECT 'S_TCODE'
      ID 'TCD' FIELD 'ZDUMMY'.

    IF sy-subrc = 0.
      rd_result = abap_true.
    ELSE.
      rd_result = abap_false.
    ENDIF.
  ENDMETHOD.


  METHOD is_item_in_list.
    TRY.
        DATA(ls_line) = mt_list[ id_index ].
        rd_result = abap_true.

      CATCH cx_sy_itab_line_not_found.
        rd_result = abap_false.
    ENDTRY.
  ENDMETHOD.


  METHOD select_company_text.
    SELECT SINGLE butxt
      FROM t001
      WHERE bukrs = @id_company_code
      INTO @rd_result.
  ENDMETHOD.
ENDCLASS.

 

In unserem Beispiel haben wir dazu drei gängige Pattern implementiert:

  • IS_ - Es wird geprüft, ob ein gewisser Zustand vorhanden ist. Eine Zeile in einer Tabelle steht, die Einstellung entsprechend gesetzt ist.
  • HAS_ - Es wird geprüft, ob jemand oder etwas eine bestimmte Eigenschaft hat, Zum Beispiel eine gewisse Berechtigung für etwas.
  • SELECT_ - Die Methode selektiert etwas von der Datenbank und gibt den Wert bzw. die Daten zurück.

 

Verwendung

Nachdem wir nun die Klasse und unsere Testmethoden definiert haben, kannst du diese für den Vergleich verwenden. Diese spezielle Art von Aufruf prüft immer, ob der Rückgabewert der Methode nicht initial ist. Dazu würden wir klassich mit IS NOT INITIAL oder gegen den entsprechenden Wert prüfen. Dazu ein Beispiel aus der klassichen Welt:

" alte Version
IF is_item_in_list( 1 ) = abap_false.
  " ...
ENDIF.

IF select_company_text( '1234' ) IS NOT INITIAL.
  " ...
ENDIF.

IF has_user_authority( ) = abap_true.
  " ...
ENDIF.

 

Die neue Schreibweise ist nun entsprechend kürzer, da du den Vergleich weglassen kannst.

" neue Version
IF NOT is_item_in_list( 1 ).
  " ...
ENDIF.

IF select_company_text( '1234' ).
  " ...
ENDIF.

IF has_user_authority( ).
  " ...
ENDIF.

 

Im Beispiel oben kannst du auch erkennen, dass du mit NOT arbeiten kannst, wenn du das Gegenteil prüfen möchtest. Im ersten Beispiel wollen wir immer durch die IF Abfrage laufen, wenn es keinen ersten Eintrag in der Liste gibt und damit die Daten gepuffert werden müssten. Bei der Prüfung wird immer gegen den korrekten Initialwert des Datentypen geprüft. Solche initialen Werte wären zum Beispiel:

  • String = ``
  • CHAR = ''
  • NUMC2 = 00
  • Integer = 0
  • ABAP_BOOL = '' oder ABAP_FALSE
  • Objekt = NOT BOUND

 

Hinweis: Die Form des kurzen Vergleichs ist nur bei Methodenaufrufen anwendbar, nicht bei normalen Vergleichen von Variablen und Ausdrücken.

 

Design

Mehr zum Design von Methoden erfährst du im offiziellen Style Guide von SAP auf GitHub. Dort wird auf alle Punkt der Sprache und auch dem Design von ABAP Quellcode eingegangen. Als Entwickler findest du dort alles nötige, um modernen und sauberen (clean) Quellcode zu schreiben.In unseren Beispielen haben wir folgenden Anpassungen im Gegensatz zum klassichen ABAP gemacht:

  • Weglassen von CALL METHOD und Verwendung von Klammern
  • Weglassen von EXPORTING beim Aufruf, wenn nur IMPORTING und RETURNING in der Methode verwendet wird
  • Weglassen des Parameternamens, wenn nur ein Parameter an die Schnittstelle übergeben wird
  • Verwendung der Methode direkt in der Abfrage
  • Aufruf auf einer Zeile

 

Du siehst als, mit den neuen Regeln kann man viele Zeilen Code und auch Befehle sparen, es wird übersichtlicher, leichter zu lesen und auch zu debuggen.

" alte Version
DATA:
  ld_text TYPE t001-butxt.

CALL METHOD select_company_text
  EXPORTING
    id_company_code = '1234'
  RECEIVING
    rd_result       = ld_text.

IF ld_text IS NOT INITIAL.
  " ...
ENDIF.

" neue Version
IF select_company_text( '1234' ).
  " ...
ENDIF.

 

Fazit

Die neue Variante der Vergleiche ist kürzer und einfacher zu schreiben, erfordert aber eine standardisierte Methode. Wir empfehlen dir die Verwendung dieser Form, natürlich nur wenn alle in deinem Team auch die Bedeutung und Funktion dieses Aufrufs verstehen.

 

Quelle:
SAP Dokumentation - Prädikativer Methodenaufruf


Enthaltene Themen:
Modernes ABAPPredicative Method Call
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 - 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

ABAP Deep Dive - FOR (Schleifen)

Kategorie - ABAP

Schauen wir uns einmal die FOR Schleife etwas näher an. Wie funktioniert sie? Was muss ich beachten und was kann ich damit tun?

14.04.2023

ABAP Deep Dive - Tabellenzugriff (intern)

Kategorie - ABAP

Schauen wir uns in diesem Artikel einmal den Tabellenzugriff auf interne Tabellen an und wie sie den READ TABLE ablösen.

03.02.2023

ABAP - FINAL

Kategorie - ABAP

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

23.12.2022