【ABAP】LOOP―ループ処理のツボ

ABAP

本ページでは、内部テーブルに対する処理の中で最も使用頻度が高いループ処理について解説します。

一口に「ループ処理」といっても、ABAPには4種類(LOOP~ENDLOOP・SELECT~ENDSELECT・DO~ENDDO・WHILE~ENDWHILE)存在するのですが、実際にABAPerが口にする「ループ処理」はタイトルにある「LOOP~ENDLOOP」の構文を指していることがほとんどです。

以上を踏まえて、ABAPのループ処理、今回は最も基本となる「LOOP~ENDLOOP」について説明していきます。

このページで学べる内容

  • LOOP処理とは何か?
  • 内部テーブルに対するLOOP処理の意味と使い方
  • LOOP処理のオプション(WHERE/FROM TO)
  • LOOP処理の注意点

ABAPerであれば、絶対に知っておきたい内容ばかりですので是非最後までご覧ください。尚、本ページでは「内部テーブル」についての理解が必須です。内部テーブルについては、以下の記事で解説しておりますので合わせてご覧ください。

スポンサーリンク
スポンサーリンク

LOOP処理とは?

"LOOP" から始まる構文は、「同じ処理の繰り返し」を行います。

また、 "LOOP" は内部テーブルから「特定のデータを抽出して処理を行う場合」に利用されます

どういうことか、ここからは実施の構文を確認しながら詳しく解説していきます。

構文ルール:LOOP~ENDLOOP

LOOP AT (内部テーブル)INTO(構造).
 ・・・・
ENDLOOP.


基本となる構文は上記の通りです。ポイントは、①LOOP処理を行う内部テーブルを指定することと、②LOOP処理で対象となるレコードを格納する構造を指定することです。

この記述で実際にどのような処理が行われるのか?具体的に見ていきましょう。

LOOP~ENDLOOP

ループ処理は、LOOPENDLOOPで囲んだ間に具体的な処理内容を記述します。

LOOPとENDLOOPの間に記述した処理は、特段の指定が無い場合内部テーブルのデータのレコード数分繰り返します。データが100行あれば、100回処理を繰り返します。50行であれば、50回の処理が行われます。

そのためLOOP命令では、DO/WHILE文で注意すべき「無限ループ」に陥ることはありません。

※ループ処理の罠「無限ループ」と、その回避策については以下の記事に詳細を書いています。

LOOP AT(内部テーブル)INTO(構造)

LOOPでは、内部テーブルを1行1行処理をしていきます。

このとき留意する必要があるのが、LOOP ATでは指定した内部テーブルを直接処理するのではなく、一時的に別の構造に対象の行を格納して処理を進める、という点です。

以下のようなイメージです。

LOOP ATでは指定した内部テーブルを直接処理するのではなく、一時的に別の構造に対象の行を格納して処理を進める、という点です。
内部テーブルの1行1行を別の構造に格納して処理を進める

したがって、LOOP~ENDLOOPには、①対象の内部テーブル②作業エリア(構造)の指定が必要となるのです。

サンプルコードで、LOOP処理の中身を確認していきたいと思います。

サンプルコード:LOOP~ENDLOOP

LOOP AT IT_test001 INTO WA_IT_test001
  CLEAR WA_IT_test001
  LW_VBELN-SIGN   = 'I'.
  LW_VBELN-OPTION = 'EQ'.
  LW_VBELN-LOW    = WA_IT_test001-VBELN.
  APPEND LW_VBELN TO LIT_VBELN.	 
ENDLOOP.

サンプルコードの説明

対象の内部テーブルは、"IT_test001" というテーブルです。

"IT-test001" という内部テーブルの1行1行を、一度 "WA_IT_test001" という構造に格納し、その後の処理を進めます。

実際の処理は、インデントされている箇所が該当します。ここでは、 "LW_VBELN" という構造に値を格納していき、別の内部テーブルへAPPNEDする処理を記載しています。条件に合うデータを1件ずつ "LIT_VBELN" という内部テーブルに格納しているわけです。

この処理は上述した通り、内部テーブルのデータ数、つまり "IT-test001" に格納されているデータ数分処理が繰り返されます。

※尚、ループ処理の初めには必ずCLEAR命令を行うのが定石です。

WHEREオプション

LOOP AT (内部テーブル)INTO (構造)
WHERE (条件式).
 ・・・・
ENDLOOP.


LOOP命令では、WHEREオプションを用いて処理の対象としたいレコードを特定することが可能です。

以下のサンプルコード(省略あり)をご覧ください。

LOOP AT IT_test001 INTO WA_IT_test001
 WHERE Z_DAY=Z_TODAY.
  CLEAR WA_IT_test001
  ・・・・・・・・・・・・・・	 
ENDLOOP.

もし「Z_TODAY」に「2020/01/01」が入っていれば、レコードBはLOOP処理の対象となりません。レコードAとレコードCのみが対象となります。

WHEREオプションを用いて、処理の対象を特定することが可能です。

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オプションは、全てのレコードが条件に合致するかどうか読み込みに行ってしまうためです。

ループ処理の注意点

LOOP~ENDLOOPの処理を簡単にまとめます。

  • 内部テーブルを1行1行別の構造に格納し、当該構造に対し処理をすること
  • データ数分繰り返しされる処理であること
  • WHEREオプション/FROM TOオプションで処理対象を特定できる

以上を理解しておけばOKです。1つの注意点としては、LOOP処理の中に、また別のLOOP処理を記載するのができるだけ避けなければならないという点です。これは、パフォーマンスを非常に悪化させてしまう原因となるためです。ABAPerの禁忌の一つですので、必ず他の手段を考えましょう。

フィールドシンボルとの組み合わせ

ここで紹介したLOOP処理は、かなり初歩的(古い記述方式)なものです。実際には、フィールドシンボルと組み合わせて利用するシーンがほとんどですので、フィールドシンボルとセットで理解することがおすすめです。

以下のページに、フィールドシンボルの意味と使い方を詳しく解説いたしましたので、続けてご覧ください。

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