!--a11y-->

場合によっては、静的に利用不可能だったデータオブジェクトの属性を、実行時に特定する必要があります。たとえば、サブルーチンで汎用インタフェースパラメータの型の特定が必要になることがあります。これには、以下の命令を使用します。
DESCRIBE FIELD <f> [LENGTH <l>] [TYPE <t> [COMPONENTS
<n>]]
[OUTPUT-LENGTH <o>] [DECIMALS <d>]
[EDIT MASK <m>] [HELP-ID <h>].
命令のパラメータで指定したデータオブジェクト <f> の属性は、パラメータに続く変数に書き込まれます。同じ命令内で、オプションをいくつでも使用することができます。
DESCRIBE FIELD DISTANCE BETWEEN <f1> AND <f2> INTO <d> .
この命令により、データオブジェクト <f1> と <f2> の間の距離が返されます。
以下の 各セクションには、オプションについて詳細に説明されています。
データオブジェクトの項目長を特定するには、LENGTH オプションを使用します。
DESCRIBE FIELD <f> LENGTH <l> IN CHARACTER MODE | IN BYTE MODE.
この命令により、項目 <f> の長さが変数 <l> に書き込まれます。

DATA: text(8) TYPE
c
,
len TYPE
i
.
DESCRIBE FIELD text LENGTH len IN CHARACTER MODE .
項目 LEN には値 8 が格納されます。
データオブジェクトのデータ型を特定するには、TYPE オプションを使用します。
DESCRIBE FIELD <f> TYPE <t>.
この命令により、項目 <f> の型が変数 <t> に書き込まれます。
項目の組込 ABAP 型 (C 、D 、F 、I 、N 、P 、T 、X) とは別に、この命令で以下の値が返される可能性があります。
キ s - 先行符号がある 2 バイト整数
キ b - 先行符号がない 1 バイト整数
キ r - 参照
キ h - 内部テーブル
これらの値は内部型 ID です。内部型 s または b のデータオブジェクトは、ABAP ディクショナリの対応する基本データ型を参照して宣言された可能性があります。型 h のデータオブジェクトは集約されています。内部テーブル r のデータオブジェクトは、ABAP オブジェクトの参照変数です。
<f> が構造の場合、この命令で値 C も返されます。構造についてさらに特定するには、追加オプションCOMPONENTS を使用する必要があります。
DESCRIBE FIELD <f> TYPE <t> COMPONENTS <n>.
C に代わり、この命令により、以下の内部型 ID が変数 <t> に書き込まれます。
キ u - コンポーネントとして内部テーブルを所有しない構造
キ v - コンポーネントまたはサブコンポーネントとして、最低 1 つの内部テーブルを所有する構造
構造の直接コンポーネント数は、整数として変数 <n> に書き込まれます。

TABLES
spfli
.
DATA: numtext(8) TYPE n,
typ(1) TYPE
c
.
DESCRIBE FIELD numtext TYPE typ.
WRITE typ.
DESCRIBE FIELD spfli-fltime TYPE typ.
WRITE typ.
この例では、以下のように出力されます。
N T
この例の場合、項目 TYP に最初に値 N が格納され、次に値 T が格納されます。

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.
TYPES: BEGIN OF address,
NAME TYPE surname,
CODE TYPE zip_code,
TOWN TYPE city,
STR TYPE
street,
END OF address.
TYPES: BEGIN OF phone_list,
adr TYPE address,
tel TYPE phone,
END OF phone_list.
DATA pl TYPE phone-list.
DATA: typ(1) TYPE c,
n TYPE i.
DESCRIBE FIELD pl TYPE typ COMPONENTS n.
この時点で、項目 TYP に値 u が格納される一方、N には値 2 が格納されます。これは、PL が 2 つの直接コンポーネント (ADR と TEL) を所有し、内部テーブルは所有しない構造のためです。
データオブジェクトの項目長を特定するには、OUTPUT-LENGTH オプションを使用します。
DESCRIBE FIELD <f> OUTPUT-LENGTH <o>.
この命令により、項目 <f> の出力長が変数 <o> に書き込まれます。項目の出力長は、WRITE 命令 の後、一覧上で項目内容によって占有される文字数です。

DATA: float TYPE f,
out TYPE i,
len TYPE i.
DESCRIBE FIELD float LENGTH len OUTPUT-LENGTH out.
この例では、結果的に項目 LEN に値 8 が格納され、項目 OUT には値 22 が格納されます。
データオブジェクトによって占有される小数点以下桁数を特定するには、DECIMALS オプションを使用します。
DESCRIBE FIELD <f> DECIMALS <d>.
この命令により、項目 <f> の小数点以下桁数が変数 <d> に書き込まれます。

DATA: pack TYPE p DECIMALS 2, dec(1) TYPE c.
DESCRIBE FIELD pack DECIMALS dec.
この例では、結果的に項目 DEC に値 2 が格納されます。
ABAP ディクショナリの項目に定義された変換ルーチンを特定するには、EDIT MASK オプションを使用します。
DESCRIBE FIELD <f> EDIT MASK <m>.
ABAP
ディクショナリデータ型を参照して項目 <f>
を宣言し、その項目に変換ルーチン
<conv>
がある場合は、この命令により、変換ルーチンが変数 <m>
に
'==<conv>'
の書式で書き込まれます。ABAP
ディクショナリのデータエレメントのドメインに対して、
変換ルーチンを指定することができます。各変換ルーチンは、2
つの汎用モジュールとリンクしています。これらの汎用モジュールにより、値の ABAP
ディクショナリ表現をプログラム表現に変換すること、およびその逆の変換が可能です。変数<m>
は、WRITE
命令内で編集マスクとして使用することができます。

DATA: fltime TYPE
s_fltime,
m(7) TYPE c.
DESCRIBE FIELD fltime EDIT MASK m.
fltime = sy-uzeit.
WRITE: / fltime,
/ sy-uzeit,
/ sy-uzeit USING EDIT MASK
m.
ABAP ディクショナリのデータエレメント S_FLTIME のドメイン S_DURA は、変換ルーチン SDURA とリンクしています。項目 M には値 ==SDURA が格納されます。これにより、出力一覧が以下のように生成されます。
604:55
10:04:55
604:55
変換ルーチン SDURA は、時間を分に変換します。内部的に項目 FLTIME は、変換された書式で処理されます。項目 SY-UZEIT は、変換された書式で一覧に表示されます。
HELP-ID オプションを使用すると、ABAP ディクショナリの項目に定義されたヘルプテキスト (F1 ヘルプ) の ID を特定することができます。
DESCRIBE FIELD <f> HELP-ID <h>.
ABAP ディクショナリのデータ型を参照して項目 <f> が定義されている場合、この命令でヘルプテキスト ID が変数 <h> に書き込まれます。適切な汎用モジュールでこの ID を使用し、ヘルプテキストを表示することができます。

DATA: company TYPE
s_carr_id,
h(20) TYPE c,
tlink TYPE TABLE OF tline.
DESCRIBE FIELD company HELP-ID h.
CALL FUNCTION
'HELP_OBJECT_SHOW'
EXPORTING
dokclass =
'DE'
doklangu =
sy-langu
dokname
= h
TABLES
links
= tlink
EXCEPTIONS
object_not_found =
1
sapscript_error
= 2
others =
3.
IF sy-subrc <>
0.
...
ENDIF.
このプログラムでは、項目 H でデータエレメントS_CARR_ID の名称を受け取ります。汎用モジュールHELP_OBJECT_SHOW により、データエレメントの文書がダイアログボックスに表示されます。
メモリ内で 2 つの項目間の距離を特定するには、以下の命令を使用します。
DESCRIBE FIELD DISTANCE BETWEEN
<f1> AND <f2> INTO <d>
IN CHARACTER MODE | IN BYTE MODE
.
この命令により、データオブジェクト <f1> と <f2> の間のバイト数が変数 <d> に返されます。このバイト数には、メモリにある最初の項目の長さが常に含まれます。あらゆる整列が考慮されます。

DATA: BEGIN OF test,
col1(3) TYPE C,
col2(2) TYPE C,
col3 TYPE i,
END OF
test,
dist
TYPE i.
DESCRIBE DISTANCE BETWEEN
test-col3 AND test-col1 INTO dist
IN
BYTE MODE.
項目 DIST の値は 8 です。この値は、コンポーネント COL1 および COL2 のそれぞれの長さ 3 と 2 と、COL2 と COL3 の間の 3 文字の整列ギャップです。
