Меню

Тройничок: ABAP-Компилятор, ABAP-Runtime и сортированная таблица

|

В большинстве случае ABAP-компилятор и ABAP-Runtime показывают один и тот же результат: рекомендации или ошибки.

← Предыдущий пост

Однако не в 100% случаев. Сниппет ниже демонстрирует один из таких вариантов. (полный код).

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

Сниппет 1: Компилятор ошибки не выдаст, Runtime остановится в ошибке.

При активации (компиляции) программа не выдаст ошибки, однако в runtime (при запуске) система остановится и будет runtime error: MOVE_TO_LIT_NOTALLOWED_NODATA.

Причина: changing параметр предполагает изменение переменной. А в качестве строки в снипете указана сортированная таблица.  В ней нельзя менять порядок строк; и RUNTIME плохо себя чувствует, когда строка передаётся на changing. При этом компилятор, как можно убедиться – не сообщит об ошибке. Кроме того, реального изменения ключа нет (но теоретически могло быть).

А вот код ниже (где мы changing поменяли на ссылку и также внесли изменения) уже будет выполнен без проблем.

REPORT zrep_c8a014_cmplr_vs_runtime.

CLASS lcl_app DEFINITION.

  PUBLIC SECTION.
    METHODS main.
  PROTECTED SECTION.

  PRIVATE SECTION.

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти