27 апреля 2011 г.

ABAP: добавление своей кнопки в TOOLBAR ALV GRID

Для этого надо создать класс обработчик для обработки событий toolbar и user_command для ALV GRID.

Пример:

CLASS cl_trans_g_event_receiver DEFINITION.
  PUBLIC SECTION.
  METHODS:
    handle_toolbar
      FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object e_interactive,
    handle_user_command
      FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm.
ENDCLASS.

CLASS cl_trans_g_event_receiver IMPLEMENTATION.
  METHOD handle_toolbar.
    PERFORM method_trans_toolbar USING e_object.
  ENDMETHOD.

  METHOD handle_user_command.
    PERFORM method_trans_user_command USING e_ucomm.
  ENDMETHOD.
ENDCLASS.

* Добавление кнопки в тулбар
FORM METHOD_TRANS_TOOLBAR USING P_E_OBJECT TYPE REF TO CL_ALV_EVENT_TOOLBAR_SET.
  DATA: ty_toolbar TYPE stb_button.

* разделитель
  CLEAR ty_toolbar.
  ty_toolbar-butn_type = 3.
  APPEND ty_toolbar TO p_e_object->mt_toolbar.

* кнопка
  CLEAR ty_toolbar.
  ty_toolbar-function = 'MYBUTT'.
  ty_toolbar-icon = ICON_HISTORY.
  ty_toolbar-butn_type = 0.
  ty_toolbar-text = 'Моя кнопка'.

  APPEND ty_toolbar TO p_e_object->mt_toolbar.
ENDFORM.

* Обработка команд
FORM METHOD_TRANS_USER_COMMAND USING P_E_UCOMM TYPE SY-UCOMM.
  CASE p_e_ucomm.
    WHEN 'MYBUTT'.
*     ЧТО-ТО ДЕЛАЕМ
  ENDCASE.
ENDFORM.

Ну и надо незабыть инициализировать все это после создания грида:

  DATA: trans_g_event_receiver TYPE REF TO cl_trans_g_event_receiver.

  CREATE OBJECT trans_g_event_receiver.

  SET HANDLER trans_g_event_receiver->handle_toolbar FOR trans_grid.
  SET HANDLER trans_g_event_receiver->handle_user_command FOR trans_grid.

5 комментариев:

  1. а я повадился общую подпрограмму с case-ом писать:
    FORM ON_USER_COMMAND USING comm type SYUCOMM scr TYPE i.

    и вызывать его и из ПБО и из alv-кнопок и из прочих обработчиков событий у которых другие параметры не нужны.

    ОтветитьУдалить
  2. что такое trans_grid ?

    ОтветитьУдалить
  3. alv grid, в который добавляем кнопки в тулбар. тип его cl_gui_alv_grid.

    ОтветитьУдалить
  4. Если уж переименовываете исходный класс lcl_event_handler, то хоть ссылку на оригинал BCALV_GRID_05 оставляли бы:)

    ОтветитьУдалить
  5. Во-первых, а с чего это Вы взяли, что именно он оригинал? Как бы далеко не всегда заготовка берётся из стандартных примеров. Иногда можно подсмотреть в каком-то другом месте или вообще можно посмотреть события алв-грида и написать руками, не подсматривая.
    Во-вторых, как бы такое наименование вполне подойдёт для програмки-примера: в таблицу "table" добавить кнопку "button" с помощью хэндлера событий "event_handler". Но в реальных задачах обычно дают осмысленные названия классам и переменным (хотя бы глобальным).

    ОтветитьУдалить