Application Development and Automation Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 

Sometimes we need to loop over table and enriching the values via different methods. For SORTED tables we can not pass the line via CHANGING as it leads to runtime error MOVE_TO_LIT_NOTALLOWED_NODATA.

The code below (full code is here) will lead to runtime error (as on the screenshot)

 

 

CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    METHODS main.
  PROTECTED SECTION.
  PRIVATE SECTION.
    TYPES: BEGIN OF ts_name_val
        , key_name TYPE string
        , val TYPE string
        , add_value TYPE string
      ,  END OF ts_name_val
      , tt_name_val TYPE STANDARD TABLE OF ts_name_val WITH DEFAULT KEY
      , tt_name_val_srt TYPE SORTED TABLE OF ts_name_val WITH UNIQUE KEY key_name
      .

    METHODS fill_add_value
      CHANGING cs_name_val TYPE ts_name_val.

ENDCLASS.

CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    DATA lt_name_val TYPE tt_name_val_srt.
    FIELD-SYMBOLS <fs_name_val> TYPE ts_name_val.

    lt_name_val = value #(
    ( key_name = 'NUM100' val = 'base_val_100' )
    ( key_name = 'NUM102' val = 'base_val_102' )
    ).

    LOOP AT lt_name_val ASSIGNING <fs_name_val>.
      fill_add_value( CHANGING cs_name_val = <fs_name_val> ).
    ENDLOOP.

  ENDMETHOD.

  METHOD fill_add_value.
    cs_name_val-add_value = 'some val'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  new lcl_app( )->main( ).

 

 

pict1.jpg

 

However instead of changing we could pass as ref via importing parameter. The code without runtime errors is below (full code could be found here).

 

 

CLASS lcl_app DEFINITION.

  PUBLIC SECTION.
    METHODS main.
  PROTECTED SECTION.

  PRIVATE SECTION.
    TYPES: BEGIN OF ts_name_val
        , key_name TYPE string
        , val TYPE string
        , add_value TYPE string
      ,  END OF ts_name_val
      , tt_name_val TYPE STANDARD TABLE OF ts_name_val WITH DEFAULT KEY
      , tt_name_val_srt TYPE SORTED TABLE OF ts_name_val WITH UNIQUE KEY key_name
      .

    METHODS fill_add_value
      CHANGING cs_name_val TYPE ts_name_val.

    METHODS fill_add_value_ref
      IMPORTING isr_name_val TYPE REF TO ts_name_val.
ENDCLASS.

CLASS lcl_app IMPLEMENTATION.
  METHOD main.
    DATA lt_name_val TYPE tt_name_val_srt.
    FIELD-SYMBOLS <fs_name_val> TYPE ts_name_val.

    lt_name_val = VALUE #(
    ( key_name = 'NUM100' val = 'base_val_100' )
    ( key_name = 'NUM102' val = 'base_val_102' )
    ).

*    LOOP AT lt_name_val ASSIGNING <fs_name_val>.
*      fill_add_value( CHANGING cs_name_val = <fs_name_val> ).
*    ENDLOOP.

    LOOP AT lt_name_val ASSIGNING <fs_name_val>.
      fill_add_value_ref( isr_name_val = REF #( <fs_name_val> ) ).
    ENDLOOP.

  ENDMETHOD.

  METHOD fill_add_value.
    cs_name_val-add_value = 'some val'.
  ENDMETHOD.

  METHOD fill_add_value_ref.
    "IMPORTING isr_name_val TYPE REF TO ts_name_val.
    isr_name_val->add_value = 'some val'.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  NEW lcl_app( )->main( ).

 

 

But how are you using do enrich sorted table? via object attribute? Please comment and share you knowledge!
Also I want to highlight that there is a difference between Compiler analyzer and Runtime-analyzer and the only tool to deal with that - it is unit tests or component tests. Hope I could do some blogging about that 😉

Thanks for your attention! 🙂