内部テーブルの基礎知識を押さえよう
内部テーブルとは何か?メモリ上のデータベース
内部テーブルは、ABAPプログラムのメモリ上に作成される一時的なデータ構造です。データベーステーブルとは異なり、プログラムの実行中のみ存在し、高速なデータ処理が可能です。
主な特徴:
- プログラム終了時にデータが消去される
- メモリ上で高速な処理が可能
- 柔軟なデータ構造の定義が可能
- 動的なサイズ変更が可能
3つの内部テーブル型の構文ルール
ABAPには3つの内部テーブル型があり、それぞれ異なる構文ルールに従います:
- Standard Table(標準テーブル)
DATA: gt_standard TYPE STANDARD TABLE OF scarr "インデックスアクセス用
WITH NON-UNIQUE KEY carrid. "非ユニークキー定義
- Sorted Table(ソートテーブル)
DATA: gt_sorted TYPE SORTED TABLE OF scarr "ソート順でアクセス
WITH UNIQUE KEY carrid. "ユニークキー必須
- Hashed Table(ハッシュテーブル)
DATA: gt_hashed TYPE HASHED TABLE OF scarr "ハッシュアクセス
WITH UNIQUE KEY carrid. "ユニークキー必須
3つの内部テーブル型の特徴と使い分け
| テーブル型 | 主な特徴 | 最適な使用シーン |
|---|---|---|
| Standard Table(標準テーブル) | ・インデックスによるアクセス ・キーは任意 ・重複可能 | ・シーケンシャルな処理 ・小〜中規模データ |
| Sorted Table(ソートテーブル) | ・常にソートされた状態 ・バイナリサーチ可能 ・キー必須 | ・頻繁な検索処理 ・ソート順の維持が必要 |
| Hashed Table(ハッシュテーブル) | ・ハッシュアルゴリズムで検索 ・キー必須 ・順序なし | ・大量データの検索 ・一意性の保証が必要 |
内部テーブルを宣言する際の重要なポイント
- 構造定義の方法
" 既存のデータ要素を使用
DATA: gt_carriers TYPE STANDARD TABLE OF scarr.
" インラインで構造定義
TYPES: BEGIN OF ty_custom,
id TYPE i,
name TYPE string,
value TYPE p DECIMALS 2,
END OF ty_custom.
DATA: gt_custom TYPE TABLE OF ty_custom.
- キー定義のベストプラクティス
- 検索頻度の高いフィールドをキーに設定
- パフォーマンスを考慮したキー長の設定
- 適切なキータイプ(UNIQUE/NON-UNIQUE)の選択
- 初期サイズの指定
" 予想されるサイズを指定してメモリ効率を改善
DATA: gt_large_table TYPE STANDARD TABLE OF scarr
INITIAL SIZE 1000.
- 参照テーブルの活用
" 他のテーブルと同じ構造を使用 DATA: gt_reference LIKE TABLE OF gt_carriers.
これらの基礎知識を押さえることで、適切な内部テーブル型の選択と効率的な実装が可能になります。次のセクションでは、これらの内部テーブルを実際にどのように操作するかについて詳しく見ていきます。
内部テーブルを効率的に操作するテクニック
データの追加・変更・削除を最適化する方法
- データの追加(INSERT/APPEND)
DATA: gt_flights TYPE STANDARD TABLE OF sflight.
" 単一行の追加:APPENDが最も高速
APPEND INITIAL LINE TO gt_flights. "最後に空の行を追加
" 複数行の一括追加:INSERTを使用
INSERT LINES OF lt_new_flights "他テーブルのデータを追加
INTO TABLE gt_flights.
" 位置を指定した追加:必要な場合のみ使用
INSERT ls_flight INTO gt_flights "指定位置への追加は低速
INDEX 1.
- データの更新(MODIFY)
" キーによる更新:ハッシュテーブルで最速
MODIFY TABLE gt_flights
FROM ls_flight
TRANSPORTING price currency "更新項目を明示的に指定
WHERE carrid = 'LH'.
" インデックスによる直接更新:標準テーブルで有効
MODIFY gt_flights
FROM ls_flight
INDEX lv_index. "インデックス指定での更新
- データの削除(DELETE)
" キーによる削除:検索コストに注意 DELETE gt_flights WHERE carrid = 'LH'. "条件による削除 " インデックスによる削除:高速だが位置の把握が必要 DELETE gt_flights INDEX 1. "先頭行の削除 " 範囲削除:大量データの一括削除に効果的 DELETE gt_flights FROM 1 TO 100. "範囲指定での削除
実践的な内部テーブル活用術
大量データ処理での内部テーブルの使い方
- メモリ効率を考慮したデータ取得
" 大量データを効率的に処理する例 DATA: gt_items TYPE STANDARD TABLE OF vbap. " 推奨:必要なフィールドのみ選択 SELECT vbeln posnr matnr kwmeng FROM vbap WHERE vbeln IN @lt_orders INTO CORRESPONDING FIELDS OF TABLE @gt_items PACKAGE SIZE 10000. "パッケージサイズの指定 " パッケージ単位の処理 ENDSELECT. " 非推奨:全フィールドの選択は避ける SELECT * "不要なメモリ消費 FROM vbap INTO TABLE @gt_items.
- バッファリング戦略
" 頻繁にアクセスするデータのバッファリング
DATA: gt_buffer TYPE HASHED TABLE OF mara
WITH UNIQUE KEY matnr.
" 初回アクセス時にバッファに格納
SELECT matnr maktx mtart
FROM mara
WHERE matnr IN @lt_required_materials
INTO TABLE @gt_buffer.
" 以降はバッファからの高速アクセス
READ TABLE gt_buffer
WITH TABLE KEY matnr = ls_item-matnr
INTO ls_material.
データベーステーブルとの連携テクニック
- 効率的なデータ同期
" データベースとの差分更新
LOOP AT gt_changes INTO ls_change
GROUP BY ( matnr = ls_change-matnr
count = GROUP SIZE )
INTO DATA(ls_group).
" 一括更新処理
UPDATE mara
SET mtart = @ls_new_mtart
WHERE matnr = @ls_group-matnr.
IF sy-subrc = 0.
" 内部テーブルの更新
MODIFY gt_materials FROM ls_change
TRANSPORTING mtart
WHERE matnr = ls_group-matnr.
ENDIF.
ENDLOOP.
実装のポイント:
- 大量データ処理時はパッケージサイズを適切に設定
- バッファ管理を適切に行い、パフォーマンスを最適化
- データベースとの同期は差分更新を基本とする
これらの実践的なテクニックを活用することで、複雑なビジネスロジックを効率的に実装できます。

