abap demon for oo alv, handle each event 注册alv的事件(data_changed_event.....)

主要了解,ALV界面的各种事件,如data_changed event

*&---------------------------------------------------------------------*
*& Report  Z_ALV_OO_TEST_KEN
*&
*&---------------------------------------------------------------------*
*&
*& test for oo event
*&---------------------------------------------------------------------*

REPORT Z_ALV_OO_TEST_KEN.
TYPE-POOLS: slis.
*&---------------------------------------------------------------------*
*& Type define
*&---------------------------------------------------------------------*
TYPES:
  BEGIN OF ty_check_type,
    matnr         TYPE char18,
    mtart         TYPE char4,
  END OF ty_check_type,
  tt_check_type TYPE ty_check_type.

 DATA lt_check_type TYPE TABLE OF tt_check_typE.
 DATA lS_check_type TYPE TY_check_type.

DATA:
* ALV DEFINIE
  go_container    TYPE REF TO cl_gui_custom_container,
  go_alv_grid     TYPE REF TO cl_gui_alv_grid,
  lt_fieldcat     TYPE lvc_t_fcat,
  lw_fieldcat     LIKE LINE OF lt_fieldcat,
  lw_layout       TYPE lvc_s_layo,
  i_grid_settings TYPE lvc_s_glay,
  GT_FIELDCAT     TYPE LVC_T_FCAT, " 功能C: 设定fieldcat
  GS_FIELDCAT     TYPE LVC_S_FCAT." 功能C: 设定fieldcat

CLASS cl_event_receiver DEFINITION.
 PUBLIC SECTION.
" 声明单击事件的方法
  METHODS handle_hotspot_click
   FOR EVENT hotspot_click OF cl_gui_alv_grid
   IMPORTING e_row_id e_column_id.

  " 声明双击事件方法
  METHODS handle_double_click
    FOR EVENT double_click OF cl_gui_alv_grid
    IMPORTING e_row e_column.

  " data change event
  METHODS handle_data_changed
    FOR EVENT data_changed of cl_gui_alv_grid
    IMPORTING er_data_changed.

ENDCLASS.

CLASS cl_event_receiver IMPLEMENTATION.
METHOD handle_hotspot_click.
 CONDENSE e_row_id NO-GAPS.
 CONDENSE e_column_id NO-GAPS.
 MESSAGE i001(00) WITH '单击事件->行号:' e_row_id '、列名:' e_column_id.
  ENDMETHOD.
" 双击事件方法的实现
  METHOD handle_double_click.
    CONDENSE e_row     NO-GAPS.
    CONDENSE e_column  NO-GAPS.
    MESSAGE i001(00) WITH '双击事件->行号:' e_row  '、列名:' e_column.
  ENDMETHOD. "handle_HOTSPOT_CLICK

" data chenged event
  METHOD handle_data_changed.
    PERFORM data_changed USING er_data_changed.
  ENDMETHOD.


ENDCLASS. "cl_event_receiver IMPLEMENTATION

DATA: event_receiver TYPE REF TO cl_event_receiver.
*&---------------------------------------------------------------------*
*& SELECTION-SCREEN
*&---------------------------------------------------------------------*
PARAMETERS:p_matnr TYPE char18 OBLIGATORY.
*&---------------------------------------------------------------------*
*& INITIALIZATION.
*&---------------------------------------------------------------------*
INITIALIZATION.
*&---------------------------------------------------------------------*
*& START-OF-SELECTION.
*&---------------------------------------------------------------------*
START-OF-SELECTION.
*&---------------------------------------------------------------------*
*& END-OF-SELECTION.
*&---------------------------------------------------------------------*
END-OF-SELECTION.
  SELECT
         matnr
         mtart
    FROM mara
    INTO TABLE lt_check_type
    WHERE matnr = p_matnr.
  IF sy-subrc <> 0.
    MESSAGE 'please input correct Material Number!' TYPE 'E'.
    EXIT.
  ENDIF.

  CALL SCREEN 981.

INCLUDE z_alv_oo_test_ken_ini_alv.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0981  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_0981 INPUT.
 DATA ok_code TYPE ok_code.
 CASE ok_code.
   WHEN 'E' OR 'ENDE' OR 'CANCEL'.
     LEAVE PROGRAM.
   WHEN 'SPOS'.
*      PERFORM updat_FARR_D_DEFITEM_db.
     LOOP AT lt_check_type INTO LS_CHECK_TYPE.

     ENDLOOP.
   WHEN OTHERS.
 ENDCASE.
ENDMODULE.                 " USER_COMMAND_0981  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_EXIT_0100 INPUT.
LEAVE TO SCREEN 0.
ENDMODULE.                 " USER_EXIT_0100  INPUT
*&---------------------------------------------------------------------*
*&      Form  DATA_CHANGED
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_ER_DATA_CHANGED  text
*----------------------------------------------------------------------*
FORM DATA_CHANGED  USING    P_ER_DATA_CHANGED TYPE REF TO   cl_alv_changed_data_protocol.
  DATA : l_tabix TYPE sy-tabix .
  DATA : ls_row  TYPE ty_check_type .
  DATA : ls_data TYPE ty_check_type .
  FIELD-SYMBOLS: <f_data> TYPE tt_check_type.
  FIELD-SYMBOLS: <f_value> TYPE lvc_s_modi-value .
  FIELD-SYMBOLS: <f_field> TYPE ANY .
  DATA : ls_modi TYPE lvc_s_modi .

* here will handle the data changed
  LOOP AT p_er_data_changed->mt_good_cells INTO ls_modi .               " save the value which you changed
   READ TABLE lt_check_type ASSIGNING <f_data> INDEX ls_modi-row_id .   " save the default value
   ASSIGN ls_modi-value To <f_value> .
   ASSIGN COMPONENT ls_modi-fieldname OF STRUCTURE <f_data> TO <f_field> .
   IF sy-subrc EQ 0 .
      <f_field> = <f_value> .    "  if have changes , will save edit interal table directly
   ENDIF.
  ENDLOOP.


ENDFORM.     
  lw_layout-zebra      = abap_true.
  lw_layout-cwidth_opt = abap_true.
  lw_layout-sel_mode     = 'D'.

IF go_container is INITIAL.
  create OBJECT go_container
    EXPORTING
      container_name = 'CUS'. " Name of the Screen CustCtrl

  CREATE OBJECT go_alv_grid
    EXPORTING
      i_parent = go_container . " Parent Container

  lw_layout-edit       = abap_true.
  lw_layout-zebra      = abap_true.
*   lw_layout-stylefname = 'CT'.

  PERFORM prepare_fieldcatalog. "make chekbox for insert and delete

    CREATE OBJECT event_receiver.
    " 注册事件handler方法
*    SET HANDLER event_receiver->handle_hotspot_click FOR go_alv_grid.
*    SET HANDLER event_receiver->handle_double_click  FOR go_alv_grid.
    SET HANDLER event_receiver->handle_data_changed  FOR go_alv_grid.



"以下两个方法达到的效果是:光标离开正在编辑的单元格时,
  CALL METHOD go_alv_grid->register_edit_event
   EXPORTING
     i_event_id = cl_gui_alv_grid=>mc_evt_modified.

  CALL METHOD go_alv_grid->register_edit_event
   EXPORTING
     i_event_id = cl_gui_alv_grid=>mc_evt_enter.
* CALL METHOD go_alv_grid->set_toolbar_interactive. CALL METHOD go_alv_grid->set_table_for_first_display EXPORTING * i_structure_name = 'ZKEN' is_layout = lw_layout i_default = abap_true i_save = 'A' * is_variant = ls_variant CHANGING it_fieldcatalog = GT_FIELDCAT it_outtab = lt_check_type. " Output Table *Set editable cells to ready for input initially CALL METHOD go_alv_grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ELSE. CALL METHOD go_alv_grid->refresh_table_display. ENDIF.
原文地址:https://www.cnblogs.com/HARU/p/10830285.html