#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 .