PR

【ABAP】LOOP~ENDLOOP命令を3分で解説

ABAP

ABAPのLOOP命令は内部テーブルのデータに対して繰り返し処理を実行するための構文です。

LOOP AT (内部テーブル) INTO (構造).
* ここに繰り返し処理を記述する
ENDLOOP.

ABAPにおける代表的な繰り返し処理は以下の4つ。LOOP命令はこの中で最も基本的な繰り返し処理の構文です。

ABAPにおける繰り返し処理
このページで学べる内容
  • 【基本】ループ処理とは?
  • LOOP~ENDLOOPの構文ルール
    • WHERE オプション
    • FROM / TO オプション
  • ループ処理の注意点とフィールドシンボルとの組み合わせ

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" に格納していきます。構造に格納されたレコードを用いて何らかの処理を行っていくのが基本的な流れです。

ABAP LOOP
内部テーブルの1行1行を別の構造に格納して処理を進める

したがって、LOOPとENDLOOPの間に記述した処理は、ページ後半で解説する「WHEREオプション」「FROM~TOオプション」を利用しない場合、内部テーブルのレコード数分の処理が行われます。レコードが100行あれば100回処理を繰り返し、50行であれば50回の処理が行われます。

より深く理解できるようまた別のサンプルコードも以下に示します。

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命令利用時の注意点
  • 変更の反映
    ループ内で構造(ワークエリア)に基づいてレコードを変更する場合、変更は内部テーブルの元のレコードには自動的に反映されません。変更を反映するには、MODIFY命令などを使用して明示的に更新する必要があります。
  • パフォーマンス
    大きな内部テーブルに対してLOOP命令を使用すると、パフォーマンスが低下することがあります。ループの回数を最小限に抑え、必要な範囲のレコードのみを処理するように注意。
  • READ TABLE命令との違い
    READ TABLE命令は、内部テーブルから特定のレコードを検索・取得するために使用されます。一方、LOOP命令は、内部テーブルの複数のレコードに対して繰り返し処理を実行するために使用されます。両者の違いを適切に理解しましょう!
  • 範囲指定の注意
    FROM/TOオプションを使用して範囲を指定する場合、指定された範囲が内部テーブルのインデックス範囲内にあることを確認してください。範囲外のインデックスを指定すると、システムエラーが発生する可能性があります。
  • WHEREオプションの注意
    WHEREオプションを使用して条件を指定する場合、条件式が複雑になるほどパフォーマンスが低下することがあります。条件式をシンプルに保ち、必要に応じてデータを事前にフィルタリングする必要があります。

【発展編】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をはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?

あなたの技術、もっと価値ある場所で活かしませんか?
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
シェアする
ビズドットオンラインをフォローする
blank
ビズドットオンライン
タイトルとURLをコピーしました