【ABAP】DO命令/WHILE命令 繰り返し処理を3分で解説

ABAP

ABAPにおけるループ処理(繰り返し処理)を実装するためのDO命令WHILE命令を解説します。

ABAPのループ処理は DO命令 WHILE命令 に加えてLOOP命令SELECT命令 などがあります。LOOP命令などに比べると使用頻度は少ないのですが、SAP標準プログラムなどでは頻繁に利用されているため、内容についてはしっかり頭に入れておきましょう!

このページで学べる内容
  • DO命令の基本
  • WHILE命令の基本
  • 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命令

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回目に入ったタイミングで強制的に処理を切ることができます。

システム項目:SY-INDEX

システム項目の一つ「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を1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。

特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。

ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。是非この機会にご覧ください。

タイトルとURLをコピーしました