ABAP - Vergleiche
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.
Inhaltsverzeichnis
Immer wieder sehen wir in Code Reviews noch die Verwendung der alten Operatoren oder das für True/False noch Literale verwendet werden. Im heutigen Artikel wollen wir einmal auf die aktuellen Standards und neuen Befehle in diesem Umfeld eingehen.
Vergleichsoperatoren
Viele Entwickler verwenden noch heute die klassischen ABAP Vergleichsoperatoren wie EQ, NE, GT, GE, LT oder LE. Mittlerweile ist man aber dazu übergegangen auf die "normalen" Vergleichsoperatoren ( =, <>, >, >=, <, <= ) zurückzugreifen, da diese bei Vergleichen und Datenbankzugriffen einfach und klar sind. Dies erhöht auch etwas die Lesbarkeit bei der Verwendung, um sich von Schlüsselwörtern zu unterscheiden und einen klaren Vergleich herauszustellen. Ebenfalls erleichtert diese Methode den Einstieg für jüngere Entwickler, die bisher eher Erfahrungen im JAVA oder Python Bereich gesammelt haben.
Es gibt aber auch Operatoren die durchaus verwendet werden können, wenn du zum Beispiel prüfen willst ob ein String in einer Zeichenkette enthalten ist (CS) oder ein Pattern in einer Zeichenkette vorkommt (CP). Hier ist es noch üblich auf die kurze Schreibweise zu wechseln.
Boolean
Offiziell besitzt ABAP keinen echten Datentypen Boolean, so wie ihn fast alle anderen Sprachen haben. Hier wird seit Jahren auf dem Datentypen CHAR mit einem Zeichen Länge gearbeitet. True entspricht einem großen "X" und False ist initial oder auch über die Konstante "space" abgebildet. Leider sehen wir immer wieder, dass bei Methodenschnittstellen auf CHAR1 verwiesen wird, oder bei den Vergleichen gegen Literale verglichen wird.
Dabei gibt es schon seit sehr langer Zeit die Typgruppe ABAP, dort findet man den entsprechenden Datentypen. Mittlerweile muss man die Typgruppen auch nicht mehr aktiv im Coding einbinden, sondern diese sind immer verfügbar. Als Vergleich gibt es daher ABAP_TRUE und ABAP_FALSE, diese können für die Vergleiche herangezogen werden. Der Datentyp ABAP_BOOL kann für die Definition von Variablen und Schnittstellenparametern genutzt werden. Möchtest du ein Datenelement, welches auch auf Dynpros verwendet wird, empfehlen wir ABAP_BOOLEAN.
DATA:
ld_compare TYPE abap_boolean.
IF ld_compare = abap_true.
" Do Something
ENDIF.
XSDBOOL
Bei dem Befehl handelt es sich um einen neuen Ausdruck, mit dem man einen Vergleich durchführen kann und damit ein Wahr oder Falsch erhält. In vielen Situationen kann das ein wenig an Code einsparen oder sogar große Abfragen in kleinere Teile aufbrechen. In dem folgenden Beispiel einmal eine Methode, die einen boolschen Wert zurückgibt, wenn Einträge in einer Tabelle gefunden wurden.
SELECT FROM zbs_dy_t001
FIELDS bukrs, butxt, land1
INTO TABLE @DATA(lt_company_codes).
" Old
IF sy-subrc = 0.
rd_found = abap_true.
ELSE.
rd_found = abap_false.
ENDIF.
" New
rd_found = xsdbool( sy-subrc = 0 ).
COND
Die Befehl ist eher ein Ersatz für das Konstrukt von If und Else If und kann für einfache Aufgaben, bei der zum Beispiel nur ein Wert gesetzt wird, verwendet werden. Damit kannst du das ganze Konstrukt etwas kompakter darstellen und hast auch hier die Möglichkeiten eine Exception zu erzeugen, wenn zum Beispiel gar kein Fall eintritt und der Wert fehlerhaft ist.
DATA:
ld_value TYPE i VALUE 42,
ld_result TYPE abap_boolean.
" Old
IF ld_value > 40.
ld_result = abap_true.
ELSEIF ld_value > 0.
ld_result = abap_false.
ELSE.
RAISE EXCEPTION NEW cx_sy_arg_out_of_domain( ).
ENDIF.
" New
ld_result = COND #( WHEN ld_value > 40 THEN abap_true
WHEN ld_value > 0 THEN abap_false
ELSE THROW cx_sy_arg_out_of_domain( ) ).
SWITCH
Der Switch Befehl erfüllt die gleiche Funktion wie der CASE und sollte bereits aus Sprachen wie PHP bekannt sein. Dazu auch ein ähnliches Beispiel wie bei COND, da im Grunde ein ähnliches Ergebnis heraus kommt. Wie dir bestimmt schon aufgefallen ist, kann der Befehl ebenfalls zur Inline-Deklaration verwendet werden.
DATA:
ld_value TYPE i VALUE 42,
ld_result TYPE abap_boolean.
" Old
CASE ld_value.
WHEN 42.
ld_result = abap_true.
WHEN 39.
ld_result = abap_false.
WHEN OTHERS.
RAISE EXCEPTION NEW cx_sy_arg_out_of_domain( ).
ENDCASE.
" New
ld_result = SWITCH #( ld_value
WHEN 42 THEN abap_true
WHEN 39 THEN abap_false
ELSE THROW cx_sy_arg_out_of_domain( ) ).
Fazit
Auch innerhalb der Vergleich von ABAP hat sich einiges getan und die Sprache wurde etwas moderner gestaltet. Bei all den kürzeren Schreibweisen, solltest du aber auch auf eine ordentliche Formatierung achten, sonst kann neuer Quellcode auch schnell mal schwer lesbar werden, eigentlich das was man mit Clean Code vermeiden möchte.
Quelle:
ABAP Dokumentation - XSDBOOL
ABAP Dokumentation - COND
ABAP Dokumentation - SWITCH