progress-4gl
Expressions conditionnelles
Recherche…
Introduction
Progress ABL prend en charge deux instructions conditionnelles: IF/THEN/ELSE
et CASE
.
IF ... THEN ... ELSE-statement
Dans l'instruction IF THEN ELSE
, le résultat peut être soit une seule instruction:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
IF i = 0 THEN
MESSAGE "Zero".
ELSE
MESSAGE "Something else".
Ou un bloc, par exemple en ajoutant un bloc 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.
Plusieurs états IF
peuvent être imbriqués avec 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.
La partie ELSE
n'est pas obligatoire:
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.
Le IF
/ ELSE IF
peut comparer plusieurs conditions, avec ou sans connexions internes. Cela vous laisse libre de gâcher votre code de plusieurs manières:
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.
CAS
L'instruction CASE
est beaucoup plus stricte que la condition IF/ELSE
. Il ne peut comparer qu'une seule variable et seulement une égalité, pas une plus petite / plus grande que etc.
DEFINE VARIABLE c AS CARACTERE NON-UNDO.
CASE c:
WHEN "A" THEN DO:
RUN procedureA.
END.
WHEN "B" THEN DO:
RUN procedureB.
END.
OTHERWISE DO:
RUN procedureX.
END.
END CASE.
En utilisant un OR
chaque WHEN
peut comparer différentes valeurs:
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.
Tout comme avec l'information IF
chaque branche peut être une seule instruction ou un bloc. Tout comme avec l' ELSE
-Déclaration, OTHERWISE
est pas obligatoire.
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.
Contrairement à un switch
style c, il n'est pas nécessaire d'échapper à l'instruction CASE
- une seule branche sera exécutée. Si plusieurs correspond à WHEN
, seul le premier se déclenchera. OTHERWISE
doit être dernier et ne se déclenchera que si aucune des branches ci-dessus ne correspond.
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.
IF ... THEN ... ELSE-function
IF THEN ELSE
peut également être utilisé comme une fonction pour renvoyer une seule valeur. C'est beaucoup comme le ternaire ?
-opérateur de 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".
L'utilisation de parenthèses peut faciliter la lisibilité du code comme celui-ci.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
c = (IF i < 5 THEN "low" ELSE "high").
La valeur de la partie IF
et la valeur de la partie ELSE
doivent être du même type. Il n'est pas possible d'utiliser ELSE IF
dans ce cas.
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).
Plusieurs comparaisons peuvent être effectuées dans le 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.