CASE <Ausdruck> OF <Wertmenge 1>: <Anweisung 1>; <Wertmenge 2>: <Anweisung 2>; ... <Wertmenge n>: <Anweisung n>; [ELSE <Anweisung n+1>] END;
CASE
Der CASE-Befehl ist eine Art der Kontrollstrukturen und wird verwendet um mehrere Anweisungen, je nach Auswertung der Bedingung, auszuführen.
Weitere Informationen
In dieser Definition kann <Ausdruck> kein Datensatz sein und <Wertmenge> muss ein Ausdruck oder ein Bereich sein.
CASE-Befehle werden auch Multiple-Option-Befehle genannt und werden typischerweise verwendet, wenn Sie zwischen mehr als zwei verschiedenen Aktionen wählen müssen. Die Funktionsweise der CASE-Anweisung lautet wie folgt:
Der <Ausdruck> wird ausgewertet, und die erste übereinstimmende Wertemenge, falls vorhanden, führt die zugehörige Anweisung aus.
Wenn keine Wertemenge mit dem Wert des Ausdrucks übereinstimmt und der optionale ELSE-Teil weggelassen wurde, wird keine Aktion durchgeführt. Wird der optionale ELSE-Teil verwendet, so wird die zugehörige Anweisung ausgeführt.
Der Datentyp der Wertemengen muss mit dem Datentyp von <Ausdruck> übereinstimmen oder zumindest in den gleichen Datentyp konvertierbar sein.
In den meisten Fällen wird der Datentyp der Wertemengen in den Datumstyp des ausgewerteten Ausdrucks konvertiert. Außer es handelt sich bei dem auszuwertenden Ausdruck um eine Code-Variable. Wenn es sich bei dem ausgewerteten Ausdruck um eine Code-Variable handelt, werden die Wertemengen nicht in den Datentyp Code konvertiert.
Diese Typkonvertierung kann zur Laufzeit zu einem Overflow führen, wenn der resultierende Datentyp die Werte der Datensätze nicht annehmen kann.
Programmierkonventionen
Wird der CASE-Befehl verwendet, müssen die Wertemengen um zwei Leerzeichen eingerückt werden. Sind zwei oder mehrere Werte in derselben Zeile, dann werden sie durch Kommata ohne Leerzeichen getrennt. Auf den letzten in einer Zeile gesetzten Wert folgt unmittelbar ein Doppelpunkt ohne vorangestelltes Leerzeichen. Die Aktion beginnt in der Zeile nach der Wertemenge und wird durch zwei Leerzeichen weiter eingerückt. Gibt es ein BEGIN, dann wird es auf eine separate Zeile gesetzt, es sei denn, es folgt ELSE. Folgt ein BEGIN auf einen ELSE, dann sollten beide auf derselben Zeile stehen.
Wenn es mehr als zwei Alternativen gibt, sollte der CASE-Befehl verwendet werden. Andernfalls sollte der IF-THEN-ELSE-Befehl verwendet werden.
Beispiel 1
Folgendes Beispiel veranschaulicht die unterschiedlichen Programmierkonventionen.
CASE Field OF Field::A: BEGIN x += 1; y := -y - 1; END; Field::B: x := y; Field::C,Field::D: y := x; ELSE BEGIN y := x; a := b; END; END;
Beispiel 2
Das folgende Beispiel veranschaulicht wie abhängig vom Wert von Nummer verschiedene Meldungen ausgegeben werden. Stimmt Nummer mit keinem der Einträge in der CASE-Struktur überein, wird die ELSE-Anweisung verwendet.
CASE Nummer OF 1,2,9: MESSAGE('1, 2, oder 9.'); 10..100: MESSAGE('Im Bereich von 10 bis 100.'); ELSE MESSAGE('Weder 1, 2, 9, noch im Bereich von 10 bis 100.'); END;
Beispiel 3
Folgendes Beispiel zeigt, wie Wertemengen, bei denen es sich um einen Code-Datentyp handelt, in einer CASE-Anweisung ausgewertet werden.
Zunächst wird folgende Variable hinterlegt.
Name | Datentyp | Subtyp |
---|---|---|
MeinCode | Code |
Anschließend wird folgender C/AL-Code eingefügt.
MeinCode := 'ABC'; CASE MeinCode OF 'abc': MESSAGE('Diese Meldung wird nicht angezeigt.'); 'def': MESSAGE('Diese Meldung wird nicht angezeigt.'); ELSE MESSAGE('Die Wertemenge stimmt nicht mit dem Ausdruck überein.'); END;
Die Wertemenge 'abc' wird nicht konvertiert, da der ausgewertete Ausdruck MeinCode eine Code-Variable ist.
Beispiel 4
Folgendes Beispiel öffnet, je nach Kontakt Geschäftsbeziehung, die entsprechende Seite (Entweder Debitor-, Kreditor, oder Bankkonto Karte).
Zunächst werden folgende Variablen hinterlegt.
Name | Datentyp | Subtyp |
---|---|---|
ContBusRel | Record | Contact Business Relation |
Customer | Record | Customer |
Vendor | Record | Vendor |
BankAcc | Record | Bank Account |
CompanyNo | Code |
Anschließend wird folgender C/AL-Code eingefügt.
IF ContBusRel.FINDFIRST THEN CASE ContBusRel."Link to Table" OF ContBusRel."Link to Table"::Customer: BEGIN Customer.GET(ContBusRel."No."); PAGE.RUN(PAGE::"Customer Card",Customer); END; ContBusRel."Link to Table"::Vendor: BEGIN Vendor.GET(ContBusRel."No."); PAGE.RUN(PAGE::"Vendor Card",Vendor); END; ContBusRel."Link to Table"::"Bank Account": BEGIN BankAcc.GET(ContBusRel."No."); PAGE.RUN(PAGE::"Bank Account Card",BankAcc); END; END;