ABAP 内部テーブルについて

内部テーブルの基礎知識を押さえよう

内部テーブルとは何か?メモリ上のデータベース

内部テーブルは、ABAPプログラムのメモリ上に作成される一時的なデータ構造です。データベーステーブルとは異なり、プログラムの実行中のみ存在し、高速なデータ処理が可能です。

主な特徴:

  • プログラム終了時にデータが消去される
  • メモリ上で高速な処理が可能
  • 柔軟なデータ構造の定義が可能
  • 動的なサイズ変更が可能

3つの内部テーブル型の構文ルール

ABAPには3つの内部テーブル型があり、それぞれ異なる構文ルールに従います:

  1. Standard Table(標準テーブル)
DATA: gt_standard TYPE STANDARD TABLE OF scarr      "インデックスアクセス用
      WITH NON-UNIQUE KEY carrid.                   "非ユニークキー定義
  1. Sorted Table(ソートテーブル)
DATA: gt_sorted TYPE SORTED TABLE OF scarr  "ソート順でアクセス
      WITH UNIQUE KEY carrid.               "ユニークキー必須
  1. Hashed Table(ハッシュテーブル)
DATA: gt_hashed TYPE HASHED TABLE OF scarr  "ハッシュアクセス
      WITH UNIQUE KEY carrid.               "ユニークキー必須

3つの内部テーブル型の特徴と使い分け

テーブル型主な特徴最適な使用シーン
Standard Table(標準テーブル)・インデックスによるアクセス
・キーは任意
・重複可能
・シーケンシャルな処理
・小〜中規模データ
Sorted Table(ソートテーブル)・常にソートされた状態
・バイナリサーチ可能
・キー必須
・頻繁な検索処理
・ソート順の維持が必要
Hashed Table(ハッシュテーブル)・ハッシュアルゴリズムで検索
・キー必須
・順序なし
・大量データの検索
・一意性の保証が必要

内部テーブルを宣言する際の重要なポイント

  1. 構造定義の方法
" 既存のデータ要素を使用
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.
  1. キー定義のベストプラクティス
  • 検索頻度の高いフィールドをキーに設定
  • パフォーマンスを考慮したキー長の設定
  • 適切なキータイプ(UNIQUE/NON-UNIQUE)の選択
  1. 初期サイズの指定
" 予想されるサイズを指定してメモリ効率を改善
DATA: gt_large_table TYPE STANDARD TABLE OF scarr
      INITIAL SIZE 1000.
  1. 参照テーブルの活用
" 他のテーブルと同じ構造を使用
DATA: gt_reference LIKE TABLE OF gt_carriers.

これらの基礎知識を押さえることで、適切な内部テーブル型の選択と効率的な実装が可能になります。次のセクションでは、これらの内部テーブルを実際にどのように操作するかについて詳しく見ていきます。

内部テーブルを効率的に操作するテクニック

データの追加・変更・削除を最適化する方法

  1. データの追加(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.
  1. データの更新(MODIFY)
" キーによる更新:ハッシュテーブルで最速
MODIFY TABLE gt_flights                  
       FROM ls_flight
       TRANSPORTING price currency       "更新項目を明示的に指定
       WHERE carrid = 'LH'.

" インデックスによる直接更新:標準テーブルで有効
MODIFY gt_flights 
       FROM ls_flight
       INDEX lv_index.                   "インデックス指定での更新
  1. データの削除(DELETE)
" キーによる削除:検索コストに注意
DELETE gt_flights WHERE carrid = 'LH'.   "条件による削除

" インデックスによる削除:高速だが位置の把握が必要
DELETE gt_flights INDEX 1.               "先頭行の削除

" 範囲削除:大量データの一括削除に効果的
DELETE gt_flights FROM 1 TO 100.         "範囲指定での削除

実践的な内部テーブル活用術

大量データ処理での内部テーブルの使い方

  1. メモリ効率を考慮したデータ取得
" 大量データを効率的に処理する例
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.
  1. バッファリング戦略
" 頻繁にアクセスするデータのバッファリング
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.

データベーステーブルとの連携テクニック

  1. 効率的なデータ同期
" データベースとの差分更新
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.

実装のポイント:

  • 大量データ処理時はパッケージサイズを適切に設定
  • バッファ管理を適切に行い、パフォーマンスを最適化
  • データベースとの同期は差分更新を基本とする

これらの実践的なテクニックを活用することで、複雑なビジネスロジックを効率的に実装できます。