Kaum eine Endroutine kommt ohne Fallunterscheidung aus: Ein Kennzeichen wird aus einem Betrag abgeleitet, eine Kategorie aus dem Land, ein Status aus mehreren Feldern. In ABAP steht dafür IF, ELSEIF und ELSE in einer Schleife über das Paket. In SQLScript wandert die gleiche Logik als CASE-Ausdruck in die Feldliste des SELECT.
IF-ELSE
Die ABAP-Routine
Eine Größenklasse aus dem Betrag, drei Stufen.
METHOD end_routine.
LOOP AT result_package ASSIGNING FIELD-SYMBOL(<ls_result>).
IF <ls_result>-amount >= 100000.
<ls_result>-size_class = 'L'.
ELSEIF <ls_result>-amount >= 10000.
<ls_result>-size_class = 'M'.
ELSE.
<ls_result>-size_class = 'S'.
ENDIF.
ENDLOOP.
ENDMETHOD.
Die SQLScript-Fassung
CASE prüft die WHEN-Zweige von oben nach unten und nimmt den ersten Treffer, genau wie IF und ELSEIF. Weil ein Feld berechnet wird, reicht SELECT * nicht mehr: Die Felder werden in der Reihenfolge von outTab aufgelistet, das berechnete Feld bekommt mit AS den Namen des Zielfelds. Ohne ELSE liefert CASE bei keinem Treffer NULL, BW erwartet aber einen Initialwert.
outTab = SELECT doc_number,
doc_item,
amount,
CASE
WHEN amount >= 100000 THEN 'L'
WHEN amount >= 10000 THEN 'M'
ELSE 'S'
END AS size_class,
record,
sql__procedure__source__record
FROM :inTab;
Verschachtelte IF-Anweisungen lassen sich ebenfalls in CASE abbilden:
LOOP AT result_package ASSIGNING FIELD-SYMBOL(<ls_result>).
IF <ls_result>-country = 'DE'.
IF <ls_result>-amount > 50000.
<ls_result>-segment = 'DE-A'.
ELSE.
<ls_result>-segment = 'DE-B'.
ENDIF.
ELSE.
<ls_result>-segment = 'EXPORT'.
ENDIF.
ENDLOOP.
SQLScript erlaubt ein CASE im CASE. Flacher ist es, jeden Pfad durch die Verschachtelung als eigenen WHEN-Zweig mit AND zu schreiben, in der Reihenfolge, in der ABAP die Fälle abarbeitet. Der zweite Zweig braucht keine Prüfung auf den Betrag: Wer dort ankommt, hat den ersten Zweig schon nicht erfüllt.
CASE
WHEN country = 'DE' AND amount > 50000 THEN 'DE-A'
WHEN country = 'DE' THEN 'DE-B'
ELSE 'EXPORT'
END AS segment