【開発基礎】内部テーブルの種類、使い方と注意点
INDEX LINK
はじめに
SAP ERP業界でキャリアを積む方の多くが、ABAPer、つまりプログラマーからスタートします。
また、コンサルタントとして活躍したい方もABAPの知識を持っていると非常に有利です。
ABAPは独自性の強い言語ですが、他の言語にくらべるとクセがなく、扱いやすいと思います。
特にデータを内部に保持して編集できる機能「内部テーブル」は、SAPエンジニアの強い味方です。
今回は、SAPエンジニアを目指す方に向け、内部テーブルの基礎知識を解説したいと思います。
1.そもそも内部テーブルとは何か
まず、内部テーブルとは何か?というところから解説したいと思います。
内部テーブルは、ABAPプログラム内でデータを一時的に格納するための構造です。
データベーステーブルに似た構造を持ちますが、プログラムが実行されている間だけ存在する一時的なデータストレージというイメージですね。
一時的な存在なので、実効が終わると同時に内部テーブルは消滅します。
内部テーブルを活用することで、大量のデータを効率的に操作したり、データの一括処理を行ったりすることが可能です。
内部テーブルは、行と列で構成されています。
各行は一つのデータレコードを表し、各列はデータの属性(例えば、社員ID、名前、給与など)を表します。
内部テーブルの列の定義は、ABAPのデータ辞書で定義されたフィールドに基づくことが多いです。
データベースには保存されないため、データの加工や集計を行うための一時的な作業領域として使用されます。
2.内部テーブルの種類
内部テーブルは主に以下3つの種類で構成されます。
・標準テーブル(Standard Table)
ABAPで使用される一般的な内部テーブルです。
内部テーブル宣言時に’TYPE STANDARD TABLE OF’と記述することで標準テーブルが定義されます。
ただし’TYPE TABLE OF’と記述した場合も標準テーブルの宣言だとみなされるので注意しましょう。
基本的に標準テーブルは、抽出したデータがそのままの形で格納され、順序やキーによってデータが変更されません。
・ソートテーブル(Sorted Table)
データが特定のキーによってソート(並び替え)される内部テーブルです。
データを格納する際に条件(キー)を指定し、それに従ってソートされた状態で格納されます。
並び替え処理が入るので標準テーブルと比べて処理時間を要します。
一方で、ソートテーブル内のデータを条件付きで読み込む場合は処理効率が良いです。
・ハッシュテーブル(Hashed Table)
ハッシュテーブルとは、キーを指定することで高速なデータアクセスを実現するための内部テーブルです。
キーが一意である必要がありますが、データの検索やアクセスが非常に高速なため、大規模なデータを扱う際に重宝します。
パフォーマンスの要件が厳しいプログラムで多用するので、必ず使い方を覚えておきましょう。
3.コード付きで解説「内部テーブルでできること」
内部テーブルはデータの検索、並び替え、フィルタリング、集計など、さまざまな操作が簡単に行えます。
ABAPの豊富な標準命令を使って、内部テーブル内のデータを効率的に操作することができます。
・内部テーブルの定義
内部テーブルを使う場合は、まずテーブルを定義します。
内部テーブルは通常、行の構造を定義する「ワークエリア」や「構造体」と一緒に使います。
コード例
TYPES: BEGIN OF ty_employee, ” 構造体を定義
id TYPE i,
name TYPE string,
salary TYPE p DECIMALS 2,
END OF ty_employee.
TYPES: tt_employee TYPE STANDARD TABLE OF ty_employee WITH DEFAULT KEY. ” 内部テーブルの定義
DATA: lt_employee TYPE tt_employee, ” 内部テーブルを宣言
wa_employee TYPE ty_employee. ” ワークエリアを宣言
このコードでは、「ty_employee」という構造体を定義しています。
また構造体の中には、id(社員ID)、name(名前)、salary(給与)という3つのフィールドがあります。
そして、tt_employeeという内部テーブルを、ty_employee型の標準テーブルとして定義。
lt_employeeが内部テーブルのインスタンスであり、wa_employeeがデータを操作するためのワークエリアですね。
・データの追加(INSERT)
次に、内部テーブルにデータを追加する場合です。
データの追加には、ワークエリアを使います。
コードの例
CLEAR wa_employee.
wa_employee-id = 1.
wa_employee-name = ‘John Doe’.
wa_employee-salary = 5000.00.
APPEND wa_employee TO lt_employee. ” 内部テーブルにデータを追加
CLEAR wa_employee.
wa_employee-id = 2.
wa_employee-name = ‘Jane Smith’.
wa_employee-salary = 6000.00.
APPEND wa_employee TO lt_employee. ” 別のデータを追加
この例では、ワークエリア「wa_employee」にデータを入力し、それを内部テーブル「lt_employee」に追加しています。
APPEND文を使って、ワークエリアの内容を内部テーブルに行として追加していますね。
・データの読み込み(LOOP)
内部テーブルに格納されたデータを操作するには、LOOP文を使用します。
コードの例
LOOP AT lt_employee INTO wa_employee.
WRITE: / ‘ID:’, wa_employee-id, ‘Name:’, wa_employee-name, ‘Salary:’, wa_employee-salary.
ENDLOOP.
このコードでは、LOOP文を使って内部テーブルlt_employeeの各行を順番に読み込み、ワークエリアであるwa_employeeに格納しています。
その後、WRITE文で各行のデータを出力しています。
・データのフィルタリング(READ)
特定の条件に一致するデータを読み込むには、READ TABLE文を使います。
コードの例
READ TABLE lt_employee INTO wa_employee WITH KEY id = 2.
IF sy-subrc = 0.
WRITE: / ‘Found:’, wa_employee-name, ‘with Salary:’, wa_employee-salary.
ELSE.
WRITE: / ‘Employee not found’.
ENDIF.
このコードでは、id = 2の社員を内部テーブルから検索しています。
sy-subrcが0の場合はデータの検索が成功したことを示し、ワークエリアであるwa_employeeに対象データが格納されます。
また、もし見つからなかった場合は「Employee not found」と表示されるという仕組みです。
・データの更新(MODIFY)
内部テーブルのデータを更新するには、MODIFY文を使用します。
コードの例
READ TABLE lt_employee INTO wa_employee WITH KEY id = 2.
IF sy-subrc = 0.
wa_employee-salary = 6500.00.
MODIFY lt_employee FROM wa_employee.
ENDIF.
このコードでは、id = 2の社員の給与を6500.00に更新しています。
MODIFY文を使うことで、内部テーブルの既存の行を更新することができます。
ちなみにMODIFY文は、下記のような使い方も可能です。
・単一行の変更と挿入
MODIFY TABLE 内部テーブル FROM 作業領域 [TRANSPORTING 項目名].
・条件に合致した複数の行を変更
MODIFY 内部テーブル FROM 作業領域 TRANSPORTING 項目名 WHERE 条件.
・行指定による変更
MODIFY 内部テーブル FROM 作業領域 INDEX インデックス [TRANSPORTING 項目名].
・データの削除(DELETE)
内部テーブルからデータを削除するには、DELETE文を使用します。
コードの例
DELETE lt_employee WHERE id = 1.
このコードでは、id = 1の社員データを内部テーブルlt_employeeから削除しています。
まとめ
ABAPの内部テーブルは、データを一時的に格納して操作するために非常に便利な機能です。
データの追加、読み込み、フィルタリング、更新、削除といった操作を簡単に行うことができ、複雑なデータ処理を効率的に実現します。
今回は基本操作を紹介しましたが、この内容だけでもかなりの要件に対応可能です。
決して難しい内容ではないので、ぜひ身につけておきましょう。