!--a11y-->

すべての ABAP プログラムでは、独自のデータ型を定義することができます。プログラム内部では、プロシージャもローカルデータ型を定義することができます。
次の命令を使用して、プログラム内でローカルデータ型を定義します。
TYPES <t> ...[TYPE <type>|LIKE <obj>] ...
命令。タイプ名 <t> の長さは最大 30 文字です。任意の英字、数字、下線文字を使用することができます。すべて数字で構成される名称は使用しないでください。特殊文字 + 、, 、: 、( ) 、- 、< > は使用できません。,: ( ) - < >. 他の特殊文字は内部使用のために予約されています。事前定義された ABAP データ型 (C 、D 、F 、I 、N 、P 、T 、X 、STRING 、XSTRING) の名称、またはジェネリックタイプ TABLE の名称は使用できません。ABAP キーワードまたはオプションと同じ名称は使用しないでください。以下を使用するようにしてください。
キ データ型の意味を説明しており、追加コメントの不要な名称
キ 複合語を区切るための下線文字
キ 変数名の先頭文字には常に英字を使用
プログラム内でローカルデータ型を宣言する場合は、既存のデータ型を参照するか、新規データ型を設定します。
既存のデータ型として考えられるものは、以下のとおりです。
キ TYPE オプションを使用して参照する事前定義された ABAP データ型
キ TYPE オプションを使用して参照するプログラム内の既存ローカルデータ型
キ LIKE オプションを使用して参照するプログラム内のローカルオブジェクトのデータ型
キ TYPE オプションを使用して参照する ABAP ディクショナリ内のデータ型旧リリースとの互換性を確保するために、LIKE オプションを使用して、ABAP ディクショナリのデータベーステーブルとフラット構造を参照する機能はそのまま使用できます。ただし、新規プログラムでは TYPE オプションを使用してください。
既存のデータ型は、新規データ型を定義する場所で表示可能でなければなりません。既存のデータ型がジェネリックの場合には、追加オプションを使用して、まだ定義されていないタイプ<t> の属性を設定することができます。
プログラム内のローカル基本データ型は、事前定義された基本データ型を参照して定義されます。以下の構文を使用します。
TYPES <t>[(<length>)] [TYPE <type>|LIKE <obj>] [DECIMALS <dec>].
<type> は、プログラム内の事前定義された ABAP データ型 C 、D 、F 、I 、N 、P 、T 、X 、STRING 、または XSTRING のいずれか 1 つ、または ABAP ディクショナリに定義されたデータエレメントです。ABAP ディクショナリのデータエレメントを参照すると、それは基本 ABAP データ型に変換されます。LIKE 参照を使用する場合、<obj> には基本データ型の既存データオブジェクトが使用できます。
オプション TYPE または LIKE を使用しない場合は、デフォルトの事前定義されたデータ型 C が使用されます。<type> に固定長の事前定義されたジェネリックな基本データ型 (C 、N 、P 、X) のいずれか 1 つを指定した場合は、<length> オプションを使用して長さを設定してください。これを省略すると、項目長は、事前定義された ABAP データ型セクションの表に示した該当する初期値に設定されます。<type> が P の場合には、DECIMALS オプションを使って小数点以下桁数を指定することができます。これを省略すると、小数点以下桁数は 0 に設定されます。
したがって、次の暗黙の命令
TYPES <t>.
によって、長さ 1 の文字変数 <f> が定義されます。これは、次の明示的な命令の短縮形です。
TYPES <t>(1) TYPE C.
ただし、常に明示的な命令を使用してください。短縮形は ABAP オブジェクトクラスでは使用できません。
プログラムに基本のローカルデータ型を使用すると、プログラムが読み取りやすく、かつ理解しやすくなります。このようなデータ型を使用して複数のデータオブジェクトを定義した場合は、これらの全オブジェクトのデータ型を 1 箇所で変更することができます。これは、TYPE 命令の定義を変更する場合と同じです。または、データ型のセットを複数のプログラムで定期的に使用しても、そのデータ型を ABAP ディクショナリに保存しない場合には、データ型定義に対してインクルードプログラムを登録し、それを関連プログラムに組み込むことができます。

TYPES: number TYPE i,
length TYPE p DECIMALS 2,
code(3) TYPE c.
...
この例では、NUMBER というデータ型が定義されています。これは事前定義されたデータ型 I と同じですが、プログラムを読み取りやすくするために別の名称が使われている点が異なります。
プログラムは、データ型 LENGTH をジェネリック ABAP データ型 P にもとづいて定義します。LENGTH は指定された小数点以下桁数で定義されます。たとえば、長さ指定の制度を変更する必要が生じた場合には、プログラム内で TYPES 命令を変更するだけですみます。
3 番目のデータ型、CODE も定義されています。CODE は事前定義されたジェネリックな ABAP データ型 C にもとづいています。長さは 3 バイトで定義されています。

DATA counts TYPE i.
TYPES: company TYPE spfli-carrid,
no_flights LIKE counts.
この例は、TYPE オプションを使用してデータベーステーブル (SPFLI) の列 (CARRID) を参照する方法を示しています。LIKE オプションは既存のデータオブジェクトを参照します。
参照タイプはプログラム内でローカルに定義することも、ABAP ディクショナリでグローバルに定義することもできます。以下の構文を使用します。
TYPES <t> TYPE REF TO ...
TYPE のあとには、既存のデータ型に対する参照はありません。代わりに、以下のタイプコンストラクタが続きます。
キ タイプタコンストラクタ
REF TO DATA
これは、データオブジェクトに対する参照 <t> を宣言します。タイプ <t> の項目には、データオブジェクトに対する参照 ( ポインタ) 、つまり、データ型のインスタンスを含めることができます ( データ参照を参照) 。
キ タイプタコンストラクタ
REF TO <class>|<interface>
これは、クラス <class> またはインタフェース<interface> に対する参照タイプ <t> を定義します。タイプ <t> の項目には、クラス <class> のインスタンス、またはインタフェース <interface> を実行するクラスのインスタンスを含めることができます ( オブジェクト処理を参照) 。
プログラム内の複合ローカルデータ型は、常に上記の基本データ型または参照タイプで構成されます。この場合は、TYPES 命令が複合データ型の構成設計図になります。
以下を使用して既存の複合データ型を参照する場合、
TYPES <t> [TYPE <type>|LIKE <obj>].
既存のデータ型をテンプレートとして使用して、新しい複合データ型が作成されます。ABAP ディクショナリのデータエレメントにもとづく複合 ABAP ディクショナリデータ型の構造またはテーブルタイプを参照する場合は、ディクショナリの構造が使用され、データエレメントが基本 ABAP データ型に変換されます。
TYPES 命令を使用すると、既存の構造やテーブルを参照しないで、新しい複合データ型を定義することができます。
プログラムに新しい構造タイプを設定するには、以下のチェーン TYPES 命令を使用します。
TYPES: BEGIN OF <structure>,
..............
<ti> ...,
..............
END OF <structure>.
このチェーン命令によって、
TYPES BEGIN OF <structure>. および TYPES END OF <structure>.
の間にあるすべての変数を含んだ構造が作成されます。これには、
TYPES <ti>.... で定義されるデータ型が含まれていきます。
コンポーネント <fi> は基本データ型、参照タイプ、または既存の複合データ型を参照する場合は、複合体そのものでもかまいません。TYPES BEGIN OF... および TYPES END OF ブロックはネスト化することもできます。したがって、ディープ構造タイプの作成が可能です。
構造タイプ内の各変数は、プログラム内では構造名とコンポーネント名の間にハイフンを入れて処理されます。たとえば、<structure>-<f i> となります。

TYPES: spfli_type TYPE spfli,
surname(20) TYPE c,
BEGIN OF address,
name TYPE surname,
street(30) TYPE c,
city TYPE spfli_type-cityfrom,
END OF address,
town TYPE address-city.
この例では、プログラム内の 2 つの構造タイプ、SPFLI_TYPE と ADDRESS の定義を示しています。データ型 SPFLI_TYPE の構造は ABAP ディクショナリのデータベーステーブル SPFLI から取り込まれます。SPFLI_TYPE のコンポーネントは SPFLI の列と同じです。コンポーネントの各データ型は、データベーステーブルの列のデータ型と同等の ABAP データ型です。構造タイプ ADDRESS は新しく定義されます。コンポーネント ADDRESS-NAME は以前に定義されたタイプ SURNAME のデータ型を取り込み、コンポーネント ADDRESS-STREET は新しく定義され、ADDRESS-CITY は構造タイプ SPFLI_TYPE の列 CITYFROM のデータ型を取り込みます。

TYPES: BEGIN OF
struct1,
col1 TYPE i,
BEGIN OF struct2,
col1 TYPE i,
col2 TYPE i,
END OF struct2,
END OF struct1.
TYPES mytype TYPE struct1-struct2-col2.
この例は、複合コンポーネント STRUCT2 を含むネストされた構造タイプ STRUCT1 を構成する際に、TYPES BEGIN OF およびTYPES END OF ブロックをネスト化する方法と、内部コンポーネントをアドレス指定する方法を示しています。

* local types in
program
* referring to predefined ABAP types:
TYPES: surname(20) TYPE c,
street(30) TYPE c,
zip_code(10) TYPE n,
city(30) TYPE
c,
phone(20) TYPE
n,
date LIKE
sy-datum.
* local structure in
program
* referring to the above types
TYPES: BEGIN of address,
name TYPE surname,
code TYPE zip_code,
town TYPE city,
str TYPE
street,
END OF address.
* local nested structure in program
* referring to the above types
TYPES: BEGIN of phone_list,
adr TYPE address,
tel TYPE phone,
END OF phone_list.
この例は、単純なデータ型定義から複合データ型を作成する方法を示しています。事前定義された ABAP データ型を使って単純なデータ型のセットを作成した後で、前に定義されたデータ型を使用して構造化タイプ ADDRESS が定義されます。最後に、ネストされた構造タイプ PHONE_LIST が作成されます。この最初のコンポーネントにはタイプ ADDRESS が割り当てられます。
プログラム内のローカルテーブルを内部テーブルといいます。内部テーブルデータ型を新規に作成するには、以下の構文を使用します。
TYPES <t> TYPE|LIKE <tabkind> OF <linetype> [WITH <key>].
TYPE のあとには、既存のデータ型に対する参照はありません。代わりに、以下のタイプコンストラクタが続きます。
<tabkind> OF <linetype> [WITH <key>]
このタイプコンストラクタは、アクセスタイプ<tabkind> 、行タイプ <linetyp> およびキー <key> を含む内部テーブルデータ型を定義します。行タイプ<linetype> には、任意の既存データ型が使用できます。キーの指定はオプションです。したがって、内部テーブルはジェネリックでもかまいません。追加情報については、内部テーブルを参照してください。
