progress-4gl
iteration
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.