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.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow