!--a11y-->

フィールドシンボルを宣言するには、次の命令を記述します。
FIELD-SYMBOLS <FS> [< データ型 >|STRUCTURE <s> DEFAULT <wa>].
フィールドシンボルでは、角かっこも構文の一部です。角かっこにより、プログラムコードのフィールドシンボルが認識されます。
オプションが指定されない場合、フィールドシンボル <FS> は、割り当てられたデータ型のデータオブジェクトを持ちます。データオブジェクトを割り当てると、フィールドシンボルはその技術属性を継承します。割り当てられたデータオブジェクトのデータ型が、フィールドシンボルのデータ型になります。
注記: 参照変数と構造化データオブジェクトは、データ型指定のないフィールドシンボルに割り当てることができます。ただし、静的なフィールドシンボルは、メモリ内の項目に対するポインタとしてしか機能せず、実行時まで参照または構造化項目の複雑なデータ型属性は持ちません。この種のフィールドシンボルは、(MOVE 命令の場合のように) 項目全体をアドレスする場合にしか使用できません。CREATE OBJECT <FS> または LOOP AT <FS> などの特別な命令は使用できません。
< データ型> オプションで、フィールドシンボルのデータ型を指定することができます。データオブジェクトをフィールドシンボルに割り当てるときには、そのデータオブジェクトのデータ型とフィールドシンボルのデータ型に互換性があるかどうかがチェックされます。データ型に互換性がない、または変換可能ではない場合は、構文エラーまたは実行時エラーとなります。キャストで、フィールドシンボルのデータ型をデータオブジェクトに割り当てる場合は、ASSIGN 命令で明示的に行ってください。キャストが行われると、そのデータオブジェクトのデータ型がフィールドシンボルと同じであるかのように処理が行われます。
プロシージャでの仮パラメータと同じセマンティクスを使って、フィールドシンボルのデータ型を指定します。< データ型> には、TYPE <t> または LIKE <f> を入力します。データ型は、ジェネリックデータ型で指定することも、フル指定することもできます。ジェネリックデータ型を指定した場合、フィールドシンボルのデータ型は、一部指定されるか、まったく指定されません。指定されなかった属性は、ASSIGN 命令の対応するデータオブジェクトから継承されます。データ型をフル指定した場合は、フィールドシンボルの技術属性すべてが決定されます。フル指定後は、完全に同じデータ型のデータオブジェクトしか割り当てることができません。
必ず 各フィールドシンボルに対してデータ型を指定してください。ジェネリックフィールドシンボルをどうしても定義しなければならない場合は、適切なジェネリックデータ型宣言によって、明確に定義する必要があります。
以下のデータ型により、実パラメータをより柔軟に使用することができます。データオブジェクトに必要なのは、選択した属性だけです。
|
データ型指定 |
データオブジェクトのチェック |
|
データ型指定なし TYPE ANY |
全データ型のデータオブジェクトが合格です。フィールドシンボルは、データオブジェクトのすべての属性を採用します。 |
|
TYPE C 、N 、P 、または X |
データ型 C 、N 、P 、または X だけが合格です。フィールドシンボルは、データオブジェクトの項目長および DECIMALS 指定 ( データ型 P) を採用します。 |
|
TYPE TABLE |
データオブジェクトが標準内部テーブルかどうかがチェックされます。これは、TYPE STANDARD TABLE の短縮フォームです ( 下記参照) 。 |
|
TYPE ANY TABLE |
データオブジェクトが内部テーブルかどうかがチェックされます。フィールドシンボルは、データオブジェクトからすべての属性 ( 行データ型、テーブルデータ型、キー) を継承します。 |
|
TYPE INDEX TABLE |
データオブジェクトが ( 標準またはソートされた) 索引テーブルかどうかがチェックされます。フィールドシンボルは、データオブジェクトからすべての属性 ( 行データ型、テーブルデータ型、キー) を継承します。 |
|
TYPE STANDARD TABLE |
データオブジェクトが標準内部テーブルかどうかがチェックされます。フィールドシンボルは、データオブジェクトから残ったすべての属性 ( 行データ型、キー) を継承します。 |
|
TYPE SORTED TABLE |
実パラメータがソートされた内部テーブルかどうかがチェックされます。フィールドシンボルは、データオブジェクトから残ったすべての属性 ( 行データ型、キー) を継承します。 |
|
TYPE HASHED TABLE |
実パラメータが内部ハッシュテーブルかどうかがチェックされます。フィールドシンボルは、データオブジェクトから残ったすべての属性 ( 行データ型、キー) を継承します。 |
データ型をジェネリックデータ型で指定した場合は、プログラムからフィールドシンボルが継承した属性は、プログラムでは静的に認識可能ではないことに注意してください。これらの属性を 動的にアドレスすることは可能です。

TYPES: BEGIN OF line,
col1 TYPE c,
col2
TYPE c,
END OF line.
DATA: wa TYPE line,
itab TYPE HASHED TABLE OF line WITH UNIQUE
KEY col1,
key(4)
TYPE c VALUE
'COL1'.
FIELD-SYMBOLS <fs> TYPE ANY TABLE.
ASSIGN itab TO <fs>.
READ TABLE <fs> WITH TABLE KEY (key) = 'X' INTO wa.
内部テーブル ITAB は、ジェネリックフィールドシンボル <FS> に割り当てられます。割当後、フィールドシンボルのテーブルキーを動的にアドレスすることができます。ただし、静的アドレス
READ TABLE <fs> WITH TABLE KEY col1 = 'X' INTO wa.
は間違った構文です。理由は、このフィールドシンボルが、テーブル ITAB のキーを実行時まで採用しないからです。プログラムのデータ型 ANY TABLE は、<FS> がテーブルであることだけを示しています。データ型が ANY の場合 ( またはデータ型が指定されていない場合) は、特定の内部テーブル命令 READ TABLE <FS> も記述することができません。
構造化データ型をジェネリックデータ型で指定した場合 ( 構造、または構造化行データ型のあるテーブル) 、それぞれのコンポーネントをプログラム上でアドレスすることは、静的にも動的にも不可能です。この場合、さらにフィールドシンボルとコンポーネントごとの構造の割当メソッドを工夫する必要があります。
次のデータ型を使用すると、フィールドシンボルの技術属性はフル指定されます。データオブジェクトの技術属性は、フィールドシンボルの技術属性と対応する必要があります。
|
データ型指定 |
フィールドシンボルの技術属性 |
|
TYPE D 、F 、I または T |
フィールドシンボルは、事前に定義された基本データ型の技術属性を持ちます。 |
|
TYPE < データ型> |
フィールドシンボルは、<データ型> です。データ型は、TYPES 命令を使用してプログラム内で定義されるか、ABAP ディクショナリで指定されたデータ型になります。 |
|
TYPE REF TO <cif>|DATA |
フィールドシンボルは、クラスやインタフェース <cif> 、またはデータオブジェクトの参照変数です。 |
|
TYPE LINE OF <itab> |
フィールドシンボルは、TYPES 命令または ABAP ディクショナリ内で定義された内部テーブル <itab> の行と同じデータ型です。 |
|
LIKE <f> |
フィールドシンボルは、内部データオブジェクト <f> 、構造、または ABAP ディクショナリのデータベーステーブルと同じデータ型です。 |
データ型をフル指定したフィールドシンボルを使う場合は、属性はソースコードで認識されるので、プログラム内で静的にアドレスすることができます。フィールドシンボルのデータ型を参照または構造化データオブジェクトとして フル指定した場合、フィールドシンボルにオブジェクトを割り当てた後、フィールドシンボルをデータオブジェクト自体のようにアドレスすることができます。したがって、たとえば、ある構造のコンポーネントをアドレスし、内部テーブルをループしたり、フィールドシンボルを参照するオブジェクトを作成したりすることができます。

REPORT demo_field_symbols_type .
DATA: BEGIN OF line,
col1(1) TYPE c,
col2(1) TYPE c VALUE 'X',
END OF line.
FIELD-SYMBOLS <fs> LIKE line.
ASSIGN line TO <fs>.
MOVE <fs>-col2 TO <fs>-col1.
フィールドシンボル <FS> のデータ型は構造としてフル指定されていますので、プログラム内で <FS> のコンポーネントをアドレスすることができます。
STRUCTURE オプションは、フィールドシンボルに割り当てられたデータオブジェクトの構造化ビューを指定します。
FIELD-SYMBOLS <FS> STRUCTURE <s> DEFAULT <f>.
構造 <s> は、プログラムの構造化ローカルデータオブジェクトまたは ABAP ディクショナリのフラット構造です。<f> は、開始項目としてフィールドシンボルに割り当てるデータオブジェクトです。この割当は ASSIGN 命令を使用して変更することができます。
データオブジェクトをフィールドシンボルに割り当てるときには、構造以上の長さがあるかどうかだけがチェックされます。フィールドシンボルの各コンポーネントをアドレスすることも可能です。技術属性は、構造<s> の技術属性と同じです。
<s> がデータ型 I または F のコンポーネントを含む場合、整列が及ぼす影響に注意してください。構造を持つフィールドシンボルにデータオブジェクトを割り当てる場合、データオブジェクトも同じ整列順序になっている必要があります。整列順序が異なる場合は、実行時エラーが発生します。この場合、該当するデータオブジェクトを、最低その構造の長さはフィールドシンボルと同じ構造を持つ構造化フィールドシンボルに割り当てることをお奨めします。
STRUCTURE は、陳腐化しており、現在は使用されておりません。ローカルまたは ABAP ディクショナリのデータ型にキャストする場合、STRUCTURE オプションを使って定義されたフィールドシンボルは、データ型を指定されたフィールドシンボルとユーティリティの中間として扱われます。フィールドシンボルのデータ型を定義する場合は、FIELD-SYMBOLS 命令で TYPE オプションを使います。キャストを行う場合は、ASSIGN 命令で CASTING オプションを使います。

現在は使用されていない STRUCTURE を使用した例は、次のとおりです。
DATA: wa(10) VALUE '0123456789'.
DATA: BEGIN OF line1,
col1(3),
col2(2),
col3(5),
END OF line1.
DATA: BEGIN OF line2,
col1(2),
col2 LIKE sy-datum,
END OF line2.
FIELD-SYMBOLS: <f1>
STRUCTURE line1 DEFAULT wa,
<f2> STRUCTURE line2 DEFAULT wa.
WRITE: / <f1>-col1,
<f1>-col2, <f1>-col3,
/ <f2>-col1,
<f2>-col2.
正しい構文 (TYPE と CASTING) を使用した例は、次のとおりです。
DATA: wa(10) VALUE '0123456789'.
DATA: BEGIN OF line1,
col1(3),
col2(2),
col3(5),
END OF line1.
DATA: BEGIN OF line2,
COL1(2),
COL2 LIKE sy-datum,
END OF line2.
FIELD-SYMBOLS: <f1>
LIKE line1.
ASSIGN wa TO <f1>
CASTING.
FIELD-SYMBOLS: <f2>
LIKE line2.
ASSIGN wa TO <f2>
CASTING.
WRITE: / <f1>-col1,
<F1>-col2, <F1>-col3,
/ <f2>-col1,
<F2>-col2.
どちらの場合も、次のような一覧が表示されます。
012 34 56789
01 2345/67/89
この例では、異なる構造が割り当てられた 2 つのフィールドシンボルが宣言されています。宣言後、文字列 WA がそれぞれに割り当てられます。この出力によって、フィールドシンボルが、コンポーネントのデータ型に従って、コンポーネントごとに文字列を割り当てていることが分かります。
