ABAP alv获取鼠标焦点移开事件

鼠标移开触发事件,多运用于点击一个单据,要把所有相同的单据都勾选

*&----------------------------------------------------------------------
*& 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值