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.


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow