Справка ALV Grid custom F4 работает, но затем показывает, что помощь не найдена - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть программа, которая отображает редактируемую сетку ALV с пользовательской справкой F4 для поля «Нет».Справка F4 отображается, и выбранное значение возвращается правильно.

enter image description here

Однако каждый раз, когда пользовательская справка F4 закрывается, открывается другое окно со словами «Нетдоступна справка по вводу ".

enter image description here

Как избавиться от этого дополнительного всплывающего окна?

Спасибо.

Вот мой код:

CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    METHODS constructor.
    METHODS display.
    METHODS on_onf4
                  FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname es_row_no e_fieldvalue.
    DATA: grid   TYPE REF TO cl_gui_alv_grid,
          spflis TYPE TABLE OF spfli.
ENDCLASS.

CLASS lcl_app IMPLEMENTATION.

  METHOD constructor.
    SELECT * FROM spfli INTO TABLE spflis.
    grid = NEW cl_gui_alv_grid(
        i_parent = cl_gui_container=>screen0 ).
    SET HANDLER on_onf4 FOR grid.
    grid->register_f4_for_fields(
        it_f4 = VALUE #( ( fieldname = 'CONNID' register = 'X' chngeafter = 'X' ) ) ).
  ENDMETHOD.

  METHOD display.
    DATA(fcat) = VALUE lvc_t_fcat(
        ( fieldname = 'CARRID' ref_table = 'SPFLI' )
        ( fieldname = 'CONNID' ref_table = 'SPFLI' f4availabl = 'X' ) ).
    grid->set_table_for_first_display(
        EXPORTING is_layout = VALUE #( edit = 'X' )
        CHANGING it_outtab = spflis
                 it_fieldcatalog = fcat
        EXCEPTIONS OTHERS = 4 ).
  ENDMETHOD.

  METHOD on_onf4.
    DATA return TYPE TABLE OF ddshretval.
    IF e_fieldname = 'CONNID'.
      SELECT DISTINCT connid FROM spfli INTO TABLE @DATA(connids).
      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
        EXPORTING
          retfield        = 'CONNID'
          value_org       = 'S'
        TABLES
          value_tab       = connids
          return_tab      = return
        EXCEPTIONS
          parameter_error = 1
          no_values_found = 2
          OTHERS          = 3.
      IF sy-subrc = 0 AND return IS NOT INITIAL.
        FIELD-SYMBOLS <modis> TYPE lvc_t_modi.
        ASSIGN er_event_data->m_data->* TO <modis>.
        <modis> = VALUE #( BASE <modis> ( row_id = es_row_no-row_id
            fieldname = e_fieldname 
            value = return[ 1 ]-fieldval ) ).
      ENDIF.
    ENDIF.
  ENDMETHOD.

ENDCLASS.

PARAMETERS dummy.

AT SELECTION-SCREEN OUTPUT.
  NEW lcl_app( )->display( ).

1 Ответ

0 голосов
/ 27 февраля 2019

Есть флаг er_event_data->m_event_handled, который должен быть установлен на 'X' в обработчике метода F4, чтобы сказать, что F4 фактически управлялся пользовательской обработкой, в противном случае сетка ALV пытается отобразить стандарт F4 (не было никакого стандартаF4 в моем случае, следовательно, всплывающее окно).

Сначала добавьте параметр ER_EVENT_DATA в объявлении метода:

    METHODS on_onf4
                  FOR EVENT onf4 OF cl_gui_alv_grid
      IMPORTING e_fieldname es_row_no e_fieldvalue
                  er_event_data.

Внутри метода ON_ONF4 установите флаг:

er_event_data->m_event_handled = 'X'.
...