ABAPにおいて、処理の繰返を行うには以下で行います。
★DO
*DO~ENDDO
*①回数指定の場合
DO 50 TIMES.
"当処理を50回繰り返す
ENDDO.
*※回数は任意の値を指定可能。
* 回数指定しない場合はn TIMESを指定しなくとも良いです。
* その場合はDO~ENDDO内でExit命令などを発行して、適宜制御してください。
★WHILE
*WHILE~ENDWHILE
*条件を満たしている間繰り返しを継続します。
WHILE lv_count < 50.
"lv_countの値が50未満の間、当処理を繰り返す
ENDWHILE.
★LOOP
*LOOP~ENDLOOP
*内部テーブルを1件ずつ構造やフィールドシンボルに読み込んで
*処理を繰り返します。
LOOP AT lt_test01 INTO ls_test01 WHERE comp01 = 'aaa'.
"lt_test01を1レコードずつls_test01に読み込み、当処理を繰り返します。
"なお、今回はWhere指定の通り、lt_test01の項目:comp01が'aaa'のもののみ読み込みます。
ENDLOOP.
*※INTO [構造]でもASSIGNING [フィールドシンボル]でも可。
* ASSIGNING [フィールドシンボル]でフィールドシンボルに順次割り当てしていく方が微々たる差ですが高速です。
* 条件を指定しない場合はWHEREを指定しなくとも良いです。
※CONTINUE命令を使用すると、
CONTINUE命令が発行された時点で次の繰り返しに進むことができます。
DO 50 TIMES.
"処理A
IF lv_flag = ABAP_ON.
CONTINUE.
ENDIF.
"処理B
ENDDO.
*上記であればlv_flagの内容次第で処理Bを飛ばして次のループへ進むような動きを実現できます。
★SELECT~ENDSELECTを使った繰り返し
*SELECTを使い繰り返し処理ができます。
*1件1件データベースから呼び出して処理するという特性上使用は非推奨です。
*(パフォーマンスが非常に悪いため)
*例)
SELECT * FROM ztest01 INTO @ls_ztest01 WHERE comp01 = 'aaa'.
"DBテーブルztest01から1レコードずつls_test01に読み込み、当処理を繰り返します。
"なお、今回はWhere指定の通りztest01の項目:comp01が'aaa'のもののみ読み込みます。
ENDSELECT.
★FORMを使った繰り返し
*FORMを使って繰り返しができます。
*どうしてもこのやり方でしかできない場合以外は非推奨です。
*(繰り返しを停止する条件が見にくいため)
*例)
FORM test_form.
"任意の処理
IF lv_flag = abap_on.
PERFORM test_form."lv_flagがONの場合は繰り返し
ELSE.
RETURN. "lv_flagがOFFの場合は、PERFORMでの繰り返しを抜ける
ENDIF.
ENDFORM.
※FORM命令はABAP7.3以降で廃止命令に指定されているため、ご留意ください。


