progress-4gl
Instrukcje warunkowe
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.