Добавить строку в динамическую внутреннюю таблицу

Я хочу добавить строку динамической таблицы к динамической внутренней таблице.

DATA: lo_structdescr    TYPE REF TO cl_abap_structdescr,
      lo_tabledescr     TYPE REF TO cl_abap_tabledescr,
      lt_components     TYPE abap_component_tab,
      ls_component      TYPE LINE OF abap_component_tab,
      lt_keys           TYPE abap_keydescr_tab,
      lt_table          TYPE REF TO data,
      ls_table          TYPE REF TO data.

FIELD-SYMBOLS: <ls_table>  TYPE any,
               <lt_table>  TYPE ANY TABLE,
               <lv_value> TYPE any.


MOVE 'COMP1' TO ls_component-name.
ls_component-type ?= cl_abap_elemdescr=>get_string( ).
INSERT ls_component INTO TABLE lt_components.

MOVE 'COMP2' TO ls_component-name.
ls_component-type ?= cl_abap_elemdescr=>get_i( ).
INSERT ls_component INTO TABLE lt_components.

lo_structdescr ?= cl_abap_structdescr=>create( lt_components ).

CREATE DATA ls_table TYPE HANDLE lo_structdescr.
ASSIGN ls_table->* TO <ls_table>.

lo_tabledescr ?= cl_abap_tabledescr=>create( p_line_type  = lo_structdescr
                                             p_table_kind = cl_abap_tabledescr=>tablekind_hashed
                                             p_unique     = abap_true
                                             p_key        = lt_keys
                                             p_key_kind   = cl_abap_tabledescr=>keydefkind_default ).

CREATE DATA lt_table TYPE HANDLE lo_tabledescr.
ASSIGN lt_table->* TO <lt_table>.


ASSIGN COMPONENT 'COMP1' OF STRUCTURE <ls_table> TO <lv_value>.
<lv_value> = 'test'.

APPEND <ls_table> TO <lt_table>.

Последняя строка - проблема. Я получаю эту синтаксическую ошибку:

Вы не можете использовать явные или неявные операции с индексами для таблиц с типами «HASHED TABLE» или «ANY TABLE». «‹LT_TABLE>» имеет тип «ANY TABLE». Возможно, что добавление «ТАБЛИЦА» не было указано перед «‹LT_TABLE>».

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


person Niklas    schedule 23.10.2013    source источник


Ответы (2)


Используйте операцию INSERT:

INSERT <ls_table> INTO TABLE <lt_table>.

Надеюсь, ты знаешь, что делаешь. Я сомневаюсь, что при такой общей обработке данных кто-нибудь сможет понять, какую проблему вы вообще пытаетесь решить.

person vwegert    schedule 23.10.2013
comment
Они попросили меня сделать это супер динамично. Так что они это поймут. Спасибо еще раз. - person Niklas; 23.10.2013

Использование INSERT <ls_table> INTO TABLE <lt_table>. является правильным, но причина синтаксических ошибок заключается в том, что вы определили свой символ поля как:

      <lt_table>  TYPE ANY TABLE, 

поскольку ваша программа жестко запрограммирована для использования хешированной таблицы, вам лучше определить символы поля как

      <lt_table>  TYPE HASHED TABLE,

Таким образом, средство проверки синтаксиса может лучше проверить синтаксис, поскольку оно знает базовый тип таблицы.

Синтаксическая ошибка говорит вам о том, что использование append будет работать только с таблицами, доступными через индекс (стандартный и отсортированный), и поскольку ANY TABLE может быть хеш-таблицей (доступной только по ключу), вы не можете добавить к ней.

person DW8Reaper    schedule 23.10.2013