progress-4gl
Iterieren
Suche…
Einführung
Es gibt mehrere Möglichkeiten, in Progress ABL zu iterieren (schleifen).
WÄHREND
Eine DO WHILE
Schleife wird solange wiederholt, bis der WHILE
Part erfüllt wird. Dies macht es einfach, für immer zu laufen und alle Zeit von einem CPU-Kern zu verbrauchen.
DO WÄHREND Ausdruck :
ENDE.
Ausdruck ist eine Kombination aus Boolescher Logik, Vergleichen, Variablen, Feldern usw., die einen wahren Wert ergibt.
/* 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
Sie können eine beliebige Anzahl von Prüfungen im 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.
Der Compiler hilft Ihnen jedoch nicht, also prüfen Sie, ob der WHILE
schließlich erfüllt ist:
/* 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 [BY-Schritt]
Diese Iteration ändert einen Wert von einem Startpunkt bis zu einem Ende, optional um einen für jeden Schritt angegebenen Wert. Die Standardänderung ist 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.
Ergebnis:
---------------i
10
11
12
13
14
15
Sie können auch über Termine iterieren:
DEFINE VARIABLE dat AS INTEGER NO-UNDO.
DO dat = TODAY TO TODAY + 3:
END.
Und über Dezimalzahlen. Aber dann möchten Sie wahrscheinlich BY
- sonst hätte ein INTEGER
genauso gut gemacht ...
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
DO de = 1.8 TO 2.6 BY 0.2:
DISPLAY "Value" de.
END.
Mit BY
eine negative Zahl verwenden, um von einem höheren zu einem niedrigeren Wert zu gelangen:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
Der Ausdruck wird getestet, bis er nicht mehr erfüllt wird. Dadurch wird der Zähler höher (bei Bewegung nach oben) oder niedriger (bei Bewegung nach unten), sobald die Schleife beendet ist:
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DO i = 5 TO 1 BY -1:
END.
MESSAGE i. // Will message 0
Ein anderes Beispiel:
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)
WIEDERHOLEN
REPEAT wiederholt sich für immer, es sei denn, Sie verlassen die Schleife explizit:
//Runs forever
REPEAT:
// Do stuff
END.
Um die Schleife zu beenden, können Sie das Schlüsselwort LEAVE
. Mit oder ohne Etikett. Ohne Label wirkt sich LEAVE
immer auf die aktuelle Schleife aus. Mit einem Namen können Sie angeben, welche Schleife zu 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.