内部テーブルの基礎知識を押さえよう
内部テーブルとは何か?メモリ上のデータベース
内部テーブルは、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.
実装のポイント:
- 大量データ処理時はパッケージサイズを適切に設定
- バッファ管理を適切に行い、パフォーマンスを最適化
- データベースとの同期は差分更新を基本とする
これらの実践的なテクニックを活用することで、複雑なビジネスロジックを効率的に実装できます。