Как добавить новую строку во вложенную внутреннюю таблицу?

#abap #internal-tables

#abap #internal-таблицы

Вопрос:

 DATA: BEGIN OF line,
        CUOBJ TYPE CUOBJ,
        tab_atinn   TYPE STANDARD TABLE OF ATINN WITH DEFAULT KEY,
   END OF line.

  DATA:
    CUBOBJ_TABLE LIKE STANDARD TABLE OF line WITH DEFAULT KEY.

...

DATA(table) = CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn.
      IF NOT line_exists( table[ currentatinn ] ).
        INSERT currentatinn INTO table INDEX 1.
      ENDIF.
  

Я пытаюсь добавить новую строку в CUOBJ_TABLE [..]-tab_atinn.
Переменная table будет иметь новую строку после выполнения кода, но в таблице CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn ее не будет.

Как я могу добавить ее непосредственно в CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn, используя ссылку или что-то в этом роде?

Ответ №1:

С точной ссылкой проблема заключается в назначении:

 DATA(table) = CUBOBJ_TABLE[ CUOBJ = value-instance ]-tab_atinn.
  

Это создает новую таблицу со значениями sames в качестве поля tab_atinn. Затем вы добавляете запись в эту новую таблицу, не затрагивая глубокую таблицу в CUOBJ_TABLE.
Что вам нужно, так это ссылка, указывающая на таблицу, которую вы хотите изменить, чтобы она фактически обновляла таблицу, а не ее копию, должно работать что-то вроде приведенного ниже кода.

 TYPES: atinn_tab TYPE STANDARD TABLE OF atinn WITH DEFAULT KEY.

DATA: BEGIN OF line,
        cuobj     TYPE cuobj,
        tab_atinn TYPE atinn_tab,
      END OF line.

DATA:
  cubobj_table   LIKE STANDARD TABLE OF line WITH DEFAULT KEY,
  value_instance TYPE                   cuobj,
  current_atinn  TYPE                   atinn.

...

data(table_ref) = REF atinn_tab( cubobj_table[ cuobj = value_instance ]-tab_atinn ).
IF NOT line_exists( table_ref->*[ current_atinn ] ).
  INSERT current_atinn INTO table_ref->* INDEX 1.
ENDIF.
  

Комментарии:

1. И line_exists должны выполняться со значением поля, потому что [ <val> ] интерпретирует <val> как значение индекса. Так что это должно быть table_ref->*[ table_line = current_atinn ] . Но я предпочитаю символы полей из-за удобочитаемости.

Ответ №2:

Просто для проверки существования вам не нужна вспомогательная переменная

 IF NOT line_exists( cubobj_table[ cuobj = 'VAL' ]-tab_atinn[ '0000000020' ] ).

ENDIF.
  

Но для добавления строки вам нужно

 READ TABLE cubobj_table WITH KEY cuobj = 'VAL' ASSIGNING FIELD-SYMBOL(<fs_cubobj>).
INSERT atinn INTO <fs_cubobj>-tab_atinn INDEX 1.
  

потому что ВСТАВКА не позволяет помещать табличные выражения в itab_position .