!--a11y-->

このセクションでは、プログラム内で内部テーブルをローカルに定義する方法が説明されています。ABAP ディクショナリのデータ型 として内部テーブルをグローバルに定義することも可能です。
すべてのプログラムのローカルデータ型同様に、内部テーブルも TYPES 命令で定義します。TYPE や LIKE オプションで既存のテーブルデータ型を参照しない場合は、TYPES 命令で新しいローカル内部テーブルをプログラム内に構築することができます。
TYPES <t> TYPE|LIKE <tabkind> OF <linetype> [WITH
<key>]
[INITIAL SIZE
<n>].
TYPE または LIKE の後には、既存のデータ型への参照はありません。その代わり、データ型コンストラクタを使用します。
<tabkind> OF <linetype> [WITH <key>]
データ型コンストラクタは、テーブルデータ型 <tabkind> 、行データ型<linetype> 、内部テーブル <t> のキー <key> を定義します。
必要であれば、INITIAL SIZE オプションでメモリの初期量を内部テーブルに割り当てることも可能です。
テーブルデータ型<tabkind> は次のように指定します。
INDEX TABLE
索引アクセスするジェネリックテーブルデータ型の登録
ANY TABLE
完全ジェネリックテーブルデータ型の登録
ジェネリックデータ型を使って定義されたデータ型は、現在のところ、フィールドシンボルとプロシージャのインタフェースパラメータにのみ使用できます。ジェネリックデータ型 INDEX TABLE には、標準テーブルとソートテーブルが含まれます。索引アクセスが可能なテーブルデータ型は、2 つあります。このように定義されたフィールドシンボルまたはインタフェースパラメータにハッシュテーブルを渡すことはできません。ジェネリックデータ型 ANY TABLE は、任意のテーブルを表すことができます。このように定義されたフィールドシンボルまたはインタフェースパラメータには、全 3 種類のテーブルを渡すことができます。ただし、フィールドシンボルとパラメータが許可するのは全テーブルに可能な操作だけです。つまり、索引操作は実行できません。
STANDARD TABLE or TABLE
標準テーブルの登録
SORTED TABLE
ソートテーブルの登録
HASHED TABLE
ハッシュテーブルの登録
フル指定されたテーブルデータ型によって、キー操作でテーブル内のエントリがアクセスされる方法が決まります。標準テーブルでは線形検索、ソートテーブルではバイナリ検索、ハッシュテーブルではハッシュアルゴリズム検索が行われます。
行データ型 <linetype> は、次のように指定します。
キ TYPE オプションを使う場合は、すべてのデータ型を指定できます。事前定義された ABAP データ型、プログラムのローカルデータ型、ABAP ディクショナリのデータ型も指定可能です。ジェネリック基本型 C 、N 、P 、X のいずれかを指定する場合、指定しなかった属性 ( 項目長や小数点以下桁数) には初期値が自動的に書き込まれます。他のジェネリックデータ型を指定することはできません。
キ LIKE オプションを使う場合は、その時点でプログラムに認識されるすべてのデータオブジェクトを指定できます。行データ型は、参照するデータオブジェクトのフル指定されたデータ型を採用します。クラス以外では、LIKE オプションを使って、データテーブルや ABAP ディクショナリの構造を参照することができます ( 互換性による) 。
内部テーブルの全行は、特定のデータ型のフル指定された技術属性を持っています。
内部テーブルのキー <key> は次のように指定します。
[UNIQUE|NON-UNIQUE] KEY <col1> ...<coln>
構造化行 データ型のテーブルでは、コンポーネント <coli> は、内部テーブルや参照ではない場合、また、これらを含まない場合は、すべてキーに属します。キー項目は、ネストされた構造の場合もあります。サブ構造は、キーを使ってテーブルにアクセスする際に、コンポーネントごとに拡張されます。システムは、キー項目の順序に従います。
[UNIQUE|NON-UNIQUE] KEY TABLE LINE
テーブルが基本行データ型 (C 、D 、F 、I 、N 、P 、T 、X) を持っている場合、全体行をキーとして定義することができます。定義するテーブルの行データ型自体がテーブルの場合は、構文エラーが発生します。テーブルが構造化行データ型を持つ場合、行全体をキーとして指定することができます。ただし、これは適切 でない場合がよくあるので注意してください。
[UNIQUE|NON-UNIQUE] DEFAULT KEY
これによりデフォルトキーの項目がキー項目として宣言されます。テーブルが構造化された行データ型を持つ場合、デフォルトキーは、参照または内部テーブルではなく、これらを含まない非数値列すべてを含みます。テーブルが基本行データ型を持つ場合、行全体がデフォルトキーとなります。行データ型が内部テーブルである内部テーブルのデフォルトキーは、空です。
キーの指定はオプションです。キーを指定しない場合は、任意のキーを持つテーブルデータ型が定義されます。これにより、フィールドシンボルとプロシージャのインタフェースパラメータのデータ型を定義することができます。例外については、標準テーブルの特別機能を参照してください。
オプション UNIQUE またはNON-UNIQUE により、キーが一意かどうか、つまりテーブルが複製エントリを許容するかどうかが決まります。キーに UNIQUE または NON-UNIQUE を指定しなかった場合、この点でテーブルデータ型はジェネリックになります。したがって、データ型指定にしか使用できなくなります。テーブルデータ型も同時に指定する場合は、次の制限に注意してください。
キ 標準テーブルには、UNIQUE オプションは使用できません。NON-UNIQUE オプションは、常に自動生成されます。
キ ハッシュテーブル作成時は、必ず UNIQUE オプションを指定してください。
次のオプションでデータ型を定義するときに、内部テーブルオブジェクトに割り当てられるメインメモリの初期量を指定することができます。
INITIAL SIZE <n>
このサイズは、内部テーブルのデータ型には属していないので、データ型チェックに影響することはありません。上のオプションを使って、テーブルオブジェクト宣言時に<n> テーブル行の記憶域を予約することができます。
この初期領域がいっぱいの場合、8 KB 以下の範囲で 2 倍の余剰記憶域が作られます。さらに 12 KB のメモリ領域がそれぞれ割り当てられます。
通常、初期メモリ所要量はシステムに算出させます。初めてテーブルに書き込む場合には、メモリはほとんど使われません。行幅によりますが、使用されるスペースは 16 <= <n> <= 100 です。
テーブル作成時にテーブルエントリ数を厳密に指定することができ、メモリ量を正確に割り当てる必要がある場合にのみ、<n> に具体的な値を指定する意味があります( 例外: ランク一覧へのテーブル行のアペンド) 。これは特に、内部テーブルにエントリが少ししかない (5 つくらい) 深い構造を持った内部テーブルを使う際に重要になります。
<n> の値が大きい場合に、メモリを過剰に要求することがないように、<n> の最大値は 8 KB で行の長さで分割されます。<n> に大きい値が指定された場合、n × 行幅が約 12 KB になるように新しい値が計算されます。

TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE SORTED TABLE OF LINE WITH UNIQUE KEY COLUMN1.
このプログラムでは、テーブルデータ型は ITAB に定義されました。このテーブルは、ソートテーブルで、行データ型は構造 LINE です。また、コンポーネント COLUMN1 の一意キーを持っています。

TYPES VECTOR TYPE HASHED TABLE OF I WITH UNIQUE KEY TABLE LINE.
TYPES: BEGIN OF LINE,
COLUMN1 TYPE I,
COLUMN2 TYPE I,
COLUMN3 TYPE I,
END OF LINE.
TYPES ITAB TYPE SORTED TABLE OF LINE WITH UNIQUE KEY COLUMN1.
TYPES: BEGIN OF
DEEPLINE,
FIELD TYPE C,
TABLE1 TYPE VECTOR,
TABLE2 TYPE ITAB,
END OF DEEPLINE.
TYPES DEEPTABLE TYPE
STANDARD TABLE OF DEEPLINE
WITH DEFAULT KEY.
このプログラムで定義されたのは、テーブルデータ型 VECTOR のハッシュテーブルで、基本行データ型は I です。キーは テーブル行全体で、一意キーとなります。2 つ目のテーブルデータ型は、前の例と同じです。構造 DEEPLINE は、内部テーブルをコンポーネントとして持っています。テーブルデータ型 DEEPTABLE の行データ型は、DEEPLINE です。したがって、内部テーブルのエレメント自体も内部テーブルです。キーはデフォルトキーで、この場合は列 FIELD になります。このテーブルは標準テーブルなので、キーは一意ではありません。