ABAPのループ処理の代表「DO」と「WHILE」を解説します。
ABAPのループ処理は「DO」「WHILE」に加えて「LOOP」「PROVIDE」「SELECT」がありますが、基本的な概念として「DO」「WHILE」から学習すると良いでしょう。
DO/WHILEをしっかり理解しておけば、LOOP~ENDLOOP、SELECT~ENDSELECTについても簡単に理解できるかと思います。
まずは、基本を押さえる意味でDO/WHILEについての学習を始めましょう。
構文ルール:DO―ENDDO
DO (n TIMES).
・・・・
ENDO.
DO命令とENDDO命令で1つのループブロックを定義します。
「・・・・」の箇所に実際の処理内容を記載します。
( )の n TIMESを指定しない場合、処理は無限に繰り返されます。これが俗に言う「無限ループ」です。
無限ループとは
無限ループとは、その処理が永遠に繰り返されることを言います。
例えば、以下のようなプログラムが無限ループです。
DO.
A= A+1.
ENDDO.
Aに1を加算し続けるプログラムですが、数字は無限ですので、この処理は止まりません。
100になろうが、10000になろうがAに1ずつ加算されているのです。この間、プログラムがメモリを消費し続けるのでシステム全体に影響を及ぼします。
無限ループしているプログラムはずっとメモリを食べ続けることによって、他のプログラムが開始できない、という状態に陥ってしまうのです。上記例のようにただの足し算であればよいですが、SELECTなどの複雑な処理内容によっては、大きく影響してしまうので注意が必要です。
無限ループの回避① rdisp/max_wprun_tim
SAPのシステム設定として、プログラムの実行時間の上限値が決められています。
無限ループが回避される仕組みが予め備わっているのです。
rdisp/max_wprun_timの設定値が300秒であれば、これを超過した場合プログラムは中止されます。
ただし、バックグラウンド実行とオンライン実行によって仕組みが異なります。詳しく知りたい方はこちらのページをご参考ください。
無限ループの回避② EXIT命令
EXIT命令でループ処理を強制的に抜けることができます。後述する、システム項目「SY-INDEX」との組み合わせで利用する形がポピュラーです。
DO.
IF SY-INDEX > 10.
EXIT.
ENDIF.
A = A+1.
ENDO.
ループが11回目に入ったタイミングで強制的に処理を切ることができます。
IF文についてはこちらをご覧ください。
構文ルール:WHILE~ENDWHILE
WHILE (条件式).
・・・・
ENDWHILE.
こちらは、DO~ENDDOと違い回数指定はしません。
代わりに、条件式をWHILEの後ろに記述します。
この条件式が成り立つ間、WHILE~ENDWHILEの処理が繰り返されることになります。
したがって、条件式には「SY-INDEX > 10」のような限定的に成り立つ条件を指定しないと、無限ループに陥ります。
「WHILE A = A」のような記述をしなければ良いので、WHILEについては無限ループに入ることは多くありません。
システム項目:SY-INDEX
システム項目の一つ「SY-INDEX」に、ループ処理の回数が保持されます。
DO~ENDDOの処理が始まる前にカウントアップされます。なので、初期値が1で、2回目の実行になった場合に2となります。
システム項目についてはこちらのページで詳しく解説しています。
ループ処理の条件付き終了
ループ処理を、条件付きで終了させる方法もあります。
例えば、処理の途中で想定と異なる場合が起こった場合(データが取得できなかった。正常に処理が行われなかった。など)のみ、ループ処理を終了したい場合があります。
こちらの記事で、ループ処理の条件付き終了について詳しく解説していますので合わせてご覧ください。