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

  データ定義&編集

概要

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

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

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

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

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

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

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

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

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

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

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

内部テーブルの使い方

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

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

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

更新(APPEND、MODIFY)

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

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

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

削除(DELETE)

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

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

LEAVE A COMMENT