Zoeken…


Invoering

Er zijn verschillende manieren om itereren (looping) in Progress ABL.

DOEN TERWIJL

Een DO WHILE lus blijft doorgaan, tenzij aan het WHILE wordt voldaan. Dit maakt het gemakkelijk om voor altijd te lopen en alle tijd op te eten van één CPU-kern.

DOEN terwijl uitdrukking :

EINDE.

expressie is elke combinatie van booleaanse logica, vergelijkingen, variabelen, velden enz. die resulteert in een echte waarde.

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

U kunt een willekeurig aantal controles in het WHILE -deel gebruiken:

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.

De compiler helpt u echter niet, dus controleer of het WHILE -onderdeel uiteindelijk wordt gehaald:

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

Deze iteratie verandert een waarde van een beginpunt naar een einde, optioneel met een opgegeven waarde voor elke stap. De standaard wijziging is 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.

Resultaat:

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

        10
        11
        12
        13
        14
        15

Je kunt ook datums herhalen:

DEFINE VARIABLE dat AS INTEGER        NO-UNDO.

DO dat = TODAY TO TODAY + 3:

END.

En meer dan decimalen. Maar dan wilt u waarschijnlijk BY - anders zou een INTEGER net zo goed hebben gedaan ...

DEFINE VARIABLE de AS DECIMAL     NO-UNDO.

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

Met behulp van BY een negatief getal kunt u ook van een hogere naar een lagere waarde:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

De uitdrukking wordt getest totdat er niet meer aan wordt voldaan. Dit maakt de teller hoger (als u naar boven gaat) of lager (als u naar beneden gaat) als de lus klaar is:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

MESSAGE i. // Will message 0

Een ander voorbeeld:

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)

HERHALING

REPEAT, herhaalt zichzelf voor altijd, tenzij je expliciet de lus verlaat:

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

Om de lus te verlaten, kunt u het sleutelwoord LEAVE . Met of zonder label. Zonder label heeft LEAVE altijd invloed op de huidige lus. Met een naam kunt u opgeven welke lus moet worden 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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow