progress-4gl
Iterando
Buscar..
Introducción
Hay varias formas de iterar (hacer un bucle) en Progress ABL.
Hacer mientras
Un bucle DO WHILE
continuará en bucle a menos que se cumpla la parte WHILE
. Esto hace que sea fácil de ejecutar para siempre y consumir todo el tiempo desde un núcleo de CPU.
DO WHILE expresión :
FIN.
expresión es cualquier combinación de lógica booleana, comparaciones, variables, campos, etc. que se evalúa a un valor verdadero.
/* This is a well defined DO WHILE loop that will run as long as i is lower than 10*/
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE i < 10:
i = i + 1.
END.
DISPLAY i. // Will display 10
Puede usar cualquier número de cheques en la parte WHILE
:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE TODAY = DATE("2017-02-06") AND RANDOM(1,100) < 99:
i = i + 1.
END.
MESSAGE i "iterations done" VIEW-AS ALERT-BOX.
Sin embargo, el compilador no te ayudará, así que verifica que finalmente se cumpla la parte WHILE
:
/* Oops. Didnt increase i. This will run forever... */
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO WHILE i < 10:
i = 1.
END.
DO var = empezar A terminar [POR paso]
Esta iteración cambia un valor desde un punto de inicio hasta un final, opcionalmente por un valor específico para cada paso. El cambio por defecto es 1.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 10 TO 15:
DISPLAY i WITH FRAME x1 6 DOWN .
DOWN WITH FRAME x1.
END.
Resultado:
---------------i
10
11
12
13
14
15
Puede iterar sobre fechas también:
DEFINE VARIABLE dat AS INTEGER NO-UNDO.
DO dat = TODAY TO TODAY + 3:
END.
Y sobre decimales. Pero lo más probable es que quieras usar BY
; de lo contrario, un INTEGER
habría funcionado igual de bien ...
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
DO de = 1.8 TO 2.6 BY 0.2:
DISPLAY "Value" de.
END.
Usando BY
un número negativo, también puede pasar de un valor más alto a uno más bajo:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
La expresión se probará hasta que ya no se cumpla. Esto hace que el contador sea más alto (si se mueve hacia arriba) o más bajo (si se mueve hacia abajo) una vez que se termina el ciclo:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
MESSAGE i. // Will message 0
Otro ejemplo:
DEFINE VARIABLE da AS DATE NO-UNDO.
DISPLAY TODAY. //17/02/06
DO da = TODAY TO TODAY + 10:
END.
DISPLAY da. //17/02/17 (TODAY + 11)
REPETIR
REPETIR, se repetirá para siempre a menos que salga explícitamente del bucle:
//Runs forever
REPEAT:
// Do stuff
END.
Para salir del bucle puede utilizar la palabra clave LEAVE
. Con o sin etiqueta. Sin una etiqueta, LEAVE
siempre afectará el bucle actual. Con un nombre puede especificar qué bucle para LEAVE
.
/* Without a label */
REPEAT:
//Do stuff
IF TRUE THEN LEAVE.
END.
/* With a label */
loopLabel:
REPEAT:
//Do stuff
IF <somecondition> THEN LEAVE loopLabel.
END.
/* Two nested REPEATS */
DEFINE VARIABLE i AS INTEGER NO-UNDO.
loopLabelOne:
REPEAT:
loopLabelTwo:
REPEAT:
i = i + 1.
IF RANDOM(1,100) = 1 THEN LEAVE loopLabelTwo.
IF RANDOM(1,100) = 1 THEN LEAVE loopLabelOne.
END.
IF RANDOM(1,100) = 1 THEN LEAVE loopLabelOne.
END.
DISPLAY i.