ABAPのLOOP命令は内部テーブルのデータに対して繰り返し処理を実行するための構文です。
LOOP AT (内部テーブル) INTO (構造). * ここに繰り返し処理を記述する ENDLOOP.
ABAPにおける代表的な繰り返し処理は以下の4つ。LOOP命令はこの中で最も基本的な繰り返し処理の構文です。
ABAPerを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
ABAP:LOOP命令とは?
ABAPのLOOP命令は、内部テーブルのデータに対して繰り返し処理を実行するための構文です。LOOP命令を使用することで、内部テーブルのすべてのレコードを順番に処理し各レコードに対して特定の操作を実行できます。
構文ルール:LOOP~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命令については以下をご確認ください。
より深く理解できるようまた別のサンプルコードも以下に示します。
REPORT ZDEMO_LOOP. TYPES: BEGIN OF ty_person, NAME TYPE string, AGE TYPE i, END OF ty_person. DATA: lt_persons TYPE TABLE OF ty_person, ls_person TYPE ty_person. * データを内部テーブルに追加 APPEND VALUE ty_person( NAME = 'Alice' AGE = 30 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'Bob' AGE = 25 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'Carol' AGE = 35 ) TO lt_persons. * 内部テーブルのデータを処理 LOOP AT lt_persons INTO ls_person. WRITE: / 'Name:', ls_person-NAME, 'Age:', ls_person-AGE. ENDLOOP.
このサンプルコードでは、まず "ty_person" という構造を定義し、"lt_persons" という内部テーブルを作成しています。次に、APPEND命令を使用して、内部テーブルにデータを追加しています。
LOOP命令:WHEREオプション
ABAPのLOOP命令では、WHEREオプションを使用することで特定の条件に一致するレコードだけを処理することができます。
これにより、内部テーブルのすべてのレコードをループする代わりに、特定の基準に基づいて選択されたレコードだけを処理できます。
REPORT ZDEMO_LOOP_WITH_WHERE. TYPES: BEGIN OF ty_person, NAME TYPE string, AGE TYPE i, END OF ty_person. DATA: lt_persons TYPE TABLE OF ty_person, ls_person TYPE ty_person. * データを内部テーブルに追加 APPEND VALUE ty_person( NAME = 'Alice' AGE = 30 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'Bob' AGE = 25 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'Carol' AGE = 35 ) TO lt_persons. * 内部テーブルのデータを処理(年齢が30歳以上のレコードのみ) LOOP AT lt_persons INTO ls_person WHERE AGE >= 30. WRITE: / 'Name:', ls_person-NAME, 'Age:', ls_person-AGE. ENDLOOP.
先ほどと同じようなサンプルコードですが、このサンプルコードではLOOP命令にWHEREオプションを使用して、年齢が30歳以上のレコードだけを処理します。
この例では、'Alice'と'Carol'のレコードだけが出力されます。年齢が30歳未満のレコード(この場合は'Bob')は、ループの処理対象外となります。
LOOP命令:FROM / TO オプション
FROMおよびTOオプションを使用すると、内部テーブルの特定の範囲のレコードだけを処理することができます。
REPORT ZDEMO_LOOP_WITH_FROM_TO. TYPES: BEGIN OF ty_person, NAME TYPE string, AGE TYPE i, END OF ty_person. DATA: lt_persons TYPE TABLE OF ty_person, ls_person TYPE ty_person. * データを内部テーブルに追加 APPEND VALUE ty_person( NAME = 'Alice' AGE = 30 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'Bob' AGE = 25 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'Carol' AGE = 35 ) TO lt_persons. APPEND VALUE ty_person( NAME = 'David' AGE = 40 ) TO lt_persons. * 内部テーブルのデータを処理(2番目から3番目のレコードのみ) LOOP AT lt_persons INTO ls_person FROM 2 TO 3. WRITE: / 'Name:', ls_person-NAME, 'Age:', ls_person-AGE. ENDLOOP.
LOOP命令にFROMおよびTOオプションを使用して、2番目から3番目のレコードだけを処理します。
この例では、'Bob'と'Carol'のレコードだけが出力されます。それ以外のレコード(この場合は'Alice'と'David')は、ループの処理対象外となります。
LOOP命令の注意点
ABAPの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命令の基本はOK!という方は続けて以下の記事をご覧ください。
SAP/ABAPを1から勉強したい方は
初めてABAPを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのABAP使いが同じ道を進んできました。
ABAPをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?
読者料典 【完全無料】ABAP:学習カリキュラム ←こちらから!