原文:Small Fire · SALV CheckBox设置 · ABAP 子专栏 · Small Fire 技术笔记
添加复选框功能
要获得可选(可编辑)复选框,我们需要从 column 对象中获取特定的列。此后,我们需要使用方法 SET_CELL_TYPE 将单元格类型设置为 IF_SALV_C_CELL_TYPE => CHECKBOX_HOTSPOT。要更新复选框中的值,我们需要处理事件 LINK_CLICK。当我们单击启用热点的复选框时,将触发 LINK_CLICK 事件。在事件处理程序方法中,我们需要更改复选框字段的值并调用 REFRESH 方法以刷新 ALV 上的值。
*&---------------------------------------------------------------------*
*& SALV Table, editable checkbox
*&---------------------------------------------------------------------*
REPORT zsalv_editable_checkbox.
CLASS lcl_report DEFINITION.
PUBLIC SECTION.
*Final output table
TYPES: BEGIN OF ty_vbak,
vbeln TYPE vbak-vbeln,
erdat TYPE erdat,
auart TYPE auart,
kunnr TYPE kunnr,
check TYPE flag, "Check box"
END OF ty_vbak.
DATA: t_vbak TYPE STANDARD TABLE OF ty_vbak.
*ALV reference
DATA: o_alv TYPE REF TO cl_salv_table.
METHODS:
get_data,
generate_output.
ENDCLASS. "lcl_report DEFINITION"
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS. "lcl_event_handler DEFINITION"
START-OF-SELECTION.
DATA: lo_report TYPE REF TO lcl_report.
CREATE OBJECT lo_report.
lo_report->get_data( ).
lo_report->generate_output( ).
*----------------------------------------------------------------------*
* CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
METHOD get_data.
SELECT vbeln erdat auart kunnr
INTO TABLE t_vbak
FROM vbak
UP TO 20 ROWS.
ENDMETHOD. "get_data"
METHOD generate_output.
DATA: lx_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = o_alv
CHANGING
t_table = t_vbak ).
CATCH cx_salv_msg INTO lx_msg.
ENDTRY.
DATA: lo_cols TYPE REF TO cl_salv_columns.
lo_cols = o_alv->get_columns( ).
" set the Column optimization "
lo_cols->set_optimize( 'X' ).
DATA: lo_column TYPE REF TO cl_salv_column_list.
*Change the properties of the Columns KUNNR
TRY.
lo_column ?= lo_cols->get_column( 'CHECK' ).
lo_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
lo_column->set_output_length( 10 ).
CATCH cx_salv_not_found. "#EC NO_HANDLER"
ENDTRY.
*Get the event object
DATA: lo_events TYPE REF TO cl_salv_events_table.
lo_events = o_alv->get_event( ).
*Instantiate the event handler object
DATA: lo_event_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT lo_event_handler.
*Event handler
SET HANDLER lo_event_handler->on_link_click FOR lo_events.
*Displaying the ALV
o_alv->display( ).
ENDMETHOD. "generate_output"
ENDCLASS. "lcl_report IMPLEMENTATION"
*----------------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_link_click.
*Get the value of the checkbox and set the value accordingly refersh the table
FIELD-SYMBOLS: <lfa_data> LIKE LINE OF lo_report->t_vbak.
READ TABLE lo_report->t_vbak ASSIGNING <lfa_data> INDEX row.
CHECK sy-subrc IS INITIAL.
IF <lfa_data>-check IS INITIAL.
<lfa_data>-check = 'X'.
ELSE.
CLEAR <lfa_data>-check.
ENDIF.
lo_report->o_alv->refresh( ).
ENDMETHOD. "on_link_click"
ENDCLASS. "lcl_event_handler IMPLEMENTATION"