【ABAP】READ TABLE―内部テーブルの読み込みを1分で解説

ABAP

本ページでは、READ TABLE命令による内部テーブルの読み込み処理について解説します。

ABAPに不慣れな方ほど、SELECT命令と混同してしまいがち。ここでは、そもそもSELECT命令と何が違うか?READ TABLE命令の使いどころはどこか?を1からサンプルコード付きで分かりやすく解説します。

このページで学べる内容
  • READ TABLE命令とSELECT文の違い
  • READ TABLEの処理と構文ルール
  • LOOP文との組み合わせ方:フィールドシンボルの使い方
  • TRANSPORTING NO FIELDSオプション

ABAPで最も特徴的なのが、内部テーブルという仕組みです。この内部テーブルの操作で欠かせないのがREAD TABLE命令の正しい理解です。ABAPエンジニアを目指す方であれば、知っておきたい超・基本知識ですので、是非最後までご覧ください。

それでは早速解説を始めます。

スポンサーリンク

READ TABLE命令

READ TABLE命令は、内部テーブルの単一行を抽出する命令です。

似たような処理を行うのが、SELECT命令です。SELECT命令もレコードを抽出する処理を持ちますが、SELECT命令は、標準テーブル・アドオンテーブルから項目を選択する場合は用いるのに対して、READ TABLE命令の場合は、内部テーブルのレコードを抽出する場合に用います。

意外と、初心者に人ほどこの罠に陥ることが多いのでしっかり区別しておきましょう。

READ TABLE命令とSELECT命令の違い
  • READ TABLE
    内部テーブルの読み込み・選択

  • SELECT
    標準テーブル/アドオンテーブルの読み込み・選択

また、READ TABLE命令は内部テーブルの単一行を抽出する命令です。複数レコードを抽出することはできません。あくまでも単一レコードのみを読み込む処理を行うのが、READ TABLE命令です。

この点、SELECT-SINGLEと似たような動きをします。この機会に、整理して理解しておくように心がけましょう。

構文ルール:READ TABLE

ルール, 日常生活, 構造, インフラストラクチャ, 法律, 裁判所, 弁護士, 段落, 句, 規制, ジュラ
READ TABLE:構文ルール

READ TABLE(内部テーブル) INTO (構造)
  WITH KEY A = A' .

READ TABLE命令は指定した内部テーブルから単一行を読み込み、指定した構造に格納します。読み込むレコードは、WITH KEYオプションで指定します。

例えば「WITH KEY VBELN = '100000000'」 とすれば、受注伝票 100000000のレコード(行)が対象となります。もし、読み込む行が一意にならない場合は、最初に一致するレコードが読み込み対象となります。

したがって、キーの指定が不十分な場合(レコードを一意に特定できない場合)には、意図したものと違うレコードが抽出されてしまいます。基本は、レコードを一意に指定できるようにKEYを指定しましょう。

この辺の処理も、SELECT-SINGLEと同様の動きをしますので注意して覚えておきましょう。

SELECT * 
  INTO TABLE IT_BKPF
  FROM BKPF.
 
READ TABLE IT_BKPF INTO WA_BKPF
  WITH KEY BUKRS = '10'
            GJAHR = 2020.

ASSIGNINGオプション

INTOの代わりに、ASSIGNINGオプションを利用することで、読み込んだレコードをフィールドシンボルに代入することができます。実はINTOよりもASSIGNINGの方が頻繁に利用されます。

ASSIGNINGオプション

READ TABLE(内部テーブル) ASSIGNING <フィールドシンボル>
  WITH KEY A = A' .

SELECT * 
  INTO TABLE IT_BKPF
  FROM BKPF.
 
READ TABLE IT_BKPF ASSIGNING <FS_BKPF>
  WITH KEY BUKRS = '10'
            GJAHR = 2020.

フィールドシンボルとは、データオブジェクトを間接的に指し示す「カーソル」のような役割を果たす仕組みです。プログラミングに明るい人であればデリファレンスするような仕組みをイメージできればOK。

フィールドシンボルについては、以下の記事で詳しく初心者向けに解説しました。ASSIGNINGオプションと合わせて理解しておきましょう。

TRANSPORTING NO FIELDSオプション

TRANSPORTING NO FIELDSオプション

READ TABLE(内部テーブル) TRANSPORTING NO FIELDS
  WITH KEY A = A' .

SELECT * 
  INTO TABLE IT_BKPF
  FROM BKPF.
 
READ TABLE IT_BKPF TRANSPORTING NO FIELDS
  WITH KEY BUKRS = '10'
            GJAHR = 2020.

TRANSPORTING NO FIELDS」オプションは、レコードを格納せずにシステム項目だけを設定するオプションです。先ほど説明した通り、READ TABLEが成功すればSY-SUBRCには「0」が設定されます。

SY-SUBRC意味
0読み取りに成功
0以外読み取りに失敗(条件により4や8が設定される)

この処理は「レコードが存在するかどうかだけ知りたい場合」に用います。例えば、SELECTの結果、対象のレコードが取得できたかどうかを知りたいだけの場合。

SELECT * 
  INTO TABLE IT_BKPF
  FROM BKPF.
 
READ TABLE IT_BKPF TRANSPORTING NO FIELDS
  WITH KEY BUKRS = '10'
            GJAHR = 2020.

以外と利用頻度の高いオプションですので、これもしっかり覚えておきましょう。

ABAPを1から学習したい方は

ABAPを1から学習したい方は、以下の記事をご覧ください。

こちらの記事では、ABAPを用いて簡単な機能を実装できるようにするための必須知識を解説しております。今、本サイトで一番人気の記事ですので是非合わせてご覧ください。

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