ABAP

Dynamic Programming

Field-Symbols

Field-Symbols are ABAP’s equivalent to pointers, except that Field-Symbols are always dereferenced (it is not possible to change the actual address in memory).

Declaration

To declare a Field-Symbol the keyword FIELD-SYMBOLS must be used. Types can be generic (ANY [... TABLE]) to handle a wide variety of variables.

FIELD-SYMBOLS: <fs_line>     TYPE any,    "generic
               <fs_struct>   TYPE kna1.   "non-generic

Assigning

Field-Symbols are unassigned on declaration, which means that they are pointing to nothing. Accessing an unassigned Field-Symbol will lead to an exception, and, if uncaught, to a short dump. Therefore, the state should be checked with IS ASSIGNED:

IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.

As they are only references, no real data can be stored inside. So, declared DATA is needed in every case of use.

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

Unassigning

Sometimes it could be useful to reset a Field-Symbol. This can be done using UNASSIGN.

UNASSIGN <fs>.
* Access on <fs> now leads to an exception again

Use for internal tables

Field-Symbols may be used to modify internal tables.

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.

Attention! Field-Symbols stay assigned even after leaving the loop. If you want to reuse them safely, unassign them immediately.

Data references

Essential for data references is the addition REF TO after TYPE.

Dynamic Creation of Structures

If the type of a structure should be decided on runtime, we can define our target structure as reference to the generic type data.

DATA wa TYPE REF TO data.

To give wa a type we use the statement CREATE DATA. The addition TYPE can be specified by:

Reference:

CREATE DATA wa TYPE kna1

  • Static checks are active so it’s not possible to create an unknown type

Name:

CREATE DATA wa TYPE (lw_name_as_string)

  • The parentheses are needed and lw_name_as_string contains the types name as string.
  • If the type was not found, an exception of type CX_SY_CREATE_DATA_ERROR will be thrown

For instancing dynamically created types the HANDLE addition can be specified. HANDLE receives an object which inherits from CL_ABAP_DATADESCR.

CREATE DATA dref TYPE HANDLE obj

  • obj can be created using the RunTime Type Services
  • because dref is still a datareference, it has to be dereferenced (->*) to be used as datacontainer (normally done via Field-Symbols)

RunTime Type Services

RunTime Type Services (short: RTTS) are used either for:

  • creating types (RunTime Type Creation; short: RTTC)
  • analysing types (RunTime Type Identification; short: RTTI)

Classes

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 is the base class. It implements the needed methods for describing:

  • DESCRIBE_BY_DATA
  • DESCRIBE_BY_NAME
  • DESCRIBE_BY_OBJECT_REF
  • DESCRIBE_BY_DATA_REF

This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow