Recherche…


Introduction

Il existe plusieurs manières d’itérer (boucler) dans Progress ABL.

FAIRE PENDANT

Une boucle DO WHILE continuera à boucler sauf si la partie WHILE est satisfaite. Cela le rend facile à exécuter pour toujours et à manger à tout moment à partir d'un cœur de processeur.

FAIRE TOUTE expression :

FIN.

expression est une combinaison de logique booléenne, de comparaisons, de variables, de champs, etc., évaluée à une valeur vraie.

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

Vous pouvez utiliser n'importe quel nombre de contrôles dans la partie 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.

Cependant, le compilateur ne vous aidera pas à vérifier que la partie WHILE est finalement remplie:

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

DO var = commencer pour finir [BY step]

Cette itération modifie une valeur d'un point de départ à une fin, éventuellement par une valeur spécifiée pour chaque étape. Le changement par défaut est 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.

Résultat:

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

        10
        11
        12
        13
        14
        15

Vous pouvez également parcourir des dates:

DEFINE VARIABLE dat AS INTEGER        NO-UNDO.

DO dat = TODAY TO TODAY + 3:

END.

Et sur les décimales. Mais alors vous voudrez probablement utiliser BY - sinon un INTEGER aurait fait aussi bien ...

DEFINE VARIABLE de AS DECIMAL     NO-UNDO.

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

En utilisant BY un nombre négatif , vous pouvez également passer d'un plus à une valeur inférieure:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

L'expression sera testée jusqu'à ce qu'elle ne soit plus remplie. Cela rend le compteur plus haut (si vous vous déplacez vers le haut) ou plus bas (si vous vous déplacez vers le bas) une fois la boucle terminée:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

MESSAGE i. // Will message 0

Un autre exemple:

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)

RÉPÉTER

REPEAT, se répète pour toujours sauf si vous quittez explicitement la boucle:

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

Pour quitter la boucle, vous pouvez utiliser le mot-clé LEAVE . Avec ou sans étiquette. Sans étiquette, LEAVE affectera toujours la boucle en cours. Avec un nom, vous pouvez spécifier la boucle à 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow