!--a11y-->

データオブジェクトをフィールドシンボルに割り当てるときに、任意のデータ型にキャストすることができます。つまり、メモリ内のある領域のデータ型を特定のデータ型とみなすことができるわけです。キャストが行われると、オフセット/ 長さアドレシングを行うことなく、項目の一部を象徴的にアドレスすることができます。
ASSIGN 命令で CASTING オプションを使用します。キャストを利用すると、データオブジェクトのデータ型とフィールドシンボルのデータ型間に互換性がない場合も、データオブジェクトをフィールドシンボルに割り当てることができます。CASTING には、暗黙的なデータ型宣言を行うキャストと明示的なデータ型宣言を行うキャストの 2 種類があります。
フィールドシンボルのデータ型がフル指定されている場合、またはフィールドシンボルがジェネリックビルトイン ABAP タイプ (C 、N 、P 、X) のいずれかを持つ場合、次の命令を記述することができます。
ASSIGN ...TO <FS> CASTING.
フィールドシンボルがアクセスされると、データ型がフィールドシンボルと同じであるかのように、割り当てられたデータオブジェクトの内容が解釈されます。データオブジェクトの長さと整列は、フィールドシンボルに対して互換性が必要です。互換性がない場合は、実行時エラーが返されます。フィールドシンボルまたはデータオブジェクトのデータ型が、文字列、参照タイプまたは内部テーブルの場合 ( またはこれらを含む場合) 、これらのコンポーネントのデータ型とポジションは完全に一致する必要があります。一致しない場合は、実行時エラーが発生します。

REPORT demo_field_symbols_casting.
TYPES: BEGIN OF
t_date,
year(4) TYPE
n,
month(2) TYPE
n,
day(2)
TYPE n,
END OF t_date.
FIELD-SYMBOLS <fs> TYPE t_date.
ASSIGN sy-datum TO <fs> CASTING.
WRITE / sy-datum.
SKIP.
WRITE: / <fs>-year , / <fs>-month, /
<fs>-day.
出力は次のようになります。
1999/05/19
1999
05
19
この例では、フィールドシンボル <fs> のデータ型が、ローカルプログラムタイプ t_date でフル指定されています。ASSIGN 命令の CASTING オプションの実行により、項目 SY-DATUM は構造として処理されます。SY-DATUM はフィールドシンボルのデータ型と互換性がないので、CASTING オプションがなければ、上の操作は実行できません。
フィールドシンボルのデータ型がフル指定されておらず、ジェネリックデータ型でも指定されていない場合は、次の形で ASSIGN 命令を記述します。
ASSIGN ... TO <FS> CASTING TYPE < データ型 >|LIKE <obj> [DECIMALS <d>].
フィールドシンボルがアクセスされると、この命令で宣言されたデータ型であるかのように、割り当てられたデータオブジェクトの内容が解釈されます。TYPE オプションの実行後は、かっこ内のデータオブジェクトの名前を宣言することができます。このデータオブジェクトの内容は、実行時のデータ型です。
データオブジェクトへの明示的なキャストが論理的な場合だけ、データ型を入力することができます。たとえば、標準テーブルをソートテーブルに、またはオブジェクト参照をデータ参照にキャストする意味はありません。したがって、TYPE オプションの後は、(SORTED TABLE などの) テーブルの種類や (REF TO を使用して) 参照タイプを宣言することはできません。データ型が、文字列、参照タイプまたは内部テーブルの場合 ( またはこれらを含む場合) 、これらのコンポーネントが、割り当てられたデータオブジェクト内に存在する必要があります。データオブジェクト内にない場合は、構文エラーまたは実行時エラーが返されます。
TYPE または LIKE オプションで宣言されたデータ型は、フィールドシンボルのジェネリックデータ型に対して互換性が必要です。ジェネリックデータ型は、そのまま使うことも、詳細に指定することもできます。ただし、フィールドシンボルの既存の技術属性をリセット することはできません。たとえば、フィールドシンボルのデータ型が完全なジェネリックデータ型の ANY の場合、他のジェネリックデータ型を宣言することができます。フィールドシンボルのジェネリックデータ型が、C 、N 、P 、または X の場合、小数点以下桁数の長さと数字しか指定することができません。フィールドシンボルのデータ型がフル指定されている場合は、それ以上細かく指定することはできないので、そのフィールドシンボルの明示的なデータ型宣言を行うことはできません。このチェックは可能であれば静的に行われ、できない場合は実行時に行われます。
割り当てられたデータオブジェクトの内容をパック数値として解釈できる場合は、DECIMALS オプションを使用します。フィールドシンボルは、指定された <d> 小数点以下桁数になります。DECIMALS は、データ型が定義されていない場合または、データ型が P の場合のみ、使用することができます。データ型が定義されていない場合は、データ型 P が使われます。また、LIKE オプションと DECIMALS オプションを同時に使用することはできません。

REPORT demo_field_symbols_casting_typ.
TYPES: BEGIN OF
t_date,
year(4) TYPE
n,
month(2) TYPE
n,
day(2)
TYPE n,
END OF t_date.
FIELD-SYMBOLS: <fs>
TYPE ANY,
<f> TYPE n.
ASSIGN sy-datum TO <fs> CASTING TYPE t_date.
WRITE / sy-datum.
SKIP.
DO.
ASSIGN COMPONENT sy-index OF STRUCTURE <fs> TO
<f>.
IF sy-subrc <> 0.
EXIT.
ENDIF.
WRITE / <f>.
ENDDO.
出力は次のようになります。
1999/05/19
1999
05
19
この例では、フィールドシンボル <fs> は完全にジェネリックです。ASSIGN 命令の CASTING オプションを使って、項目 SY-DATUM をローカルプログラムタイプ t_date にキャストします。キャスト後は、フィールドシンボル <fs> は、構造のように処理することができますが、コンポーネントの認識はできません。したがって、コンポーネントごとに他のフィールドシンボル<f> に割り当てる必要があります。
次の ASSIGN 命令のオプションは、陳腐化しており、現在は使用されておりません。現在は、これらのオプションの代わりに、上記の CASTING オプションが用いられます。
(CASTING 命令の導入前に) フィールドシンボルのデータ型を割り当てられたオブジェクトタイプから切り離して設定する場合は、ASSIGN 命令の TYPE オプションを使用していました。
ASSIGN ...TO <FS> TYPE <t>.
しかし、長さが固定された基本 ABAP タイプ (C 、D 、F 、I 、N 、P 、T 、X) 、および <t> のリテラルまたは変数には、( 符号付き) 2 バイト整数の場合 's' 、( 符号なし) 1 バイト整数の場合 'b' しか使用できませんでした。これとは対照的に、CASTING 命令では、TYPE オプションの後でもすべてのデータ型を宣言することができます。
TYPE オプションは、次のような場合に使用されていました。
キ データ型が指定されたフィールドシンボル
割り当てられたデータオブジェクトのデータ型とフィールドシンボルのデータ型間に互換性がない場合に、エラーメッセージを出さないようにするためには、データ型が指定されたフィールドシンボルに TYPE オプションを使用するのは効果的でした。この場合、指定されたデータ型 <t> とフィールドシンボルのデータ型間には互換性が必要です。フィールドシンボルは、割り当てられたデータオブジェクトにかかわらず、データ型を保持します。現在このような状況になった場合は、暗黙的なデータ型宣言を行うキャストを実行してください。
キ データ型が指定されていないフィールドシンボル
TYPE オプションを使うと、データ型が指定されていないフィールドシンボル <FS> は、割り当てられているデータオブジェクトのデータ型と出力長ではなく、<t> で指定されたデータ型を採用します。TYPE オプションが ASSIGN 命令に含まれ、フィールドシンボルがプログラムで使用されると、データオブジェクトの内容は、データ型<t> の項目のように解釈されます。現在このような状況になった場合は、明示的なデータ型宣言を行うキャストを実行してください。
宣言されたデータ型が認識されていない場合、宣言されたデータ型の長さが割り当てられた項目に対して短すぎる場合、データ型とフィールドシンボルの整列の互換性がない場合は、エラーメッセージが発生します。

現在は使用されていない TYPE を使用した例は、次のとおりです。
DATA TXT(8) VALUE '19980606'.
DATA mytype(1) VALUE 'X'.
FIELD-SYMBOLS <fs>.
ASSIGN txt TO <fs>.
WRITE / <fs>.
ASSIGN txt TO <fs> TYPE 'D'.
WRITE / <fs>.
ASSIGN TXT TO <FS> TYPE MYTYPE.
WRITE / <fs>.
CASTING オプションを使用した例は、次のとおりです。
DATA TXT(8) VALUE '19980606'.
DATA mytype(1) VALUE 'X'.
FIELD-SYMBOLS <fs>.
ASSIGN txt TO <fs>.
WRITE / <fs>.
ASSIGN txt TO <fs>
CASTING TYPE d.
WRITE / <fs>.
ASSIGN txt TO <fs>
CASTING TYPE (mytype).
WRITE /
<fs>.
どちらの場合も、次の出力が表示されます。
19980606
06061998
3139393830363036
これらの例では、文字列 TXT はフィールドシンボル <FS> に 3 回割り当てられます。まずキャストなしで割り当てられ、次にデータ型 D でキャストされ、最後にデータ型 X でキャストされます。2 つ目の出力行の書式は、ユーザマスタレコード内のデータによって異なります。最終行の数字は、 txt 内の文字の 16 進コードです。これらは、プラットフォーム依存 ( この場合 ASCII) です。
(CASTING 命令の導入前に) データ型 P のパック数値への割当時にフィールドシンボル内の小数点以下桁数の数を指定する場合は、ASSIGN 命令の DECIMAL オプションを使用していました。
ASSIGN ...TO <FS> DECIMALS <d>.
フィールドシンボルに割り当てられたデータオブジェクトのデータ型が P の場合、ASSIGN 命令のどのバリアントでも DECIMALS オプションを使うことができます。したがって、一般的に、フィールドシンボルと割り当て項目の数値が異なります。小数点以下桁数の数<d> は、リテラルまたは変数として指定することができます。<d> が 0 から 14 の間にない場合、またはフィールドシンボルに割り当てられたデータオブジェクトのデータ型が P でない場合は、実行時エラーが発生します。

現在は使用されていない DECIMALS を使用した例は、次のとおりです。
DATA: pack1 TYPE p
DECIMALS 2 VALUE '400',
pack2 TYPE p DECIMALS 2,
pack3 TYPE p DECIMALS 2.
FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE i.
WRITE: / 'PACK1', pack1.
ASSIGN pack1 TO
<f1> DECIMALS 1.
WRITE: / '<F1> ', <f1>.
pack2 =
<f1>.
WRITE: / 'PACK2',
pack2.
ASSIGN pack2 TO
<f2> DECIMALS 4.
WRITE: / '<F2> ', <f2>.
pack3 = <f1> +
<f2>.
WRITE: / 'PACK3',
pack3.
<f2> =
'1234.56789'.
WRITE: / '<F2> ',
<f2>.
WRITE: / 'PACK2',
pack2.
CASTING オプションを使用した例は、次のとおりです。
DATA: pack1 TYPE p
DECIMALS 2 VALUE '400',
pack2 TYPE p DECIMALS 2,
pack3 TYPE p DECIMALS 2.
FIELD-SYMBOLS: <f1> TYPE ANY, <f2> TYPE i.
WRITE: / 'PACK1', pack1.
ASSIGN pack1 TO
<f1> CASTING TYPE p DECIMALS 1.
WRITE: / '<F1> ', <f1>.
pack2 =
<f1>.
WRITE: / 'PACK2',
pack2.
ASSIGN pack2 TO
<f2> CASTING TYPE p DECIMALS 4.
WRITE: / '<F2> ', <f2>.
pack3 = <f1> +
<f2>.
WRITE: / 'PACK3',
pack3.
<f2> =
'1234.56789'.
WRITE: / '<F2> ',
<f2>.
WRITE: / 'PACK2',
pack2.
どちらの場合も、次のような一覧が表示されます。
PACK1 400.00
<F1> 4,000.0
PACK2 4,000,00
<F2> 40.0000
PACK3 4,040.00
<F2> 1.234,5679
PACK2 123,456.79
データ型 P の項目 3 つの小数点以下桁数は、2 桁となります。フィールドシンボル<f1> の小数点以下桁数は 1 桁、<f2> の小数点以下桁数は 4 桁です。フィールドシンボルと割り当てられた項目で数値が違うことに注意してください。
