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( ).
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! 🙂