ABAP Keyword Documentation →  ABAP − Reference →  Processing Internal Data →  Assignments →  Assigning References →  Setting Field Symbols →  ASSIGN →  ASSIGN - mem_area → 

ASSIGN - dynamic_dobj

Quick Reference

Syntax

... { (name) }
  | { dref->* }
  | { dobj INCREMENT inc }
  | { COMPONENT comp OF STRUCTURE struc } ...

Alternatives:

1. ... (name)

2. ... dref->*

3. ... dobj INCREMENT inc

4. ... COMPONENT comp OF STRUCTURE struc

Effect

These alternatives to specifying the memory area mem_area of the statement ASSIGN dynamically are used to dynamically access data objects.

In an inline declaration of the field symbol using FIELD-SYMBOL(<fs>), its typing is performed with the generic type data.

In these variants, the statement ASSIGN sets the return code sy-subrc. If the assignment is successful, sy-subrc is set to 0; if not, it is set to 4. If the assignment is not successful, the field symbol keeps its previous state. It is therefore not enough just to evaluate the predicate expression <fs> IS ASSIGNED in a dynamic ASSIGN; sy-subrc needs to be checked as well.

Alternative 1

... (name)


Effect

In this dynamic variant of mem_area, the memory area is not specified directly, but as content of a character-like data object (name) in parentheses. The following can be specified for name:

If the data object name is specified as a character literal or as a constant, it can be evaluated statically and the specified data object is identified as the used object.
If the data object name is specified as a variable, it is specified only dynamically and the content is not evaluated statically.

When the statement is executed, name is not evaluated until runtime (in both cases). The name in name is structured in the same way as if specified directly: When executing the statement, the content of name must be the name of a data object which may contain offsets and lengths, structure component selectors, and component selectors for assigning structured data objects and attributes in classes or objects. The content of name does not have to be in uppercase letters.

name can contain a chain of names consisting of component selectors. For an individual name or if the first name is followed by an object component selector (->), the specified data object is searched for according to the following hierarchy:

  1. If the statement is located in a procedure, the local data objects of the procedure are scanned.

  2. If the statement is located in a method, the attributes visible in the method within the class are scanned. In instance methods, the static type of me (special case of cref->(attr_name) in dynamic_access) is scanned.

  3. The global data of the current program is scanned.

  4. The interface work areas of the main program of the current program group declared using TABLES are scanned.

  5. If the statement is located in an instance method, the dynamic type of me (special case of cref->(attr_name) in dynamic_access) is scanned.

If the data object is found and the name is followed by an object component selector (->), the search for the following names is continued from left to right, as described under dynamic_access.

If the first name is followed by a class component selector (=>), the specified class is searched for, as described under dynamic_access, and the search is then continued accordingly from left to right.

Notes

Example

Dynamic output of the content of any system field. The validity of the input is checked before it is dynamically assigned with (name) to field symbol syfield via an application of classes of RTTI on structure SYST

DATA(name) = `sy-uzeit`.
cl_demo_input=>request( EXPORTING text = `System field`
                        CHANGING field = name ).
name = to_upper( name ).

DATA(components) = CAST cl_abap_structdescr(
  cl_abap_typedescr=>describe_by_name( 'SYST' ) )->components.
IF NOT line_exists( components[ name = replace( val = name
                                sub  = `SY-`
                                with = `` ) ] ).
  cl_demo_output=>display( `Unknown system field` ).
  RETURN.
ENDIF.

ASSIGN (name) TO FIELD-SYMBOL(<syfield>).

IF sy-subrc = 0.
  cl_demo_output=>display( |{ name }: { <syfield> }| ).
ENDIF.

Alternative 2

... dref->*


Effect

When specifying a dereferenced data reference dref for mem_area using the dereferencing operator ->*, the memory area of the data object is assigned to the field symbol to which dref points. If the reference variable dref does not reference a data object, the assignment is not performed and sy-subrc is set to 4.

Unlike all other operand positions for which the data reference dref must be fully typed for dereferencing, dref can be typed generically in the statement ASSIGN using TYPE REF TO data. Dereferencing of a data reference that does not point to a data object also raises an non-handleable exception in all cases except in the statement ASSIGN.

Example

Creates a local copy of a global data object g_dat in a procedure using a data reference dref and a local field symbol <l_dat>.

DATA g_dat TYPE string VALUE '...'.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS meth.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD meth.
    DATA dref TYPE REF TO data.
    FIELD-SYMBOLS <l_dat> TYPE any.
    CREATE DATA dref LIKE g_dat.
    ASSIGN dref->* TO <l_dat>.
    <l_dat> = g_dat.
    cl_demo_output=>display_data( <l_dat> ).
  ENDMETHOD.
ENDCLASS.

Alternative 3

... dobj INCREMENT inc


Effect

This expression for mem_area assigns a memory area to the field symbol that has the same length as the memory area of dobj and is incremented inc times this length in reference to the memory area of dobj. inc expects a numeric data object. A data object or a field symbol must be specified directly for dobj. Offset or length specifications or the dereferencing of a data reference are not possible. The field symbol cannot be declared via an inline declaration FIELD-SYMBOL(<fs>).

Notes

The dynamic ASSIGN variant with INCREMENT is designed for sequential access to similar memory areas that are located at regular intervals after each other, such as consecutive structure components of the same data type. In all other cases, ASSIGN ... INCREMENT should be used carefully. Note the following in particular:

Example

After the ASSIGN statement, the field symbol points to the fourth component col4. See the example for the addition RANGE.

DATA:
  BEGIN OF struct,
    col1 TYPE string VALUE `COL1`,
    col2 TYPE string VALUE `COL2`,
    col3 TYPE string VALUE `COL3`,
    col4 TYPE string VALUE `COL4`,
    col5 TYPE string VALUE `COL5`,
  END OF struct.

FIELD-SYMBOLS <fs> TYPE string.
ASSIGN struct-col1 INCREMENT 3 TO <fs> RANGE struct.

cl_demo_output=>display( <fs> ).

Executable Example

Field Symbols, ASSIGN INCREMENT

Alternative 4

... COMPONENT comp OF STRUCTURE struc


Effect

This expression for mem_area assigns a memory area of a component comp of a structure struc to the field symbol.

struc is a result position. The structure can be specified as a data object or as a writable expression. If struc is specified as an expression, its result must be structured. If struc is specified as a data object, the result does not need to be structured.

comp is a character-like or numeric expression position. The evaluation depends on the data type of comp:

If an operand struc specified as a data object is not a structure or the specified component is not found, the assignment is not made and sy-subrc is set to 4.

Notes

Example

Assignment of all components of a structure to a field symbol in a loop. In every loop pass, the component is assigned whose position is determined by the loop index.

SELECT SINGLE *
       FROM scarr
       WHERE carrid = 'UA'
       INTO  @DATA(wa).

DO.
  ASSIGN COMPONENT sy-index OF STRUCTURE wa TO FIELD-SYMBOL(<fs>).
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  cl_demo_output=>write( <fs> ).
ENDDO.
cl_demo_output=>display( ).

Example

The following two methods show the dynamic assignment of the components of a structure (passed to the parameter para of the methods) to a field symbol <comp>.

CLASS demo DEFINITION.
  PUBLIC SECTION.
    METHODS: meth1 IMPORTING para TYPE data,
             meth2 IMPORTING para TYPE data.
ENDCLASS.

CLASS demo IMPLEMENTATION.
  METHOD meth1.
    DESCRIBE FIELD para TYPE DATA(dtype).
    IF dtype <> 'u' AND dtype <> 'v'.
      RETURN.
    ENDIF.
    DO.
      ASSIGN COMPONENT sy-index
        OF STRUCTURE para TO FIELD-SYMBOL(<comp>).
      IF sy-subrc <> 0.
        EXIT.
      ENDIF.
      ...
    ENDDO.
  ENDMETHOD.
  METHOD meth2.
    TRY.
        DATA(struct_descr) = CAST cl_abap_structdescr(
          cl_abap_typedescr=>describe_by_data( para ) ).
      CATCH cx_sy_move_cast_error.
        RETURN.
    ENDTRY.
    LOOP AT struct_descr->components
            ASSIGNING FIELD-SYMBOL(<comp_descr>).
      ASSIGN COMPONENT <comp_descr>-name
             OF STRUCTURE para TO FIELD-SYMBOL(<comp>).
      ...
    ENDLOOP.
  ENDMETHOD.
ENDCLASS.

Example

Assigns a component of a row of an internal table to a field symbol.

TYPES:
  BEGIN OF struc,
    col1 TYPE i,
    col2 TYPE i,
  END OF struc.

DATA itab TYPE STANDARD TABLE OF struc WITH EMPTY KEY.

itab = VALUE #( ( col1 = 1 col2 = 2 )
                ( col1 = 3 col2 = 4 ) ).

ASSIGN COMPONENT 2 OF STRUCTURE itab[ 2 ] TO FIELD-SYMBOL(<fs>).

cl_demo_output=>display( <fs> ).



Continue
Example Field Symbols, ASSIGN INCREMENT
Example Field Symbols, Dynamic Structure Components