Объектная модель SALV не позволяет редактировать данные (нормальным способом), однако Вы можете обрабатывать множество других событий: нажатие на кнопки, hotspot элементы, ссылки, checkbox’ы, добавлять свои собственные функции, обрабатывать щелчки (двойные щелчки), нажатие специальных клавиш (F1,F2).
Обработка событий полностью основана на событийной модели ABAP Objects. В первую очередь необходимо получить ссылку на класс вызывающий событие (с помощью метода get_events — sALV объекта), затем зарегистрировать обработчик. Классы вызывающие события:
- CL_SALV_EVENTS — общие события для всех sALV объектов
- CL_SALV_EVENTS_HIERSEQ — для иерархического списка
- CL_SALV_EVENTS_LIST — для ALV в виде списка
- CL_SALV_EVENTS_TABLE — для ALV таблицы
- CL_SALV_EVENTS_TREE — для древовидного ALV
В качестве примера рассмотрим обработку стандартных для всех sALV объектов событий:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
REPORT ZALV_EVENTS NO STANDARD PAGE HEADING. CLASS lcl_report DEFINITION. PUBLIC SECTION. METHODS: get_data, " Получение данных show_alv, " Показать ALV " Обработчик вызывается до нажатия стандартных функций 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_added_salv_function FOR EVENT ADDED_FUNCTION OF cl_salv_events IMPORTING E_SALV_FUNCTION. PRIVATE SECTION. DATA: gt_data TYPE spfli_tab, " Таблица с данными go_alv TYPE REF TO cl_salv_table, go_functions TYPE REF TO cl_salv_functions, gv_string TYPE STRING, go_events TYPE REF TO cl_salv_events. ENDCLASS. CLASS lcl_report IMPLEMENTATION. METHOD get_data. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_data. ENDMETHOD. METHOD show_alv. CHECK go_alv IS NOT BOUND. TRY. cl_salv_table=>factory( IMPORTING r_salv_table = go_alv CHANGING t_table = gt_data ). CATCH cx_salv_msg . MESSAGE 'Ошибка при создании ALV' TYPE 'E'. ENDTRY. " Вешаем обработку событий для объекта go_events: go_events = go_alv->get_event( ). SET HANDLER on_before_salv_function FOR go_events. SET HANDLER on_added_salv_function FOR go_events. SET HANDLER on_after_salv_function FOR go_events. " Настройка функций go_functions = go_alv->get_functions( ). go_functions->set_all( abap_true ). go_alv->display( ). ENDMETHOD. METHOD on_before_salv_function. CONCATENATE 'BEFORE ALV FUNCTION:' E_SALV_FUNCTION INTO gv_string. MESSAGE gv_string TYPE 'I'. ENDMETHOD. METHOD on_after_salv_function. CONCATENATE 'AFTER ALV FUNCTION:' E_SALV_FUNCTION INTO gv_string. MESSAGE gv_string TYPE 'I'. ENDMETHOD. METHOD on_added_salv_function. CONCATENATE 'CUSTOM ALV FUNCTION:' E_SALV_FUNCTION INTO gv_string. MESSAGE gv_string TYPE 'I'. ENDMETHOD. ENDCLASS. DATA: lo_report TYPE REF TO lcl_report. START-OF-SELECTION. CREATE OBJECT lo_report. lo_report->get_data( ). lo_report->show_alv( ). |
Таким же образом, Вы можете назначить свои обработчики для событий sALV объектов. Описание основных событий:
- TOP_OF_PAGE — позволяет создать свой заголовок для sALV объекьа
- END_OF_PAGE — позволяет создать подвал
- BEFORE_SALV_FUNCTION — вызывает обработчик до непосредственно обработки стандартной функции
- AFTER_SALV_FUNCTION — вызывается после обработки стандартной функции
- ADDED_FUNCTION — обработка собственных функций
- DOUBLE_CLICK — двойной щелчок по sALV объекту
- LINK_CLICK — щелчок по hotspot элементы (кнопке, ссылке, checkbox’у, hotspot ячейке)
- KEYPRESS (для дерева) — обработка специальных клавиш (F1,F2)
- CHECKBOX_CHANGE (для дерева) — обработка изменения состояния checkbox элемента
Подскажите пожалуйста а как можно отследить событие нажатие на кнопку в ячейке грида?
Событие LINK_CLICK
Проблема в том что
если объявлять кнопку так
* TRY.
* go_column ?= go_columns->get_column( ‘PTPZ’ ).
* go_column->set_cell_type( if_salv_c_cell_type=>BUTTON ).
* go_column->set_icon( if_salv_c_bool_sap=>true ).
* go_column->set_long_text( ‘BUTTON’ ).
* CATCH cx_salv_not_found. «#EC NO_HANDLER
* ENDTRY.
то вылетает дамп при полноэкранном режиме,
а если так
LOOP AT gt_data ASSIGNING .
gs_type-columnname = ‘PTPZ’.
gs_type-value = if_salv_c_cell_type=>BUTTON .
APPEND gs_type TO -t_cell_type.
ENDLOOP.
то событие не отлавливается
Вы правы для полноэкранного режима можно определить тип ячейки — «кнопка», но нельзя обработать событие.
Если так нужны кнопки, можно использовать Double_click
А как Double_click спасет?
Он будет отлавливаться