Sök…


Introduktion

Det finns flera sätt att iterera (looping) i Progress ABL.

GÖRA MEDAN

En DO WHILE slinga fortsätter att slinga om WHILE WHILE-delen uppfylls. Detta gör det enkelt att köra för alltid och äta upp hela tiden från en CPU-kärna.

DO WHILE uttryck :

SLUTET.

uttryck är en kombination av booleska logik, jämförelser, variabler, fält etc som utvärderas till ett verkligt värde.

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

Du kan använda valfritt antal kontroller i WHILE delen:

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.

Men kompilatorn kommer inte att hjälpa dig så kontrollera att WHILE så småningom uppfylls:

/* 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 TILL slut [BY steg]

Denna iteration ändrar ett värde från en startpunkt till ett slut, valfritt med ett specificerat värde för varje steg. Standardförändringen är 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.

Resultat:

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

        10
        11
        12
        13
        14
        15

Du kan också upprepa över datum:

DEFINE VARIABLE dat AS INTEGER        NO-UNDO.

DO dat = TODAY TO TODAY + 3:

END.

Och över decimaler. Men då vill du troligtvis använda BY - annars skulle en INTEGER ha gjort lika bra ...

DEFINE VARIABLE de AS DECIMAL     NO-UNDO.

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

Använda BY ett negativt tal du kan också gå från en högre till ett lägre värde:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

Uttrycket testas tills det inte längre uppfylls. Detta gör att räknaren är högre (om den rör sig uppåt) eller lägre (om den rör sig nedåt) när slingan är klar:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

MESSAGE i. // Will message 0

Ett annat exempel:

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)

UPPREPA

REPEAT, kommer att upprepa sig själv för alltid om du inte uttryckligen lämnar slingan:

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

För att lämna slingan kan du använda LEAVE nyckelordet. Med eller utan etikett. Utan en etikett kommer LEAVE alltid att påverka den aktuella slingan. Med ett namn kan du ange vilken slinga som ska 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow