ループの中では、1 つの命令ブロックが連続して複数回実行されます。ABAP には 4 種類のループがあります。
● DO 命令を使用した無条件ループ
● WHILE 命令を使用した条件ループ
● LOOP 命令を使用した、内部テーブルおよび抽出データセットに対するループ
無条件ループ
1 つの命令ブロックを無条件で複数回処理するには、以下の制御構造を使用します。
DO [n TIMES] ...
[statement_block]
ENDDO.
ループパスの数を n に限定するには TIMES オプションを使用します。
何もオプションを指定しない場合は、EXIT または STOP などの強制終了命令に到達するまで命令ブロックは繰り返して実行されます (下記参照)。システム項目 sy-index には、現在のループパスを含めたループパスの数が含まれます。
DO ループをネストしたり、他のループ形式と組合せたりすることができます。
DOループの単純な例
DO. WRITE sy-index. IF sy-index = 3. EXIT. ENDIF. ENDDO.
一覧出力は以下のとおりです。
1 2 3
このループは 3 回処理されます。ここでループは 3 回処理され、EXIT 命令により終了します。
TIMES オプションを使用したループを 2 つネストした例
DO 2 TIMES. WRITE sy-index. SKIP. DO 3 TIMES. WRITE sy-index. ENDDO. SKIP. ENDDO.
一覧出力は以下のとおりです。
1 1 2 3 2 1 2 3
外側のループは 2 回処理されます。外側のループが 1 回処理されると、内側のループは 3 回処理されます。システム項目 sy-index には、それぞれのループのループパスの数が個別に含まれることに注意してください。
条件ループ
一定の条件が真である間に命令ブロックを繰り返すには、以下の制御構造を使用します。
WHILE log_exp
[statemaent_block]
ENDWHILE.
log_exp として任意の論理式を使用することができます。WHILE と ENDWHILE の間の命令ブロックは、条件が真である間、または EXIT または STOP などの強制終了命令が出現するまでの間繰り返されます。システム項目 sy-index には、現在のループパスを含めたループパスの数が含まれます。
任意の深さまで WHILE ループをネストしたり、他のループ形式と組合せたりすることができます。
REPORT demo_flow_control_while. DATA: length TYPE i VALUE 0, strl TYPE i VALUE 0, string(30) TYPE c VALUE 'Test String'.
strl = strlen( string ). WHILE string NE space. WRITE string(1). length = sy-index. SHIFT string. ENDWHILE. WRITE: / 'STRLEN: ', strl. WRITE: / 'Length of string:', length.
以下のように出力されます。
T e s t S t r i n g
STRLEN: 11
Length of String: 11
ここでは、文字列の長さを判別するために WHILE ループを使用しています。そのために、ループが処理されるたびに文字列を 1 文字分左へとシフトし、空白のみが含まれるようになるまでそれを続けます。この例は WHILE 命令を説明するために選択されています。もちろん、関数 strlen を使用した方が簡単かつ効率的に文字列の長さを判別することができます。
*10回ループして処理を抜ける DATA: V_CNT TYPE I. Do. V_CNT = V_CNT + 1. WRITE V_CNT. IF V_CNT >= 10. EXIT. ENDIF. ENDDO. *結果は12345678910となるだろう。 *5回ループして処理を抜ける Do 5 TIMES. V_CNT = V_CNT + 1. WRITE V_CNT. IF V_CNT >= 10. EXIT. ENDIF. ENDDO.
*結果は12345となるだろう。
*あらかじめ決められた回数分ループするのか、条件に一致するまでループする等いくつかの構文が存在。