progress-4gl
Условные утверждения
Поиск…
Вступление
Progress ABL поддерживает две условные инструкции: IF/THEN/ELSE
и CASE
.
ЕСЛИ ... ТОГДА ... ELSE-заявление
В заявлении IF THEN ELSE
результатом может быть либо одно заявление:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
IF i = 0 THEN
MESSAGE "Zero".
ELSE
MESSAGE "Something else".
Или блок, например, добавив DO
-block:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
IF i = 0 THEN DO:
RUN procedure1.
RUN procedure2.
END.
ELSE DO:
RUN procedure3.
RUN procedure4.
END.
Несколько IF
состояний могут быть вложены в 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
не является обязательной:
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
может сравнивать несколько условных ELSE IF
с внутренними соединениями или без них. Это дает вам возможность испортить ваш код несколькими способами:
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.
ДЕЛО
CASE
заявка намного более строгая, чем IF/ELSE
-conditional. Он может сравнивать только одну переменную и только равенство, не крупнее и меньше, чем и т. Д.
ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОГО КАК ХАРАКТЕР НЕТ-UNDO.
CASE c:
WHEN "A" THEN DO:
RUN procedureA.
END.
WHEN "B" THEN DO:
RUN procedureB.
END.
OTHERWISE DO:
RUN procedureX.
END.
END CASE.
Спользование OR
каждый WHEN
может сравнить различные значения:
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.
Точно так же, как и в случае IF
state, каждая ветка может быть либо одним выражением, либо блоком. Так же , как с ELSE
-statement, OTHERWISE
не является обязательным.
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.
В отличие от c-style switch
-clause нет необходимости выходить из CASE
state - только одна ветка будет выполнена. Если несколько WHEN
s совпадают только с первым, будет срабатывать. OTHERWISE
должен быть последним и будет срабатывать только в том случае, если ни одна из ветвей выше не соответствует.
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.
ЕСЛИ ... ТОГДА ... ELSE-функция
IF THEN ELSE
также может использоваться как функция для возврата одного значения. Это очень похоже на тройной ?
-оператор С.
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".
Использование круглых скобок может облегчить читабельность кода таким образом.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
c = (IF i < 5 THEN "low" ELSE "high").
Значение IF
и значение ELSE
должно быть одного и того же типа данных. В этом случае использовать 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).
В IF
заявке можно провести несколько сравнений:
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.