Checkbox в ALV

В настоящее время SALV объекты не предоставляют стандартных средств для подключения возможности редактирования. Но в некоторых случаях можно исхитриться и получить желаемый результат. Рассмотрим небольшой пример. Необходимо предоставить пользователю возможность обработки записей в таблице. Пользователь выделяет нужные записи в таблице и нажимает кнопку обработки, которую мы заранее добавили в GUI статус. Таким образом он совершает два действия: выделение и нажатие на кнопку обработки. А что если попробовать сократить его действия до одной операции? В этом случае мы можем использовать checkbox поля.

За обработку событий в таблицах отвечает класс CL_SALV_EVENTS_TABLE. Так как наше поле будет являться HOTSPOT элементом, мы можем поймать событие LINK_CLICK и использовать его чтобы назначить значение полю. Чтобы поле было доступно для редактирования необходимо задать тип для столбца - CHECKBOX_HOTSPOT. После изменения значения поля необходимо обновить ALV объект, если при этом будут использоваться сортировки, то обновление надо делать полным. Пример:

  1. REPORT ZALV_CHECK_COLUMN.
  2.  
  3. TYPES BEGIN OF ty_spfli.
  4. TYPES CHECK TYPE char1.
  5. INCLUDE TYPE spfli.
  6. TYPES END OF ty_spfli.
  7.  
  8. FIELD-SYMBOLS: <fs_record> TYPE ty_spfli.
  9.  
  10. gt_data TYPE STANDARD TABLE OF ty_spfli, " Таблица с данными
  11. go_columns TYPE REF TO cl_salv_columns_table,
  12. go_column TYPE REF TO cl_salv_column_table,
  13. go_events TYPE REF TO cl_salv_events_table,
  14. go_alv TYPE REF TO cl_salv_table.
  15.  
  16. CLASS lcl_handler DEFINITION.
  17. PUBLIC SECTION.
  18. on_link_click FOR EVENT LINK_CLICK OF CL_SALV_EVENTS_TABLE IMPORTING row.
  19.  
  20. CLASS lcl_handler IMPLEMENTATION.
  21. METHOD on_link_click.
  22. READ TABLE gt_data ASSIGNING <fs_record> INDEX row.
  23. CHECK <fs_record> IS ASSIGNED.
  24. CASE <fs_record>-CHECK.
  25. WHEN abap_false.
  26. <fs_record>-CHECK = abap_true.
  27. WHEN abap_true.
  28. <fs_record>-CHECK = abap_false.
  29. go_alv->refresh( refresh_mode = IF_SALV_C_REFRESH=>FULL ).
  30.  
  31. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE gt_data.
  32. " Фабричный метод возвращяет экзмепляр ALV объекта
  33. TRY.
  34. cl_salv_table=>factory(
  35. IMPORTING
  36. r_salv_table = go_alv
  37. CHANGING
  38. t_table = gt_data ).
  39. CATCH cx_salv_msg .
  40. MESSAGE 'Ошибка при создании ALV' TYPE 'E'.
  41.  
  42. " Подключаем стандартные функции
  43. go_alv->set_screen_status( EXPORTING
  44. REPORT = 'SAPLSALV_METADATA_STATUS'
  45. pfstatus = 'SALV_TABLE_STANDARD'
  46. set_functions = CL_SALV_MODEL_BASE=>C_FUNCTIONS_ALL ).
  47. go_events = go_alv->get_event( ).
  48. SET HANDLER lcl_handler=>on_link_click FOR go_events.
  49. " Получаем ссылку на объект настройки колонок
  50. go_columns = go_alv->get_columns( ).
  51. TRY .
  52. go_column ?= go_columns->get_column( 'CHECK' ).
  53. go_column->set_cell_type( IF_SALV_C_CELL_TYPE=>CHECKBOX_HOTSPOT ).
  54. go_column->set_key( ).
  55. CATCH cx_salv_not_found.
  56.  
  57. " Отобразить ALV представление
  58. go_alv->display( ).

Пример SAP где рассматривается обработка событий в ALV таблице - SALV_DEMO_TABLE_EVENTS

abap-blog.ru

Комментарии