MODIFY TABLE типа ANY TABLE из поля-символа типа ANY - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть общая таблица типа «любая таблица», и я пытаюсь изменить там некоторые записи следующим образом:

  LOOP AT ct_data INTO <fs_data>.
    ASSIGN COMPONENT 'KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      IF <fs_feld_fu_key> = <fs_mci_items>-parent_key.
        ASSIGN COMPONENT 'ZZ_CHANGED_FIELD' OF STRUCTURE <fs_data>  TO <fs_feld_walzzyk>.
        IF <fs_feld_walzzyk> IS ASSIGNED.
          <fs_feld_walzzyk> = <fs_mci_items>-zz_changed_field.
          MODIFY TABLE ct_data FROM <fs_data>.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

Все символы поля имеют тип «любой».

Все в этом коде работает нормально, НО после этой строки:

MODIFY TABLE ct_data FROM <fs_data>.

Я получаю SY_SUBRC = 4, и таблица не будет изменена.У кого-нибудь есть идеи или советы?Что я делаю не так в этом случае?

Полный код:

    DATA: rt_data TYPE REF TO data,
      ls_key  TYPE /bobf/s_frw_key,
      lt_key  TYPE /bobf/t_frw_key.
FIELD-SYMBOLS: <fs_data>         TYPE any,
               <fs_feld_fu_key>  TYPE any,
               <fs_feld_walzzyk> TYPE any.


CREATE DATA rt_data LIKE LINE OF ct_data.
ASSIGN rt_data->* TO <fs_data>.

IF <fs_data> IS ASSIGNED.
  LOOP AT ct_data INTO <fs_data>.
    ASSIGN COMPONENT 'fu_key' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      ls_key-key = <fs_feld_fu_key>.
      APPEND ls_key TO lt_key.
    ENDIF.
  ENDLOOP.
ENDIF.


/scmtms/cl_tor_helper_read=>get_tor_data(
  EXPORTING
    it_root_key          = lt_key
  IMPORTING
    et_mci_items         = DATA(lt_mci_items)
).


LOOP AT lt_mci_items ASSIGNING FIELD-SYMBOL(<fs_mci_items>).
  LOOP AT ct_data INTO <fs_data>.
    ASSIGN COMPONENT 'FU_KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      IF <fs_feld_fu_key> = <fs_mci_items>-parent_key.
        ASSIGN COMPONENT 'ZZ_CHANGED_FIELD' OF STRUCTURE <fs_data>  TO <fs_feld_walzzyk>.
        IF <fs_feld_walzzyk> IS ASSIGNED.
          <fs_feld_walzzyk> = <fs_mci_items>-zz_walzzyklus.
          MODIFY TABLE ct_data FROM <fs_data>.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDLOOP.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

<fs_data> не указывает на ct_data.Он указывает на новую область памяти, которую вы создаете в самом начале.Удалите это и объявите символ поля встроенным, чтобы получить указатель на фактический вывод:

DATA: rt_data TYPE REF TO data,
      ls_key  TYPE /bobf/s_frw_key,
      lt_key  TYPE /bobf/t_frw_key.
FIELD-SYMBOLS: <fs_feld_fu_key>  TYPE any,
               <fs_feld_walzzyk> TYPE any.


IF <fs_data> IS ASSIGNED.
  LOOP AT ct_data ASSIGNING FIELD-SYMBOL(<fs_data>).
    ASSIGN COMPONENT 'fu_key' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      ls_key-key = <fs_feld_fu_key>.
      APPEND ls_key TO lt_key.
    ENDIF.
  ENDLOOP.
ENDIF.


/scmtms/cl_tor_helper_read=>get_tor_data(
  EXPORTING
    it_root_key          = lt_key
  IMPORTING
    et_mci_items         = DATA(lt_mci_items)
).


LOOP AT lt_mci_items ASSIGNING FIELD-SYMBOL(<fs_mci_items>).
  LOOP AT ct_data ASSIGNING <fs_data>.
    ASSIGN COMPONENT 'FU_KEY' OF STRUCTURE <fs_data> TO <fs_feld_fu_key>.
    IF <fs_feld_fu_key> IS ASSIGNED.
      IF <fs_feld_fu_key> = <fs_mci_items>-parent_key.
        ASSIGN COMPONENT 'ZZ_CHANGED_FIELD' OF STRUCTURE <fs_data>  TO <fs_feld_walzzyk>.
        IF <fs_feld_walzzyk> IS ASSIGNED.
          <fs_feld_walzzyk> = <fs_mci_items>-zz_walzzyklus.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDLOOP.
0 голосов
/ 13 декабря 2018

<fs_data> - указатель на строку в ct_data.Вы пытаетесь изменить таблицу от себя.sy-subrc = 4 просто говорит о том, что ничего не изменится.

Как отмечает в своем комментарии JozsefSzikszai, вам MODIFY TABLE вообще не нужен.Просто измените значения в <fs_data> напрямую.

...