PR

【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を勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。

ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
SAPエンジニアのキャリア支援はこちらから↓

No.1 > 外資系・IT業界などハイクラスの転職なら【アクシスコンサルティング】blank
4人に1人のコンサルタントが選ぶパートナー!
ビッグ4やアクセンチュアへの転職を実現し年収1000万へ。

No.2 > IT・Web転職特化エージェント【レバテックキャリアblank
blank
サービス利用者数20万人突破。

平均年収アップ率77%であなたの転職成功を保証します。

No.3 > blankリクルートエージェント
blank
\転職支援実績NO.1/

応募が殺到しすぎるが故に・・・非公開にせざるを得ない魅力的な求人が多数!

読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
ABAPSAP
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました