progress-4gl
Declaraciones condicionales
Buscar..
Introducción
Progress ABL es compatible con dos declaraciones de contenido: IF/THEN/ELSE
y CASE
.
SI ... ENTONCES ... otra declaración
En la declaración IF THEN ELSE
, el resultado puede ser una sola declaración:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
IF i = 0 THEN
MESSAGE "Zero".
ELSE
MESSAGE "Something else".
O un bloque, por ejemplo, agregando un bloque 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.
Varias declaraciones IF
se pueden anidar con la sintaxis ELSE IF
:
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 parte ELSE
no es obligatoria:
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
puede comparar varios condicionales, con o sin conexiones internas. Esto te deja libre de desordenar tu código de varias maneras:
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.
CASO
La declaración CASE
es mucho más estricta que la condición IF/ELSE
. Solo puede comparar una sola variable y solo igualdad, no más grande / más pequeña que etc.
DEFINIR VARIABLE c COMO CARÁCTER 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.
Usando un OR
cada WHEN
puede comparar diferentes valores:
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.
Al igual que con la declaración IF
cada rama puede ser una sola declaración o un bloque. Al igual que con el ELSE
-statement, OTHERWISE
no es obligatorio.
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.
A diferencia de un c-estilo switch
-clause no hay necesidad de escapar del CASE
-statement - sólo una rama se ejecutará. Si varios WHEN
coinciden, solo el primero se activará. OTHERWISE
debe ser el último y solo se activará si ninguna de las ramas anteriores coincide.
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.
SI ... ENTONCES ... otra función
IF THEN ELSE
también se puede usar como una función para devolver un solo valor. Esto es muy parecido al ternario ?
-operador 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".
El uso de paréntesis puede facilitar la legibilidad de códigos como este.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE c AS CHARACTER NO-UNDO.
c = (IF i < 5 THEN "low" ELSE "high").
El valor de la parte IF
y el valor de la parte ELSE
deben ser del mismo tipo de datos. No es posible usar ELSE IF
en este caso.
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).
Se pueden hacer varias comparaciones en la declaración 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.