鼠标移开触发事件,多运用于点击一个单据,要把所有相同的单据都勾选
*&----------------------------------------------------------------------
*& CLASS. 创建类
*&----------------------------------------------------------------------
CLASS lcl_event_receiver DEFINITION.
PUBLIC SECTION.
METHODS handle_modify FOR EVENT data_changed_finished OF cl_gui_alv_grid
IMPORTING e_modified et_good_cells.
ENDCLASS.
*&----------------------------------------------------------------------
*& CLASS. 实施类,触发时调用
*&----------------------------------------------------------------------
CLASS lcl_event_receiver IMPLEMENTATION.
METHOD handle_modify.
PERFORM frm_handle_modify USING e_modified et_good_cells.
ENDMETHOD.
ENDCLASS.
DATA:
t_events TYPE slis_t_event, "ALV显示用
v_event_receiver TYPE REF TO lcl_event_receiver.
ALV之前要调用加载EVENT事件
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& 数据显示
*&---------------------------------------------------------------------*
FORM frm_alv_display .
PERFORM frm_layout.
PERFORM frm_fieldcat.
* 自动刷新事件
PERFORM frm_set_event.
PERFORM frm_output USING gt_alv.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_output USING it_tab TYPE STANDARD TABLE.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
i_save = 'A'
i_callback_pf_status_set = 'FRM_SET_PF_STATUS'
i_callback_user_command = 'FRM_USER_COMMAND'
is_layout_lvc = gs_layout
it_events = t_events
it_fieldcat_lvc = gt_fieldcat
TABLES
t_outtab = it_tab
EXCEPTIONS
program_error = 1
OTHERS = 2.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM. " FRM_OUTPUT
剩下就是核心的操作数据的FROM
*&---------------------------------------------------------------------*
*& Form FRM_HANDLE_MODIFY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> E_MODIFIED
*& --> ET_GOOD_CELLS
*&---------------------------------------------------------------------*
FORM frm_handle_modify USING i_modified
it_good_cells TYPE lvc_t_modi.
DATA: lw_stylerow TYPE lvc_s_styl .
CHECK i_modified = 'X'.
* 读取选择框是不是勾选了
LOOP AT it_good_cells INTO DATA(lw_good_cells) WHERE fieldname = 'CHECKBOX'.
* 如果是取消勾选的状态,则将同样的凭证都取消勾选
IF lw_good_cells-value = ''.
READ TABLE gt_alv INTO DATA(ls_alv) INDEX lw_good_cells-row_id.
IF sy-subrc = 0.
LOOP AT gt_alv ASSIGNING FIELD-SYMBOL(<lw_output>) WHERE belnr = ls_alv-belnr.
<lw_output>-checkbox = ''.
ENDLOOP.
ENDIF.
* 如果是勾选的状态,则将同样的凭证都勾选
ELSEIF lw_good_cells-value = 'X'.
READ TABLE gt_alv INTO ls_alv INDEX lw_good_cells-row_id.
IF sy-subrc = 0.
LOOP AT gt_alv ASSIGNING <lw_output> WHERE belnr = ls_alv-belnr.
<lw_output>-checkbox = 'X'.
ENDLOOP.
ENDIF.
ENDIF.
ENDLOOP.
IF sy-ucomm = ''.
PERFORM refresh_alv.
ENDIF.
ENDFORM.
FORM frm_set_event .
t_events = VALUE #( ( name = 'CALLER_EXIT' form = 'FRM_ALV_EVENT' ) ).
ENDFORM.
FORM frm_alv_event USING e_grid TYPE slis_data_caller_exit.
DATA: l_grid TYPE REF TO cl_gui_alv_grid.
IF l_grid IS INITIAL.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_grid.
ENDIF.
* ENTER
CALL METHOD l_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e000(zsd01) WITH TEXT-m02. "ERROR!
ENDIF.
*–·设置 单光标焦点移开被修改单元格后既触发事件
CALL METHOD l_grid->register_edit_event
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_modified
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE e000(zsd01) WITH TEXT-m02. "ERROR!
ENDIF.
CREATE OBJECT v_event_receiver.
SET HANDLER v_event_receiver->handle_modify FOR l_grid.
ENDFORM.