progress-4gl
Itérer
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.