本ページでは、内部テーブルに対する処理の中で最も使用頻度が高いループ処理(LOOP~ENDLOOP命令)について解説します。
一口にループ処理・繰り返し処理といっても、大きく以下4種類存在します。
このページではABAPの繰り返し処理の中で最も基本となる「LOOP~ENDLOOP」について説明していきます。
ABAPerであれば、絶対に知っておきたい内容ばかりですので是非最後までご覧ください。尚、本ページでは「内部テーブル」についての理解が必須です。内部テーブルについては、以下の記事で解説しておりますので合わせてご覧ください。
LOOP処理とは?
"LOOP~ENDLOOP" 命令は指定した内部テーブルのレコードを順次読み込んでいき、読み込んだレコード数分同じ処理を行います。
例えば、以下のようなコードの場合。内部テーブル "GT_TABLE" のレコード数回、テーブル更新/ログ削除のサブルーチンが実行されます。
LOOP AT GT_TABLE INTO GW_STRCT. PERFORM UPDATE_TABLE. " テーブルを更新 PERFORM DELETE_LOG. " ログを削除 ENDLOOP.
構文ルールについて詳しく解説します。
構文ルール:LOOP~ENDLOOP
LOOP AT(内部テーブル)INTO(構造).
・・・・
ENDLOOP.
LOOP AT (内部テーブル) INTO (構造). * ここに繰り返し処理を記述する ENDLOOP.
ポイントは、①LOOP処理を行う内部テーブルを指定することと、②LOOP処理で対象となるレコードを格納する構造を指定することです。
LOOP AT IT_test001 INTO WA_IT_test001. CLEAR WA_IT_test001 WA_IT_test001-a = 'testA'. " 項目aの値を「testA」に書き換え WA_IT_test001-b = 'testB'. " 項目bの値を「testB」に書き換え WA_IT_test001-c = 'testB'. " 項目cの値を「testC」に書き換え APPEND WA_IT_test001 TO IT_test002. ENDLOOP.
上記サンプルコードでは、内部テーブル "IT_test001" のレコード1行1行を順次構造 "WA_IT_test001" に格納していきます。構造に格納されたレコードを用いて何らかの処理を行っていくのが基本的な流れです。

したがって、LOOPとENDLOOPの間に記述した処理は、ページ後半で解説する「WHEREオプション」「FROM~TOオプション」を利用しない場合、内部テーブルのレコード数分の処理が行われます。レコードが100行あれば100回処理を繰り返し、50行であれば50回の処理が行われます。
サンプルコードで利用されているCLEAR命令については以下をご確認ください。
LOOP命令:WHEREオプション
LOOP AT(内部テーブル)INTO(構造)
WHERE (条件式).
・・・・
ENDLOOP.
LOOP命令では、WHEREオプションを用いて処理の対象としたいレコードを特定することが可能です。
Z_TODAY = '2020/01/01'. LOOP AT IT_test001 INTO WA_IT_test001 WHERE Z_DAY = Z_TODAY. "Z_DAY が 2020/01/01 の場合のみ処理が行われる CLEAR WA_IT_test001 ENDLOOP.

もし「Z_TODAY」に「2020/01/01」が入っていれば、レコードBはLOOP処理の対象となりません。レコードAとレコードCのみが対象となります。
WHEREオプションを用いることで、処理の対象を特定することが可能となるため、パフォーマンス改善の一環としてもWHEREオプションを付与する改修などが行われます。
LOOP命令:FROM / TO オプション
LOOP AT(内部テーブル)INTO(構造)
FROM(数字)TO(数字).
・・・・
ENDLOOP.
FROM TOオプションを用いることで、LOOPするレコード数を制限することができます。
LOOP AT (内部テーブル)INTO (構造) FROM 10 TO 20. ・・・・ ENDLOOP.
上記のようにコーディングした場合、10行目から20行目までのレコードが処理の対象となります。WHEREオプションで制限するよりも、FROM TOオプションで制限したほうがパフォーマンスは良くなります。
WHEREオプションを利用する場合、内部テーブルのレコードが条件に合致するか否か?を特定するために一度レコードの読み込みが発生します。対して、FROM/TOオプションは読み込みが行われないので、よりパフォーマンスが改善するという仕組みです。
LOOP命令の注意点
LOOP命令利用時の注意点として、LOOP処理の中に、また別のLOOP処理を記載するのができるだけ避けなければならないという点です。これは、パフォーマンスを非常に悪化させてしまう原因となるためです。
LOOP AT <F_TABLE> ASSIGNING <F_LINE>. " ① CNT = CNT + 1. LOOP AT IT_SET ASSIGNING FIELD-SYMBOL(<IT_SET>). " ② ASSIGN COMPONENT <LT_IT_SET>-FIELD OF STRUCTURE <F_LINE> TO <F_LINE_W>. CHECK SY-SUBRC = 0. ENDLOOP. APPEND <F_LINE> TO <F_UPD_TABLE>. ENDLOOP.
上記コードは、LOOP処理の中でさらにLOOP処理を記述しています。
LOOP①の処理件数が100件、LOOP②の処理件数が500件の場合、当該サンプルコードでの繰り返し処理数は "50000" 回にものぼります。LOOP命令の中にLOOP命令を記述するのはできるだけ避けたい記述方です。
フィールドシンボルとの組み合わせ
以下のコードで登場する<>に囲まれたデータオブジェクトは、フィールドシンボルと呼ばれるものです。
LOOP AT <F_TABLE> ASSIGNING <F_LINE>. " ① CNT = CNT + 1. LOOP AT IT_SET ASSIGNING FIELD-SYMBOL(<IT_SET>). " ② ASSIGN COMPONENT <LT_IT_SET>-FIELD OF STRUCTURE <F_LINE> TO <F_LINE_W>. CHECK SY-SUBRC = 0. ENDLOOP. APPEND <F_LINE> TO <F_UPD_TABLE>. ENDLOOP.
以下のページで、フィールドシンボルの意味と使い方を詳しく解説いたしましたので、続けてご覧ください。
SAP/ABAPを1から勉強したい方は
SAP/ABAPを1から学習したい初心者の方向けに、できるだけ網羅的にABAPが理解できるよう以下ページに知識体系を整理しています。
特に初心者のうちは、どこから学べばよいか?どう勉強すれば良いか?すらわからない状態になりがち。
ある程度の知識を持ったうえで、はじめて実践的な理解へとつながります。
是非、一度ご覧になってみてください。