ABAP CASE-Anweisung: Mehrfachverzweigungen für übersichtlichen Code

kategorie
ABAP-Statements
Veröffentlicht
autor
Johannes

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 im WHEN-Zweig übereinstimmt.
  • WHEN OTHERS: Ein optionaler Zweig, der alle Werte abfängt, die von keinem der vorherigen WHEN-Zweige abgedeckt wurden. Es ist eine gute Praxis, diesen Zweig oft einzubauen, um unerwartete Werte zu behandeln.
  • ENDCASE: Schließt die CASE-Struktur zwingend ab.

Funktionsweise und Ablauf

  1. Der Wert des <operand> wird einmal bestimmt.
  2. Dieser Wert wird sequenziell (von oben nach unten) mit den Werten in den WHEN-Zweigen verglichen.
  3. Sobald der Wert des Operanden mit einem Wert in einem WHEN-Zweig übereinstimmt, wird der zugehörige Anweisungsblock ausgeführt.
  4. Wichtig: Nach der Ausführung dieses Blocks springt die Kontrolle sofort zur Anweisung nach ENDCASE. Es werden keine weiteren WHEN-Zweige innerhalb derselben CASE-Struktur mehr geprüft oder ausgeführt – das “erste passende WHEN gewinnt”.
  5. Wenn keiner der WHEN-Zweige passt, wird der WHEN OTHERS-Block ausgeführt (falls vorhanden).
  6. Wenn keiner der WHEN-Zweige passt und kein WHEN OTHERS-Block vorhanden ist, wird keiner der Blöcke innerhalb der CASE-Struktur ausgeführt, und das Programm läuft nach ENDCASE 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 passieren
ENDCASE.

3. CASE für Benutzereingabe

DATA user_command TYPE sy-ucomm. " Systemfeld für OK-Codes
user_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.