1. Делать модули PAI и PBO для этого класса будет лишним, это вы уже про глобальный класс построения ALV полезли читать, там где сетка размещается в специальном элементе экрана, контейнере, но в данном случае это не ваш метод.
2. Ниже идет пример как вывести поле с чек-боксом и обрабатывать его изменение путем двойного клика мышью в ячейке, а так же пример как добавить свои кнопки на панель инструментов и как их обрабатывать. Тонкость оказалась в том, что если мы используем стандартный класс работы с кнопками ALV-таблицы, то в данном случае метод CALL METHOD gc_functions->add_function не реализован т.е. добавить свою кнопку нельзя, поэтому надо использовать полностью свой статус. Шаблон статуса можно скопировать в свою программу из программы SAPLSALV_METADATA_STATUS, примеры на рисунках ниже. А далее уже в своей программе добавить в него свои кнопки, убрал лишнюю функциональность, так как тулбар к сожалению имеет ограниченную длину.
Ну и сам код программы:
*&---------------------------------------------------------------------*
*& Report YTSH_TEMP_GRID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ytsh_temp_grid.
* Объявляем внутреннюю таблицу, со своими полями + поля из таблицы MKPF
DATA: BEGIN OF gt_mkpf OCCURS 10,
check_box(1) TYPE c.
INCLUDE STRUCTURE mkpf.
DATA: my_field(5) TYPE c,
my_data TYPE matnr,
END OF gt_mkpf.
DATA: gs_mkpf LIKE gt_mkpf.
* Объявляем объект типа cl_salv_table, который выведет наши данные в виде ALV
DATA: gc_alv_table TYPE REF TO cl_salv_table,
gc_columns TYPE REF TO cl_salv_columns_table,
gc_colwork TYPE REF TO cl_salv_column_table,
gc_sorts TYPE REF TO cl_salv_sorts,
"gc_functions TYPE REF TO cl_salv_functions, - Не испльзуется так как объявлен свой статус экрана
gc_selections TYPE REF TO cl_salv_selections,
gc_display TYPE REF TO cl_salv_display_settings,
gc_layout TYPE REF TO cl_salv_layout,
gc_aggr TYPE REF TO cl_salv_aggregations,
gc_events TYPE REF TO cl_salv_events_table.
DATA: keys TYPE salv_s_layout_key,
g_report TYPE syrepid,
g_pfstatus TYPE sypfkey.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS:
on_user_command FOR EVENT added_function OF cl_salv_events
IMPORTING e_salv_function,
on_before_salv_function FOR EVENT before_salv_function OF cl_salv_events
IMPORTING e_salv_function,
on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events
IMPORTING e_salv_function,
on_double_click FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column,
on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS. "lcl_handle_events DEFINITION
DATA: gr_events TYPE REF TO lcl_handle_events.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
START-OF-SELECTION.
* Выбираем данные из MKPF
SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mkpf FROM mkpf.
LOOP AT gt_mkpf.
* Все CHECK_BOX = "Х" для примера, перед первым показом данных
gt_mkpf-check_box = 'X'.
* Какое-то свое поле, занесем тоже значение перед выводом на экран
gt_mkpf-my_data = gt_mkpf-vgart.
MODIFY gt_mkpf.
ENDLOOP.
* Статический метод класса для создания объекта и связывания с нашей таблицей
cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
CHANGING t_table = gt_mkpf[] ).
* Получим каталог полей
gc_columns = gc_alv_table->get_columns( ).
* Получим поле по имени
gc_colwork ?= gc_columns->get_column( 'CHECK_BOX' ).
* Зададим заголовок колонки обработанных документов
gc_colwork->set_long_text( 'Обработанные строки в таблице' ).
gc_colwork->set_medium_text( 'ОбрабСтроки' ).
gc_colwork->set_short_text( 'ОбрСтр' ).
* Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
gc_colwork->set_alignment( '3' ).
gc_colwork->set_cell_type( if_salv_c_cell_type=>checkbox ).
* События в таблице для пользовательской обработки
gc_events = gc_alv_table->get_event( ).
CREATE OBJECT gr_events.
*... §6.1 register to the event USER_COMMAND
SET HANDLER gr_events->on_user_command FOR gc_events.
*... §6.2 register to the event BEFORE_SALV_FUNCTION
SET HANDLER gr_events->on_before_salv_function FOR gc_events.
*... §6.3 register to the event AFTER_SALV_FUNCTION
SET HANDLER gr_events->on_after_salv_function FOR gc_events.
*... §6.4 register to the event DOUBLE_CLICK
SET HANDLER gr_events->on_double_click FOR gc_events.
*... §6.5 register to the event LINK_CLICK
SET HANDLER gr_events->on_link_click FOR gc_events.
* Получим поле по имени
gc_colwork ?= gc_columns->get_column( 'MY_DATA' ).
* Задать выравнивание по левому краю для вывода поля, тип словаря SALV_DO_ALIGNMENT
gc_colwork->set_alignment( '1' ).
* Получить список полей для сортировки
gc_sorts = gc_alv_table->get_sorts( ).
gc_sorts->add_sort( columnname = 'MBLNR' sequence = '2' ).
gc_sorts->add_sort( columnname = 'MJAHR' sequence = '2' subtotal = 'X' ).
* Получим список функциональных клавиш и активируем их все, но так как нам нужные допонительные
* кнопки на экране, а метод CALL METHOD gc_functions->add_function не поддреживается, то создаем
* свой статус экрана содержащий стандартные кнопки + наши дополнительные кнопки.
"gc_functions = gc_alv_table->get_functions( ).
"gc_functions->set_all( 'X' ).
* Испльзуем свой PF-статус так как к стандартному кнопики не добавлются
gc_alv_table->set_screen_status( report = sy-cprog pfstatus = 'PF_TABLE_STANDARD'
set_functions = cl_salv_model_base=>c_functions_all ).
* Класс для работы с выделеными строками таблицы
gc_selections = gc_alv_table->get_selections( ).
gc_selections->set_selection_mode( if_salv_c_selection_mode=>row_column ).
* Изменим заголовок таблицы
gc_display = gc_alv_table->get_display_settings( ).
gc_display->set_list_header( 'Заголовок таблицы' ).
* Добавим ведение вариантов отражения таблицы
gc_layout = gc_alv_table->get_layout( ).
keys-report = sy-repid.
gc_layout->set_key( keys ).
gc_layout->set_save_restriction( '3' ).
* Выполнить агрегирование по колонке незапланированных затрат
gc_aggr = gc_alv_table->get_aggregations( ).
gc_aggr->add_aggregation( 'FRATH' ).
* Вывести ALV-таблицу на экран
gc_alv_table->display( ).
*---------------------------------------------------------------------*
* CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
* §5.2 implement the events for handling the events of cl_salv_table
*---------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_user_command.
DATA: l_index LIKE sy-tabix,
lt_rows TYPE salv_t_row.
CASE e_salv_function.
WHEN 'BTN_1'.
* Нажата первая кнопка
* Получить выделенные строки
gc_selections->get_selected_rows( RECEIVING value = lt_rows ).
LOOP AT lt_rows INTO l_index.
* Прочитать данные таблицы для выделенной строки
READ TABLE gt_mkpf INTO gs_mkpf INDEX l_index.
* какя-нить обработка
ENDLOOP.
WHEN 'BTN_2'.
* Нажата вторая кнопка
ENDCASE.
ENDMETHOD. "on_user_command
METHOD on_before_salv_function.
ENDMETHOD. "on_before_salv_function
METHOD on_after_salv_function.
ENDMETHOD. "on_after_salv_function
METHOD on_double_click.
DATA: ls_stable TYPE lvc_s_stbl.
IF row <> 0.
IF column = 'CHECK_BOX'.
READ TABLE gt_mkpf INTO gs_mkpf INDEX row.
IF gs_mkpf-check_box = 'X'. gs_mkpf-check_box = space. ELSE. gs_mkpf-check_box = 'X'. ENDIF.
MODIFY gt_mkpf FROM gs_mkpf INDEX row.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
gc_alv_table->refresh( ls_stable ). "Нужно для обработки изменения в экране.
ENDIF.
ENDIF.
ENDMETHOD. "on_double_click
METHOD on_link_click.
ENDMETHOD. "on_single_click
ENDCLASS. "lcl_handle_events IMPLEMENTATION
PS: Вызов событий взят из примера предоставленного insaf121.