Die CASE
-Anweisung ist eine Kontrollstruktur für Mehrfachverzweigungen in ABAP. Sie bietet eine oft
übersichtlichere Alternative zu einer langen Kette von IF...ELSEIF...ELSE...ENDIF
-Anweisungen, insbesondere dann, wenn
der Programmfluss davon abhängt, welchen von mehreren spezifischen, diskreten Werten eine einzige Variable (oder
ein Ausdruck) hat.
Man prüft also den Wert eines Operanden und führt dann den Code-Block aus, der zu diesem Wert passt.
Syntax
CASE <operand>. WHEN <wert1> [OR <wert1a> OR <wert1b> ...]. " Anweisungsblock 1 " Wird ausgeführt, wenn <operand> = <wert1> ODER <wert1a> ODER <wert1b> ... ist. [Anweisungen...]
WHEN <wert2> [OR <wert2a> ...]. " Anweisungsblock 2 " Wird ausgeführt, wenn <operand> = <wert2> ODER <wert2a> ... ist " UND keine vorherige WHEN-Bedingung zutraf. [Anweisungen...]
" ... weitere WHEN-Zweige ...
[WHEN OTHERS. " Optionaler Zweig für alle anderen Fälle " Anweisungsblock 'Sonstige' " Wird ausgeführt, wenn <operand> auf KEINEN der Werte in den " vorherigen WHEN-Zweigen passt. [Anweisungen...]]
ENDCASE.
CASE <operand>
: Leitet die Struktur ein.<operand>
ist die Variable oder der Ausdruck, dessen Wert geprüft wird.WHEN <wert>
: Definiert einen möglichen Fall (eine Verzweigung).<wert>
ist ein konstanter Wert (z. B. ein Literal wie'A'
,123
oder eine Konstante), mit dem der<operand>
verglichen wird.OR <wertX>
: Optional. Ermöglicht es, mehrere Werte anzugeben, bei denen derselbe Anweisungsblock ausgeführt werden soll.Anweisungsblock
: Der Block von ABAP-Code, der ausgeführt wird, wenn der Wert des<operand>
mit einem der Werte imWHEN
-Zweig übereinstimmt.WHEN OTHERS
: Ein optionaler Zweig, der alle Werte abfängt, die von keinem der vorherigenWHEN
-Zweige abgedeckt wurden. Es ist eine gute Praxis, diesen Zweig oft einzubauen, um unerwartete Werte zu behandeln.ENDCASE
: Schließt dieCASE
-Struktur zwingend ab.
Funktionsweise und Ablauf
- Der Wert des
<operand>
wird einmal bestimmt. - Dieser Wert wird sequenziell (von oben nach unten) mit den Werten in den
WHEN
-Zweigen verglichen. - Sobald der Wert des Operanden mit einem Wert in einem
WHEN
-Zweig übereinstimmt, wird der zugehörige Anweisungsblock ausgeführt. - Wichtig: Nach der Ausführung dieses Blocks springt die Kontrolle sofort zur Anweisung nach
ENDCASE
. Es werden keine weiterenWHEN
-Zweige innerhalb derselbenCASE
-Struktur mehr geprüft oder ausgeführt – das “erste passende WHEN gewinnt”. - Wenn keiner der
WHEN
-Zweige passt, wird derWHEN OTHERS
-Block ausgeführt (falls vorhanden). - Wenn keiner der
WHEN
-Zweige passt und keinWHEN OTHERS
-Block vorhanden ist, wird keiner der Blöcke innerhalb derCASE
-Struktur ausgeführt, und das Programm läuft nachENDCASE
weiter.
Abgrenzung zu IF...ELSEIF...
CASE
: Ideal, wenn ein Wert gegen mehrere feste Einzelwerte geprüft wird. Oft lesbarer und kürzer.IF...ELSEIF...
: Flexibler für komplexere Bedingungen, Bereichsprüfungen (>
,<
), Verknüpfungen (AND
,OR
) oder wenn verschiedene Variablen in den Bedingungen geprüft werden müssen.
Moderne Alternative: Der SWITCH
-Operator (ab ABAP 7.40)
Für Zuweisungen, die auf dem Wert einer Variablen basieren, gibt es den SWITCH
-Operator, der eine kompaktere
Inline-Syntax bietet:
DATA(beschreibung) = SWITCH zusatztyp( transportmittel WHEN 'F' THEN 'Fahrrad' WHEN 'A' THEN 'Auto' WHEN 'B' THEN 'Bus' ELSE 'Unbekannt' ).
CASE
bleibt jedoch die Standardanweisung zur Steuerung von Anweisungsblöcken.
Beispiele
1. CASE
für einen Statuscode (Zeichen)
DATA document_status TYPE c LENGTH 1.document_status = 'R'. " R=Released, B=Blocked, N=New
CASE document_status. WHEN 'N'. WRITE / 'Dokument ist neu und noch nicht bearbeitet.'. WHEN 'R'. WRITE / 'Dokument ist freigegeben.'. " Dieser Block wird ausgeführt WHEN 'B'. WRITE / 'Dokument ist gesperrt.'. WHEN OTHERS. WRITE / 'Warnung: Unbekannter Dokumentstatus:', document_status.ENDCASE.
2. CASE
für Monatsnummern mit OR
DATA current_month TYPE i.current_month = sy-datum+4(2). " Extrahiert den Monat aus dem Systemdatum
CASE current_month. WHEN 1 OR 2 OR 3. WRITE / 'Erstes Quartal'. WHEN 4 OR 5 OR 6. WRITE / 'Zweites Quartal'. " Dieser Block wird im April ausgeführt WHEN 7 OR 8 OR 9. WRITE / 'Drittes Quartal'. WHEN 10 OR 11 OR 12. WRITE / 'Viertes Quartal'. WHEN OTHERS. WRITE / 'Ungültiger Monat extrahiert!'. " Sollte nicht passierenENDCASE.
3. CASE
für Benutzereingabe
DATA user_command TYPE sy-ucomm. " Systemfeld für OK-Codesuser_command = 'SAVE'.
CASE user_command. WHEN 'SAVE'. WRITE / 'Aktion: Speichern wird ausgeführt.'. " ... Code zum Speichern ... WHEN 'BACK' OR 'EXIT' OR 'CANCEL'. WRITE / 'Aktion: Zurück oder Abbrechen.'. LEAVE TO SCREEN 0. " Beispielaktion WHEN OTHERS. WRITE / 'Aktion: Unbekannter oder nicht behandelter Befehl.'.ENDCASE.
4. CASE
ohne WHEN OTHERS
DATA flag TYPE c LENGTH 1 VALUE 'X'.
CASE flag. WHEN 'A'. WRITE / 'Flag ist A'. WHEN 'B'. WRITE / 'Flag ist B'.ENDCASE.
" Da flag = 'X' ist und kein WHEN OTHERS existiert, wird kein Block ausgeführt.WRITE / 'Nach dem CASE-Block.'.
Wichtige Hinweise / Best Practice
CASE
ist sehr nützlich zur Verbesserung der Lesbarkeit bei Vergleichen eines Operanden mit vielen festen Werten.- Verwenden Sie den
WHEN OTHERS
-Zweig, um sicherzustellen, dass Ihr Programm auch auf unerwartete oder nicht explizit behandelte Werte robust reagiert. - Denken Sie an die “First Match Wins”-Logik: Nur der erste passende
WHEN
-Zweig wird ausgeführt. - Vergessen Sie nicht das abschließende
ENDCASE
.