Типовое решение для помощи поиска F4 в OO ALV grid - PullRequest
0 голосов
/ 03 мая 2018

У меня есть простой в использовании функциональный модуль для создания сетки 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.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Что касается предоставленного вами примера кода, поля ref указаны неверно и поэтому не работают. Таким образом, это работает как шарм:

APPEND VALUE #( fieldname = 'DATE' f4availabl = abap_true ref_table = 'BKPF' ref_field = 'BUDAT' ) TO it_fc.
APPEND VALUE #( fieldname = 'TIME' f4availabl = abap_true ref_table = 'BKPF' ref_field = 'CPUTM' ) TO it_fc.
APPEND VALUE #( fieldname = 'WERKS' f4availabl = abap_true ref_table = 'BSEG' ref_field = 'WERKS') TO it_fc.

Что касается полей не-DDIC, когда вы объявляете поле не-DDIC на основе произвольного элемента данных, отличного от DDIC, и / или на произвольном домене, ALV просто не может определить, какую входную справку следует вызвать. См. Справку по вводу иерархия вызовов .

Поскольку я не вижу ваш FM-код, я не могу сказать что-то более определенное. В противном случае дайте нам более наглядный пример использования.

0 голосов
/ 03 мая 2018

Я нашел решение, хотя оно несколько уродливое. Лучшее решение все еще приветствуется.

CLASS lcl_alv_util DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    INTERFACES if_alv_rm_grid_friend.
    CLASS-METHODS enable_f4_in_fcat
      IMPORTING r_alv TYPE REF TO cl_gui_alv_grid.
ENDCLASS.
CLASS lcl_alv_util IMPLEMENTATION.
  METHOD enable_f4_in_fcat.
    DATA wa_fc TYPE lvc_s_fcat.
    MODIFY r_alv->m_cl_variant->mt_fieldcatalog FROM wa_fc TRANSPORTING ref_field
      WHERE tabname IS INITIAL AND ref_field IS NOT INITIAL AND ref_table IS NOT INITIAL.
  ENDMETHOD.
ENDCLASS.

Метод lcl_alv_util=>enable_f4_in_fcat должен вызываться после set_table_for_first_display и до , Dynpro вызывается с помощью CALL SCREEN. Кроме того, необходимо убедиться, что поле TABNAME заполнено для всех членов структур DDIC, поскольку оно используется для различения полей структуры на основе DDIC и не на основе DDIC.

В качестве альтернативы вы можете вызвать enable_f4_in_fcat, только если у вас есть локальный тип линии. Но это не будет охватывать случай, когда некоторые из столбцов являются частью структуры DDIC, где стандартная реализация фактически работает, то есть когда локальный тип ссылается на структуру DDIC с помощью INCLUDE TYPE или вложенным.

На самом деле я просто очищаю REF_FIELD, если TABNAME не предоставлено. Поскольку REF_FIELD читается только при фактическом нажатии клавиши F4, этого достаточно после set_table_for_first_display. Но у хака с if_alv_rm_grid_friend для доступа к приватному полю m_cl_variant плохое послевкусие.

...