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

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 Schleife 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)
Werbung

ABAP - Performance für den SELECT

Kategorie - ABAP

In diesem Artikel schauen wir uns noch ein paar Spezialfälle mit dem SELECT an und beleuchten die Performance dieser Konstrukte. Wir zeigen dir die aktuellen Alternativen dafür und geben kleinere Tipps beim Lesen.

02.04.2021

ABAP - Objekte prüfen (Instanzen)

Kategorie - ABAP

In diesem Artikel zeigen wir dir, wie du Instanzen analysieren und auf diese korrekt reagieren kannst, wenn du diese zum Beispiel bei einer Verarbeitung übergibst und individuell reagieren möchtest.

19.03.2021

ABAP - Schleifen

Kategorie - ABAP

Mit dem modernen ABAP wurden auch neue Schleifen und Möglichkeiten zur Einschränkung von Tabelleninhalten geschaffen. Diese neuen Befehle schauen wir uns in diesem Artikel näher an.

19.02.2021

ABAP - Vergleiche

Kategorie - ABAP

Heute betrachten wir uns das Thema Vergleiche und Vergleichsoperatoren im Hinblick auf die neuen Befehle und die aktuelle Verwendung. Was hat sich bisher alles geändert und was sollte man noch tun.

12.02.2021

ABAP - String Funktionen (Teil 3)

Kategorie - ABAP

In diesem Artikel geht es um weitere neue String Funktionen und einen Ersatz für CONDENSE. Hierbei möchten wir dir noch zeigen, wieso du die neuen Funktionen verwenden solltest.

22.01.2021