サーチ…
フィールドシンボル
フィールドシンボルは、フィールドシンボルが常に参照解除される(ただし、メモリ内の実際のアドレスを変更することはできません)点を除き、ABAPはポインタに相当します。
宣言
フィールドシンボルを宣言するには、キーワードFIELD-SYMBOLS使用する必要があります。型は汎用変数( ANY [... TABLE] )で、さまざまな変数を扱うことができます。
FIELD-SYMBOLS: <fs_line> TYPE any, "generic
<fs_struct> TYPE kna1. "non-generic
割り当て
フィールドシンボルは宣言でunassignedため、何も指していません。割り当てられていないフィールドシンボルにアクセスすると例外が発生し、キャッチされない場合は短いダンプになります。したがって、状態はIS ASSIGNEDでチェックする必要があります。
IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.
それらは参照のみであるため、実際のデータは内部に格納することはできません。だから、 DATAはあらゆる用途に必要と宣言されています。
DATA: w_name TYPE string VALUE `Max`,
w_index TYPE i VALUE 1.
FIELD-SYMBOLS <fs_name> TYPE any.
ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name
<fs_name> = 'Manni'. "Changes to <fs_name> now also affect w_name
* As <fs_name> is generic, it can also be used for numbers
ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.
ADD 1 TO <fs_name>. "w_index gets incremented by one
割り当て解除
Field-Symbolをリセットすると便利なことがあります。これはUNASSIGNを使用して行うことができます。
UNASSIGN <fs>.
* Access on <fs> now leads to an exception again
内部テーブルに使用
フィールドシンボルを使用して内部テーブルを変更することができます。
LOOP AT itab INTO DATA(wa).
* Only modifies wa_line
wa-name1 = 'Max'.
ENDLOOP.
LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
* Directly refers to a line of itab and modifies its values
<fs>-name1 = 'Max'.
ENDLOOP.
注意!フィールドシンボルは、ループを離れると割り当てられたままになります。それらを安全に再利用したい場合は、すぐに割り当てを解除してください。
データ参照
データ参照に不可欠なのは、 TYPE後にREF TOを追加したことです。
構造の動的生成
実行時に構造体の型を決定する必要がある場合は、汎用構造体data参照として対象構造体を定義することができます。
DATA wa TYPE REF TO data.
waに型を指定するには、 CREATE DATAステートメントを使用します。加算TYPEは次のように指定できます。
参照:
CREATE DATA wa TYPE kna1
- 静的チェックはアクティブなので、不明なタイプを作成することはできません
名:
CREATE DATA wa TYPE (lw_name_as_string)
- 括弧が必要であり、
lw_name_as_stringにはlw_name_as_stringが文字列として含まれています。- 型が見つからない場合は、
CX_SY_CREATE_DATA_ERROR型の例外がスローされます
動的に作成されたタイプをインスタンス化するには、 HANDLE追加を指定できます。 HANDLEは、 CL_ABAP_DATADESCRから継承するオブジェクトを受け取ります。
CREATE DATA dref TYPE HANDLE obj
objR UN T IME T YPE S ervicesを使用して作成することができますdrefは依然としてデータ参照であるため、datacontainer(通常はField-Symbolsによって行われる)として使用されるためには逆参照(->*)する必要があります。
ランタイムタイプサービス
ランタイムタイプサービス( 短い: RTTS )は、次の目的で使用されます。
- タイプの作成(ランタイムタイプの作成; 略: RTTC )
- タイプの分析(ランタイムタイプ識別; 略: RTTI )
クラス
CL_ABAP_TYPEDESCR
|
|--CL_ABAP_DATADESCR
| |
| |--CL_ABAP_ELEMDESCR
| |--CL_ABAP_REFDESCR
| |--CL_ABAP_COMPLEXDESCR
| |
| |--CL_ABAP_STRUCTDESCR
| |--CL_ABAP_TABLEDESCR
|
|--CL_ABAP_OBJECTDESCR
|
|--CL_ABAP_CLASSDESCR
|--CL_ABAP_INTFDESCR
CL_ABAP_TYPEDESCRは基本クラスです。これは、以下の記述に必要なメソッドを実装しています。
-
DESCRIBE_BY_DATA -
DESCRIBE_BY_NAME -
DESCRIBE_BY_OBJECT_REF -
DESCRIBE_BY_DATA_REF