【ABAP】内部テーブルとは?標準テーブル・ソートテーブル・ハッシュテーブルを1から解説

ABAP

ABAPプログラミングにおいて特徴的な概念の1つが「内部テーブル」。内部テーブルとは、プログラム実行中にのみ存在するテーブルのことです。(他の言語でいえば二次元配列のようなものです。)

内部テーブルは、抽出したデータをプログラム実行中に一時的に保持しておくことを主な利用目的としているのですが、利用目的や特徴によって様々な分類が存在します。

このページでは、「そもそも内部テーブルって何?」という疑問をお持ちの方でも理解できるよう内部テーブルの基本知識から、ソートテーブル・ハッシュテーブルなどの実践的な知識までを網羅的に解説します。

このページで学べる内容
  • 【前提】内部テーブルとは?
  • 内部テーブルの分類
    • 標準テーブル(STANDARD TABLE)
    • ソートテーブル(SORTED TABLE)
    • ハッシュテーブル(HASHED TABLE)
    • レンジテーブル(RANGE TABLE)
  • 内部テーブルの宣言方法

SAPエンジニアを目指す方であれば知っておきたい超基本事項ですので、是非このページの内容は漏れなく理解しておくようにしましょう。

それでは早速解説を始めます。

スポンサーリンク
スポンサーリンク

内部テーブルとは?

内部テーブルとは、プログラム実行時にのみメモリ上に存在するテーブルのことです。

「テーブル」という用語になじみのない方のために簡単に説明すると、Excelのように行と列が複数存在する表のようなものです。(他の言語の言葉を借りて言えば、二次元配列のようなデータ構造と言えます。)

変数と構造と内部テーブルの違い

SAPでは、上記図のように3つのデータオブジェクトが存在しており、どのデータオブジェクトの理解も必須です。この辺の基本事項については、別途以下の記事に分かりやすく整理しておいたので、是非合わせてご覧ください。

内部テーブルの種類

内部テーブルと一口に言っても、使い方や目的によって大きく4つに分類されます。

内部テーブルの種類
  • 標準テーブル
  • ソートテーブル
  • ハッシュテーブル
  • レンジテーブル

基本的なプログラムであれば、基本となる「STANDARD TABLE(標準テーブル)」だけを押さえておけばOKですが、機能が複雑になる場合や、パフォーマンスに優れた機能が求められる場合は、他の種類の内部テーブルの利用も必要になります。

ここでは、1つずつその用途と特徴・構文ルールを分かりやすく解説していきます。

標準テーブル(STANDARD TABLE)

標準テーブルは、その名の通り最も基本となる内部テーブルのこと。

ご覧のように、Excelのような誰がみても理解できるような形でレコードが順不同に存在しています。ABAPエンジニアの方が単に「内部テーブル」と呼ぶ場合は、この「標準テーブル(STANDARD TABLE)」を指す場合が多いです。

構文ルール: ~STANDARD TABLE OF~

DATA (内部テーブル名) TYPE STANDARD TABLE OF (参照構造).

変数や構造と同じように内部テーブルの宣言はDATA命令を用います。TYPEオプションの後に「STANDARD TABLE OF」の文言を入れて、標準テーブルであることを明示します。

なお、単に「TABLE OF」という文言で宣言してもOK。ただし、明確にその内部テーブルが「標準テーブル」であることを示したほうが良い場合は、丁寧に「STANDARD」と明記したほうが良いでしょう。

標準テーブル(STANDARD TABLE)の特徴

標準テーブルで覚えておくべきなのは、行数が多くなれば多くなるほど、検索にかかる時間も多くなるということです。

簡単に言えば、データ量に比例して検索速度も遅くなるということです。

数十件ほどのレコードを格納する場合にはこの標準テーブルの形で宣言すべきですが、レコード数が数万件~数百万件になる場合は、後述するハッシュテーブルの利用が推奨されます。

ソートテーブル(SORTED TABLE)

ソートテーブルは、その名の通りレコードが並び替えされた状態で格納される内部テーブルのこと

合計点が低い順にレコードを並べてみましたが、ソートテーブルとはこのようなイメージの内部テーブルです。

構文ルール: ~SORTED TABLE OF~

DATA (内部テーブル名) TYPESORTED TABLE OF (参照構造) WITH (キー項目).

ソートテーブルの場合は、TYPEオプションの後に「SORTED TABLE OF」と続け、最後に「WITH」オプションで並び替えをするキー項目を指定します。

DATA:
  SORT_T1 TYPE SORTED TABLE OF BKPF WITH UNIQUE KEY BUKRS,
  SORT_T2 TYPE SORTED TABLE OF BSEC WITH NON-UNIQUE KEY NAME1,NAME2.

尚、キー項目の指定方法は以下の2種類に分かれます。

キー項目の指定方法
  • UNIQUE KEY 内部テーブル内で一意となる項目
  • NON-UNIQUE KEY 内部テーブル内で一意とならない項目

ソートテーブル(SORTED TABLE)の特徴

ソートテーブルの場合、新たにレコードを格納する際に並び順を気にして格納する必要があるため、標準テーブルと比較して処理速度が遅くなってしまいます。ただし、逆にレコードを検索する際は処理速度が速くなります。

標準テーブルとソートテーブルの差異

レコードを格納する場合の処理速度
標準テーブル > ソートテーブル

レコードを検索する場合の処理速度
標準テーブル < ソートテーブル

したがって、頻繁にレコードを出し入れするような場合は内部テーブルが、一度格納したレコードを頻繁に検索したい場合にはソートテーブルが推奨されます。

ハッシュテーブル(HASHED TABLE)

ハッシュテーブルは、1つ1つのレコードに対してハッシュ処理がなされているテーブルのことです。ハッシュ処理とは、元のデータをある一定の計算手法(2乗した数を基の数で割り....)によって元のデータを置換することをいいます。

この表では、項目「氏名」をキー項目に指定しました。したがって、氏名の値が一定の計算ルールに基づき置換されて保存されている状態になります。

構文ルール: ~HASHED TABLE OF~

DATA (内部テーブル名) TYPEHASHED TABLE OF (参照構造) WITH UNIQUE KYE (項目名). 

ハッシュテーブルを宣言する場合は、TYPEオプションの後に「HASHED TABLE」と続け、最後に「WITH」オプションでキー項目をしてする必要があります。

ハッシュテーブル(HASHED TABLE)の特徴

ハッシュテーブルの特徴は、その検索スピードが「データ量に関わらず一定」であるということ。

これが、ハッシュテーブルの最大の特徴です。データ量に関わらず一定、という性質のため、データ量が大きいテーブルを処理する際にハッシュテーブルが採用されます。例えばデータが1000万件に上るような「ほぼデータベースそのまま」のような処理を行う際にハッシュテーブルを採用するとよいでしょう。

ハッシュテーブルの注意点① キー指定

先ほど、ハッシュ処理では「置換された値は必ず一意になる」と説明しました。

したがって、置換する前の値(ハッシュテーブルのキー項目)も一意でなければなりません。例えば、先ほどの「生徒別点数一覧」の表でハッシュ化する前の「氏名」が重複していた場合どうなるでしょうか?

答えは、プログラムの実行中に「ショートダンプ」を起こし、処理が中止されます。

ハッシュテーブルのキー項目は必ず一意の値でなければなりません。

ハッシュテーブルの注意点② 検索時の指定

ハッシュテーブルを検索する際は、キー項目を全て指定する必要があります。キー項目によってハッシュ化されているためです。

したがって、ハッシュテーブルから「同時にデータを複数個検索することはできません」。

上記3つの内部テーブルのイメージと、検索時のスピードについて解説してきました。これを機会に意識して内部テーブルの処理ができるようになれば幸いです。

レンジテーブル

レンジテーブルはその名の通り「範囲を保持するテーブル」です。

レンジテーブルは、これまでに解説した他の3つの内部テーブルと異なり、実際にすべてのレコードを格納せず、レコードの範囲情報を格納する特殊なテーブルです。

こちらについては、以下の記事で詳しく整理して解説いたしましたので、合わせてご覧ください。

ABAPを1から勉強したい方は

ABAPを1から学習したい方のために、ABAPの基本知識・基礎概念を1つのページにまとめました。

現在、完全無料で公開しておりますので、是非ご覧ください!

タイトルとURLをコピーしました