ABAP 内部テーブル(Internal Table):作成、読み込み、追加、更新、削除

  データ定義&編集

概要

ABAPプログラムを作る、デバッグ等する上で必ず理解しておく必要があるのが内部テーブル(Internal Table)だろう。ここでは内部テーブルとはどうゆうものなのかを紹介しよう。

内部テーブル(Internal Table)とは何か?

簡単に説明すると、複数のプログラムで共有したり、保存しておいて後から再利用可能なのがデータベーステーブルであり、自身(プログラムが動いている間だけ)使えるのが内部テーブルとなる。内部テーブル単体ではできる事が少なく、作業領域(ワークエリア)を使って処理する事が多いだろう。

作業領域(Work Area)とは何か?

内部テーブルが複数のデータを格納する為の定義であり、作業領域は1行のデータだけを格納する為の定義である。内部テーブルを読み込んで作業領域に格納、作業領域上で編集し、結果を内部テーブルへ反映といった使い方をする事が多いだろう。

内部テーブル・作業領域の定義

まずは内部テーブル、作業領域の定義の方法について紹介していこう。
方法としては、プログラム内でTYPES命令を使い定義したものを内部テーブルや作業領域とするか、データベーステーブルや構造を参照する事が基本だろう。
これらの定義のオプションとして、内部テーブルを標準テーブル、ソートテーブル、ハッシュテーブルにしたり、ヘッダー有りの内部テーブルや、作業領域をフィールドシンボルとして定義したりと様々な定義の方法がある。

TYPES命令を使った内部テーブル・作業領域

Types :
begin of TY_TABLE,
col_1 type I,
col_2 type I,
col_3 type I,
end of TY_TABLE.
DATA:
IT_TAB TYPE TABLE OF TY_TABLE, "内部テーブル
WA_TAB TYPE TY_TABLE. "作業領域

データベーステーブルを参照した内部テーブル・作業領域

DATA:
IT_TAB TYPE TABLE OF MARA, "内部テーブル
WA_TAB TYPE MARA. "作業領域

標準テーブル、ソートテーブル、ハッシュテーブル

DATA:
IT_TAB_STD1   TYPE TABLE OF MARA, "標準テーブル(省略時)
IT_TAB_STD2   TYPE STANDARD TABLE OF MARA, "標準テーブル
IT_TAB_SORT   TYPE TABLE OF MARA WITH UNIQUE KEY MATNR, "ソートテーブル
IT_TAB_BINARY TYPE TABLE OF MARA WITH UNIQUE KEY MATNR, "ハッシュテーブル

これらの使い方・違いについては別途とし、今回は内部テーブルの使い方を紹介しよう。

内部テーブルの使い方

読み込み(LOOP … ENDLOOP、READ TABLE)

「読み込み」は内部テーブルから複数行読み込むのか、一行だけ読み込むのかによって、LOOP … ENDLOOPかREAD TABLEを使い分けよう。

*全行の読み込み
LOOP AT IT_TAB INTO WA_TAB.
ENDLOOP.

*条件に一致した行の読み込み
LOOP AT IT_TAB INTO WA_TAB WHERE MTART = 'ZXXX'.
ENDLOOP.

*最初の1行の読み込み
READ TABLE IT_TAB INTO WA_TAB INDEX 1.

*条件に一致した行の読み込み
READ TABLE IT_TAB INTO WA_TAB WITH KEY MATNR = 'XXXXXXXXX'.

LOOP … ENDLOOPは内部テーブルを全て読み込みたい場合や、主キーでない条件で読み込みたい場合に使用する事が多いだろう。条件として主キーを指定すれば、READ TABLEと同じ結果が得られるが特にメリットはない。個人的には、後からプログラムを見た際に、複数行取得したいのか、一行だけ取得したいロジックなのかを瞬時に判断できるよう使い分ける事をお勧めする。一方、READ TABLEは複数行を取得する事はできなく一行だけ取得する命令となっている。INTO WA(作業領域)の代わりに、オプションとしてあるTRANSPORT NO FIELD を使用し、SY-SUBRCが0(データが存在した)か0以外(データ存在しない、又はエラー)でデータチェックだけを行う事もできる。

更新(APPEND、MODIFY)

「更新」としては行を追加するのか、存在している行の値を変更するのかで命令が異なる。行を追加する場合はAPPEND、INSERT命令を使おう。ソートテーブルを使用し集計したい場合はCOLLECT命令を使用しよう。

APPEND WA_TAB TO IT_TAB.
INSERT WA_TAB INTO IT_TAB.
COLLECT WA_TAB INTO IT_TAB.

また、”INSERT LINES OF itab1 [FROM n1] [TO n2] INTO TABLE itab2″を使用して複数行を一度に追加する事も可能である。
行の値を変更する場合はMODIFY命令を使用しよう。

LOOP AT IT_TAB INTO WA_TAB.
  WA_TAB-MATNR = 'XXXXXX'.
  MODIFY IT_TAB FROM WA_TAB.
ENDLOOP.

上記では明示的に更新しているが、更新するだけであればフィールドシンボルを使用した方がシンプルだと個人的には思う。

FIELD-SYMBOLS: <FS_TAB> TYPE MARA.

LOOP AT IT_TAB ASSIGNING <FS_TAB>.
  <FS_TAB>-MATNR = 'XXXXXX'.
ENDLOOP.

削除(DELETE)

不要な行を削除したいのであれば条件を指定しDELETE命令を使用しよう。

DELETE IT_TAB WHERE MATNR = 'XXXXX'.

重複した行を削除したいのであればADJACENT DUPLICATESオプションを指定してDELETE命令を使用しよう。削除する際に、前後の指定した項目が同じかで判断される為、命令の直前に必ずソート(SORT)する事を忘れないでほしい。

SORT IT_TAB BY MATNR.
DELETE ADJACENT DUPLICATES FROM IT_TAB COMPARING MATNR. "MATNRが重複している場合は削除