В настоящее время SALV объекты не предоставляют стандартных средств для подключения возможности редактирования. Но в некоторых случаях можно исхитриться и получить желаемый результат. Рассмотрим небольшой пример. Необходимо предоставить пользователю возможность обработки записей в таблице. Пользователь выделяет нужные записи в таблице и нажимает кнопку обработки, которую мы заранее добавили в GUI статус. Таким образом он совершает два действия: выделение и нажатие на кнопку обработки. А что если попробовать сократить его действия до одной операции? В этом случае мы можем использовать checkbox поля.
За обработку событий в таблицах отвечает класс CL_SALV_EVENTS_TABLE. Так как наше поле будет являться HOTSPOT элементом, мы можем поймать событие LINK_CLICK и использовать его чтобы назначить значение полю. Чтобы поле было доступно для редактирования необходимо задать тип для столбца — CHECKBOX_HOTSPOT. После изменения значения поля необходимо обновить ALV объект, если при этом будут использоваться сортировки, то обновление надо делать полным. Пример:
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 |
REPORT ZALV_CHECK_COLUMN. TYPES BEGIN OF ty_spfli. TYPES CHECK TYPE char1. INCLUDE TYPE spfli. TYPES END OF ty_spfli. FIELD-SYMBOLS: <fs_record> TYPE ty_spfli. DATA: gt_data TYPE STANDARD TABLE OF ty_spfli, " Таблица с данными go_columns TYPE REF TO cl_salv_columns_table, go_column TYPE REF TO cl_salv_column_table, go_events TYPE REF TO cl_salv_events_table, go_alv TYPE REF TO cl_salv_table. CLASS lcl_handler DEFINITION. PUBLIC SECTION. CLASS-METHODS: on_link_click FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE IMPORTING row. ENDCLASS. CLASS lcl_handler IMPLEMENTATION. METHOD on_link_click. READ TABLE gt_data ASSIGNING <fs_record> INDEX row. CHECK <fs_record> IS ASSIGNED. CASE <fs_record>-CHECK. WHEN abap_false. <fs_record>-CHECK = abap_true. WHEN abap_true. <fs_record>-CHECK = abap_false. ENDCASE. go_alv->refresh( refresh_mode = IF_SALV_C_REFRESH=>FULL ). ENDMETHOD. ENDCLASS. START-OF-SELECTION. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_data. " Фабричный метод возвращяет экзмепляр ALV объекта 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_alv->set_screen_status( EXPORTING REPORT = 'SAPLSALV_METADATA_STATUS' pfstatus = 'SALV_TABLE_STANDARD' set_functions = CL_SALV_MODEL_BASE=>C_FUNCTIONS_ALL ). go_events = go_alv->get_event( ). SET HANDLER lcl_handler=>on_link_click FOR go_events. " Получаем ссылку на объект настройки колонок go_columns = go_alv->get_columns( ). TRY . go_column ?= go_columns->get_column( 'CHECK' ). go_column->set_cell_type( IF_SALV_C_CELL_TYPE=>CHECKBOX_HOTSPOT ). go_column->set_key( ). CATCH cx_salv_not_found. ENDTRY. " Отобразить ALV представление go_alv->display( ). |
Cаповский пример где рассматривается обработка событий в ALV таблице — SALV_DEMO_TABLE_EVENTS
Результат работы данного кода таков — чекбоксами являются не квадратики с галочками, а полностью сами ячейки. То есть, щёлкая в любое место любой ячейки из первой колонки (не на сам чекбокс), чекбокс активируется. Вопрос, есть ли смысл страдать и делать чекбокс внутри ячейки, то есть, чтобы активация чекбокса была только по нажатии на него?
И как лучше работать с данными, у которых активированы чекбоксы в этой программе? Например, мне нужно выделенные записи отобразить где-нибудь в другом месте (на другом месте экрана, другом экране и т.п.)
Страдать конечно же не стоит 😉 Данный пример сделан лишь для демонстрации событийной модели SALV. На счёт как лучше работать с данными, не совсем понятен вопрос, работайте как вам вздумается и как это позволяет диалоговое программирования в бэкенде SAP’a. Получить выделенные записи труда я думаю не составит?