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.
Inhaltsverzeichnis
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.