サーチ…


フィールドシンボル

フィールドシンボルは、フィールドシンボルが常に参照解除される(ただし、メモリ内の実際のアドレスを変更することはできません)点を除き、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

  • obj R 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


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow