У меня есть простой в использовании функциональный модуль для создания сетки ALV практически для любого типа таблицы, особенно без типа DDIC. Редактирование также поддерживается.
По сути, он создает каталог полей по RTTI и создает экземпляр стандартного класса CL_GUI_ALV_GRID в фиксированном внутреннем Dynpro.
Проблема: Справка по поиску F4 не работает, если столбец не является частью структуры DDIC или прозрачной таблицы. Причина в том, что стандартный ALV перезаписывает поле REF_FIELD
в каталоге полей, если оно пустое.
* Excerpt from LVC_FCAT_COMPLETE_NEW in LSLVCF02
if not <ls_fcat>-ref_table is initial
and <ls_fcat>-ref_field is initial
and r_fcat_complete eq abap_false.
<ls_fcat>-ref_field = <ls_fcat>-fieldname.
endif.
Но для получения справки по поиску для элемента данных с использованием функционального модуля DD_SHLP_GET_HELPMETHOD
(используется внутри CL_GUI_ALV_GRID
в методе F4
) TABNAME
должен содержать имя элемента данных и FIELDNAME
должен быть начальным .
Если я очищаю REF_FIELD
в отладчике после того, как он был назначен, все работает как ожидалось.
Я знаю, что в документации к полевому каталогу есть возможность пропустить имя REF_FIELD
, если оно идентично FIELDNAME
. Но автоматизм не имеет смысла для не структур DDIC.
Есть идеи как избавиться от этого поведения без изменений?
Желательно без написания собственной подпрограммы вызова F4 для каждого типа справки по поиску в (недокументированном) обработчике ONF4
.
К сожалению, практически невозможно обеспечить работающий тестовый пример из-за необходимых вещей Dynpro. Но я могу предоставить часть ABAP. Предполагается существование Dynpro 500 с контейнерным элементом управления с именем CC_ALV
.
" test table
TYPES: BEGIN OF t_test,
date TYPE dats,
time TYPE time,
werks TYPE werks_d,
END OF t_test.
DATA it_data TYPE STANDARD TABLE OF t_test.
APPEND VALUE #( date = '20180102' time = '123059' werks = '2020' ) TO it_data.
" field catalog
DATA it_fc TYPE lvc_t_fcat.
APPEND VALUE #( fieldname = 'DATE' f4availabl = abap_true ref_table = 'DATS' ) TO it_fc.
APPEND VALUE #( fieldname = 'TIME' f4availabl = abap_true ref_table = 'TIMS' ) TO it_fc.
APPEND VALUE #( fieldname = 'WERKS' f4availabl = abap_true ref_table = 'WERKS_D' ) TO it_fc.
" show ALV
DATA: r_alv TYPE REF TO cl_gui_alv_grid.
CREATE OBJECT r_parent
EXPORTING
container_name = 'CC_ALV'.
CREATE OBJECT r_alv
EXPORTING
i_parent = r_parent.
r_alv->set_table_for_first_display(
EXPORTING is_layout = VALUE #( edit = abap_true )
CHANGING it_fieldcatalog = it_fc
it_outtab = it_data ).
CALL SCREEN 500.