サーチ…


前書き

進捗ABLでの反復処理(ループ処理)にはいくつかの方法があります。

一方を行います

DO WHILEループは、 WHILE -partが満たされない限りループし続けます。これにより、1つのCPUコアから永遠に実行し、いつでも食べることができます。

WHILE 式を実行する

終わり。

expressionは真の値に評価されるブール論理、比較、変数、フィールドなどの任意の組み合わせです。

/* 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 =終了までに[BYステップ]

この反復処理は、値を開始点から終了点に変更します。オプションで、各ステップの指定値を変更することもできます。デフォルトの変更は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