Как активировать код, когда пользователь щелкает поле активной области ALV?

Я борюсь со следующей проблемой:

У меня есть две таблицы (заголовок и элементы), которые я хочу соединить с помощью точки доступа и класса CL_SALV_TABLE. Мне удалось отобразить шапку таблицы и установить хот-спот на столбец с номером заказа. Я хочу, чтобы вторая таблица открывалась как всплывающее окно после того, как я один раз нажму на числовое поле (которое было моей точкой доступа). Однако я не знаю, как определить событие. Я знаю, как получить всплывающее окно, используя метод отображения CL_SALV_TABLE, например, этот код:

CALL METHOD cl_salv_table=>factory(
*  EXPORTING
*    list_display   = IF_SALV_C_BOOL_SAP=>FALSE
*    r_container    =
*    container_name =
  IMPORTING
    r_salv_table   = o_alv
  CHANGING
    t_table        = it_tab )
    .
 CATCH cx_salv_msg .
ENDTRY.


o_alv->set_screen_popup( start_column = 1
                         end_column   = 150
                         start_line   = 1
                         end_line     = 30 ).

o_alv->display( ).

Любой комментарий или помощь высоко ценятся. Заранее спасибо!


person user_unknown007    schedule 20.07.2021    source источник
comment
Ваш заголовок сбивает с толку: я думаю, что ваш вопрос о том, как реагировать на щелчок по полю активной области, а не о том, как отображать ALV во всплывающем окне... Пожалуйста, уточните.   -  person Sandra Rossi    schedule 20.07.2021
comment
Да, мой вопрос в том, как реагировать на щелчок по полю хотспота. В частности, как открыть вторую таблицу при нажатии на поле активной области. Извините за запутанный заголовок, я его отредактирую.   -  person user_unknown007    schedule 20.07.2021


Ответы (1)


Вот минимальный пример выполнения кода при щелчке поля активной области ALV (при щелчке любой ячейки в столбце Номер книги отображается всплывающее окно с текстом, но вы, конечно, можете делать все, что хотите).

Что важно помнить:

  • METHODS on_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid ... : это метод определения кода, который будет запускаться при нажатии на поле активной области.
  • SET HANDLER on_hotspot_click ... : сообщить Control Framework, чтобы он запускал метод при возникновении события.

Код:

CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    METHODS constructor.
    METHODS on_hotspot_click
      FOR EVENT hotspot_click OF cl_gui_alv_grid
      IMPORTING e_row_id e_column_id es_row_no.
    DATA go_alv TYPE REF TO cl_gui_alv_grid.
    DATA gt_sbook TYPE TABLE OF sbook.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
  METHOD constructor.
    CREATE OBJECT go_alv EXPORTING i_parent = cl_gui_container=>screen0.
    SELECT * FROM sbook INTO TABLE gt_sbook.
    DATA(fieldcatalog) = VALUE lvc_t_fcat(
    ( fieldname = 'BOOKID' ref_table = 'SBOOK' ref_field = 'BOOKID' hotspot = 'X' ) ).
    SET HANDLER on_hotspot_click FOR go_alv.
    go_alv->set_table_for_first_display(
        EXPORTING i_structure_name = 'SBOOK'
        CHANGING it_outtab = gt_sbook it_fieldcatalog = fieldcatalog ).
  ENDMETHOD.
  METHOD on_hotspot_click.
    READ TABLE gt_sbook INDEX es_row_no-row_id INTO DATA(ls_sbook).
    IF sy-subrc = 0.
      MESSAGE |click { ls_sbook-bookid } col { e_column_id-fieldname } row { es_row_no-row_id }| TYPE 'I'.
    ENDIF.
  ENDMETHOD.
ENDCLASS.
DATA go_app TYPE REF TO lcl_app.
PARAMETERS dummy.
AT SELECTION-SCREEN OUTPUT.
  IF go_app IS NOT BOUND.
    go_app = NEW lcl_app( ).
  ENDIF.
person Sandra Rossi    schedule 20.07.2021
comment
Отлично, мне помогло, спасибо! - person user_unknown007; 30.07.2021