Ricerca…


introduzione

Esistono diversi modi per iterare (loop) in Progress ABL.

FARE MENTRE

Un ciclo DO WHILE continuerà ad effettuare il ciclo a meno che non venga soddisfatta la parte WHILE . Questo rende facile girare all'infinito e consumare tutto il tempo da un core della CPU.

DO WHILE espressione :

FINE.

espressione è una qualsiasi combinazione di logica booleana, confronti, variabili, campi ecc. che valuta un valore reale.

/* 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

Puoi utilizzare qualsiasi numero di controlli nella 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.

Tuttavia, il compilatore non ti aiuterà a controllare che la parte WHILE sia soddisfatta:

/* Oops. Didnt increase i. This will run forever... */
DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DO WHILE i < 10:
    i = 1.
END.

DO var = start TO finish [BY step]

Questa iterazione modifica un valore da un punto iniziale a un fine, facoltativamente da un valore specificato per ogni passaggio. La modifica predefinita è 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.

Risultato:

---------------i

        10
        11
        12
        13
        14
        15

Puoi anche scorrere le date:

DEFINE VARIABLE dat AS INTEGER        NO-UNDO.

DO dat = TODAY TO TODAY + 3:

END.

E oltre i decimali. Ma molto probabilmente vorrai usare BY - altrimenti un INTEGER avrebbe fatto altrettanto bene ...

DEFINE VARIABLE de AS DECIMAL     NO-UNDO.

DO de = 1.8 TO 2.6 BY 0.2:
    DISPLAY "Value" de.
END.

Usando BY un numero negativo puoi anche passare da un valore superiore a un valore inferiore:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

DO i = 5 TO 1 BY -1:
    
END.

L'espressione sarà testata fino a quando non sarà più soddisfatta. Questo fa sì che il contatore sia più alto (se si muove verso l'alto) o più basso (se si muove verso il basso) una volta che il ciclo è finito:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

DO i = 5 TO 1 BY -1:
    
END.

MESSAGE i. // Will message 0

Un altro esempio:

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)

RIPETERE

REPEAT, si ripeterà per sempre a meno che tu non esca esplicitamente dal ciclo:

//Runs forever
REPEAT:
    // Do stuff
END.

Per uscire dal ciclo puoi usare la parola chiave LEAVE . Con o senza etichetta. Senza un'etichetta LEAVE avrà sempre effetto sul loop corrente. Con un nome è possibile specificare quale ciclo 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow