zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    HDOJ 3265 Posters (线段树+扫描线求矩形面积并)
    HDOJ 2243 考研路茫茫——单词情结(自动机DP+矩阵快速幂和)
    POJ 1389 Area of Simple Polygons (离散化求矩形面积并)
    POJ 3691 DNA repair(自动机DP)
    POJ 1151 Atlantis (离散化求矩形面积并)
    备份—何为备份?
    健康,人生第一要事
    x200 降噪手记
    好书推荐《系统管理员的时间管理》
    计算机加入域全过程截图
  • 原文地址:https://www.cnblogs.com/HARU/p/10830285.html
Copyright © 2011-2022 走看看