Szukaj…


Wprowadzenie

Postęp ABL obsługuje dwie instrukcje warunkowe: IF/THEN/ELSE i CASE .

JEŚLI ... WTEDY ... INNE oświadczenie

W instrukcji IF THEN ELSE wynikiem może być jedna instrukcja:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

IF i = 0 THEN
    MESSAGE "Zero".
ELSE 
    MESSAGE "Something else".

Lub blok, na przykład przez dodanie blokady DO :

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

IF i = 0 THEN DO:
    RUN procedure1.
    RUN procedure2.
END.
ELSE DO: 
    RUN procedure3.
    RUN procedure4.
END.

Kilka instrukcji IF można zagnieżdżać za pomocą ELSE IF -syntax:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

IF i = 0 THEN DO:
    RUN procedure1.
    RUN procedure2.
END.
ELSE IF i = 1 THEN DO:
    RUN procedure3.
    RUN procedure4.

END.
ELSE DO: 
    RUN procedure5.
    RUN procedure6.
END.

ELSE -part nie jest obowiązkowy:

DEFINE VARIABLE l AS LOGICAL     NO-UNDO.

l = TRUE.

IF l = TRUE THEN DO:
    MESSAGE "The l variable has the value TRUE" VIEW-AS ALERT-BOX.
END.

IF / ELSE IF może porównać kilka warunków warunkowych, z połączeniami wewnętrznymi lub bez nich. Dzięki temu możesz zepsuć kod na kilka sposobów:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE l AS LOGICAL     NO-UNDO.

IF i < 30 OR l = TRUE THEN DO:
    
END.
ELSE IF i > 30 AND l = FALSE OR TODAY = DATE("2017-08-20") THEN DO:

END.
ELSE DO:
    MESSAGE "I dont really know what happened here".
END.

WALIZKA

Stan CASE jest znacznie bardziej rygorystyczny niż warunek IF/ELSE . Może porównywać tylko jedną zmienną i tylko równość, nie dużą / mniejszą niż itp.

OKREŚL ZMIENNOŚĆ c JAKO ZNAK NO-UNDO.

CASE c:
    WHEN "A" THEN DO:
        RUN procedureA.
    END.
    WHEN "B" THEN DO:
        RUN procedureB.
    END.
    OTHERWISE DO:
        RUN procedureX.
    END.
END CASE.

Za pomocą OR każdy WHEN może porównywać różne wartości:

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

CASE c:
    WHEN "A" THEN DO:
        RUN procedureA.
    END.
    WHEN "B" OR WHEN "C" THEN DO:
        RUN procedureB-C.
    END.
    OTHERWISE DO:
        RUN procedureX.
    END.
END CASE.

Podobnie jak w przypadku IF każda gałąź może być pojedynczą instrukcją lub blokiem. Podobnie jak w przypadku ELSE , OTHERWISE jest obowiązkowe.

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

CASE c:
    WHEN "A" THEN
        RUN procedureA.
    WHEN "B" OR WHEN "C" THEN
        RUN procedureB-C.
END CASE.

W przeciwieństwie do klauzuli switch stylu c, nie ma potrzeby ucieczki od instrukcji CASE - zostanie wykonana tylko jedna gałąź. Jeśli kilka WHEN pasuje, uruchomi się tylko pierwszy. OTHERWISE musi być ostatnia i uruchomi się tylko wtedy, gdy żadna z powyższych gałęzi się nie zgadza.

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

c = "A".

CASE c:
    WHEN "A" THEN
        MESSAGE "A" VIEW-AS ALERT-BOX. //Only "A" will be messaged
    WHEN "A" OR WHEN "C" THEN
        MESSAGE "A or C" VIEW-AS ALERT-BOX.
END CASE.

JEŚLI ... WTEDY ... funkcja ELSE

IF THEN ELSE można również użyć jako funkcji do zwrócenia pojedynczej wartości. To jest jak trójka ? -operator C.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

/* Set c to "low" if i is less than 5 otherwise set it to "high"    
c = IF i < 5 THEN "low" ELSE "high".

Użycie nawiasów może ułatwić czytelność takiego kodu.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

c = (IF i < 5 THEN "low" ELSE "high").

Wartość IF -part i wartość ELSE -part muszą być tego samego typu danych. W takim przypadku nie można użyć ELSE IF .

DEFINE VARIABLE dat                AS DATE        NO-UNDO.
DEFINE VARIABLE beforeTheFifth     AS LOGICAL   NO-UNDO.

dat = TODAY.

beforeTheFifth = (IF DAY(dat) < 5 THEN TRUE ELSE FALSE).

W zestawieniu IF można wykonać kilka porównań:

DEFINE VARIABLE between5and10 AS LOGICAL     NO-UNDO.
DEFINE VARIABLE i             AS INTEGER     NO-UNDO INIT 7.

between5and10 = (IF i >= 5 AND i <= 10 THEN TRUE ELSE FALSE).

MESSAGE between5and10 VIEW-AS ALERT-BOX.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow