У меня есть динамическая таблица, которая создается следующим образом:
DATA: lo_struct TYPE REF TO cl_abap_structdescr,
lo_element TYPE REF TO cl_abap_elemdescr,
lo_new_type TYPE REF TO cl_abap_structdescr,
lo_new_tab TYPE REF TO cl_abap_tabledescr,
lo_data TYPE REF TO data,
lt_comp TYPE cl_abap_structdescr=>component_table,
ls_comp LIKE LINE OF lt_comp.
lo_struct ?= cl_abap_typedescr=>describe_by_name( gv_table_name ).
lt_comp = lo_struct->get_components( ).
* <some additional columns adding here>
lo_new_type = cl_abap_structdescr=>create( lt_comp ).
lo_new_tab = cl_abap_tabledescr=>create(
p_line_type = lo_new_type
p_table_kind = cl_abap_tabledescr=>tablekind_std
p_unique = abap_false ).
CREATE DATA lo_data TYPE HANDLE lo_new_type.
ASSIGN lo_data->* TO <fs_line>.
CREATE DATA lo_data TYPE HANDLE lo_new_tab.
ASSIGN lo_data->* TO <fs_tab>.
Эта таблица с данными затем отображается в ALV, и после того, как пользователь выполняет двойной щелчок по строке, я хочу, чтобы эта строка обрабатывалась позже. И проблема в реализации этого, эта строка кода, конечно, не работает:
READ TABLE <fs_tab> INDEX ps_row_no-row_id ASSIGNING <fs_line>.
Как я могу это решить?
Я пробовал:
READ TABLE <fs_tab> INDEX ps_row_no-row_id ASSIGNING <fs_line>.
Ошибка: 588: для таблиц типа «HASHED TABLE» или «ANY». TABLE», явные и неявные операции с индексами не допускаются. операции. «<FS_TAB>» имеет тип «ЛЮБАЯ ТАБЛИЦА». Возможно, перед "<FS_TAB>" не указано дополнение. "СТОЛ".
Ожидается: данные в <fs_line>.
Если вы сообщите компилятору, что внутренняя таблица может быть хешированной таблицей, то вполне нормально, что компилятор откажет в доступе по индексу. Поскольку вы говорите об ALV, я думаю, что ALV поддерживает только стандартные таблицы. Если вы хотите принять любую таблицу, вам в любом случае следует скопировать ее в стандартную таблицу, чтобы в конечном итоге <FS_TAB> была стандартной, поэтому объявите ее стандартной, а не любой.
О, спасибо большое, теперь все работает. Я правда почему-то не думал, что в моем случае можно указать тип таблицы, отличный от «любого».
Этот вопрос похож на: Динамический запрос из внутренней таблицы. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.
Если вы сообщите компилятору, что внутренняя таблица может быть хешированной таблицей, то вполне нормально, что компилятор откажет в доступе по индексу. Поскольку вы говорите об ALV, я думаю, что ALV поддерживает только стандартные таблицы. Если вы хотите принять какую-либо таблицу, вам все равно следует скопировать ее в стандартную таблицу, чтобы в итоге <FS_TAB>
было стандартным:
FIELD-SYMBOLS <fs_tab> TYPE STANDARD TABLE.
Вообще говоря, чтение по индексу может выполняться в стандартных и отсортированных таблицах, которые называются «индексными таблицами». Если вы хотите принять обе категории, вы также можете использовать:
FIELD-SYMBOLS <fs_tab> TYPE INDEX TABLE.
Использованная литература:
Таблицы могут быть практически любыми, с добавлением технических столбцов. Не указан тип таблицы(или пока не знаю как это сделать)