ABAPにおけるループ処理(繰り返し処理)を実装するためのDO命令とWHILE命令を解説します。
ABAPerを目指すのであれば知っておきたい基本中の基本知識です。是非最後までご覧下さい。
ABAP:DO命令(DO ~ ENDDO)
DO命令(DOループ)は、強制終了命令が発行されるまで指定した処理を繰り返し実行する命令です。
DO命令は、繰り返す回数を指定するパターンとそうでないパターンの2種類の記述方法が存在します。
* 実行回数を指定するパターン DO n TIMES. [処理] ENDDO. * 実行回数を指定しないパターン DO. [処理] ENDDO.
実際にDO命令を利用したサンプルコードがこちら。
DATA: LV_COUNT TYPE I. * LV_COUNT を1インクリメント * LV_COUNT が1000になったら処理を終了 * パターン1(繰り返し回数未指定) DO. WRITE / LV_COUNT. LV_COUNT = LV_COUNT + 1. IF LV_COUNT= 1000. EXIT. ENDIF. ENDDO. * パターン2(繰り返し回数指定) DO 1000 TIMES. WRITE LV_COUNT. ENDDO.
DO命令の構文ルール自体は難しくはありません。DO~ENDDO でループブロック(かたまり)を定義し、その中に繰り返したい処理を記述するだけでOK。
ABAP:WHILE命令(WHILE ~ ENDWHILE)
WHILE命令(WHILEループ)は指定した条件が "TRUE" の間、指定した処理を繰り返す命令です。
WHILE <条件式>. [処理] ENDWHILE.
DO命令は繰り返し処理の「回数」を指定。WHILEは繰り返し処理を行う「条件」を指定するのが大きな違いです。
DATA: LV_COUNT TYPE I. * LV_COUNT を1インクリメント * LV_COUNT が1000になったら処理を終了 WHILE VL_COUNT < 1000. LV_COUNT = LV_COUNT + 1. WRITE LV_COUNT. ENDDO.
DO命令もWHILE命令もコーディングルール自体は非常に単純ですが、使い方を間違えるとだいぶ厄介な命令でもあります。
ここからはDO命令/WHILE命令の落とし穴「無限ループ」について解説します。
無限ループとは
無限ループとは、その名の通り処理が永遠に繰り返し処理されてしまうことを言います。
DO命令で繰り返し処理を強制終了する記述がない場合や、WHILE命令の繰り返し条件が常に "TURE" となってしまう場合に発生します。
例えば、以下のようなプログラムが無限ループです。
DATA: LV_COUNT TYPE I. * LV_COUNT を1インクリメント * LV_COUNT が1000になったら処理を終了する「記述がない」 DO. WRITE / LV_COUNT. LV_COUNT = LV_COUNT + 1. * IF LV_COUNT= 1000. * EXIT. * ENDIF. ENDDO.
変数 "LV_COUNT" に1を加算し続けるものの、DO命令を終了するIF文がないため、このDO命令は永遠に回り続けてしまいます。
このような状態を無限ループと呼ぶのですが、無限ループが厄介なのは「そのシステムだけではなく、システム全体にその影響が広がってしまう・・・!」という点です。
プログラムが無限ループしている間、そのプログラムが永遠に終わらないのでサーバへの負荷をかけ続けることになります。
では、無限ループを回避するためにはどうすれば良いでしょうか?
ここからは無限ループに陥らないように注意すべきポイント・ナレッジを解説していきます。
強制終了命令:EXIT命令/CONTINUE命令/CHECK命令
EXIT命令/CONTINUE命令/CHECK命令などの強制終了命令を適切に利用することで、ループ処理を強制的に抜けることができます。システム項目 "SY-INDEX" との組み合わせで利用する形がポピュラーです。
ここではEXIT命令を利用したサンプルコードを再掲しておきます。
DATA: LV_COUNT TYPE I. * LV_COUNT を1インクリメント * LV_COUNT が1000になったら処理を終了 DO. WRITE / LV_COUNT. LV_COUNT = LV_COUNT + 1. IF LV_COUNT= 1000. EXIT. ENDIF. ENDDO.
EXIT命令を利用することで、ループが1000回目に入ったタイミングで強制的に処理を切ることができます。
EXIT命令/CONTINUE命令/CHECK命令 についてはそれぞれの構文ルールや各命令の違いについて以下の記事で解説しています。
システム項目の一つ「SY-INDEX」に、ループ処理の回数が保持されます。
DO~ENDDOの処理が始まる前にカウントアップされます。なので、初期値が1で、2回目の実行になった場合に2となります。
システム項目についてはこちらのページで詳しく解説しています。
プログラム実行時間の上限設定:rdisp/max_wprun_tim
SAPではプログラム実行時間の上限を「rdisp/max_wprun_tim」という値で保持しています。
無限ループに陥ったプログラムがあったとしても、上限時間に達すれば強制的に当該プログラムが終了する仕組み。
rdisp/max_wprun_timの設定値が300秒であれば、これを超過した場合プログラムは中止されます。
無限ループを回避するためだけに、"rdisp/max_wprun_tim" の設定値を変えるパターンは稀ですが、知識としてこういうこともできる・・・と頭に入れておくといつか役に立つかもしれません。
ABAPを1から勉強したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!