Поиск…


Вступление

Существует несколько способов итерации (циклизации) в Progress ABL.

ДЕЛАТЬ ПОКА

Цикл DO WHILE будет продолжаться до тех пор, пока не будет выполнена WHILE . Это упрощает работу навсегда и все время питается от одного ядра процессора.

DO WHILE выражение :

КОНЕЦ.

выражение представляет собой любую комбинацию логической логики, сравнения, переменных, полей и т. д., которая оценивает истинное значение.

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

Вы можете использовать любое количество проверок в WHILE -part:

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.

Однако компилятор не поможет вам проверить, что WHILE -part в конечном итоге выполняется:

/* 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 Закончить [BY step]

Эта итерация изменяет значение от начальной точки до конца, необязательно по заданному значению для каждого шага. По умолчанию установлено значение 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.

Результат:

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

        10
        11
        12
        13
        14
        15

Вы также можете выполнять итерацию по датам:

DEFINE VARIABLE dat AS INTEGER        NO-UNDO.

DO dat = TODAY TO TODAY + 3:

END.

И над десятичными знаками. Но тогда вы, скорее всего, захотите использовать BY - иначе INTEGER сделал бы так же хорошо ...

DEFINE VARIABLE de AS DECIMAL     NO-UNDO.

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

Использование BY отрицательного числа вы можете также перейти от более высокого к более низкому значению:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

Выражение будет проверяться до тех пор, пока оно больше не будет выполнено. Это делает счетчик выше (если движение вверх) или ниже (если движение вниз) после завершения цикла:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

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

MESSAGE i. // Will message 0

Другой пример:

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)

ПОВТОРЕНИЕ

REPEAT, будет повторяться навсегда, если вы явно не выйдете из цикла:

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

Чтобы выйти из цикла, вы можете использовать ключевое слово LEAVE . С этикеткой или без нее. Без метки LEAVE всегда будет выполнять текущий цикл. С именем вы можете указать, какой цикл следует использовать для 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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow