zoukankan      html  css  js  c++  java
  • ABAP DEMO ALV-监听数据修改

    *&---------------------------------------------------------------------*
    *& Report  YDEMO_006
    *&
    *&---------------------------------------------------------------------*
    *&
    *&
    *&---------------------------------------------------------------------*
    
    REPORT  YDEMO_006.
    
    DATA: BEGIN OF itab OCCURS 0 ,
            mblnr LIKE mseg-mblnr ,
            kostl LIKE mseg-kostl ,
          END OF itab .
    
    DATA: ok_code LIKE sy-ucomm .
    DATA: l_valid(1) TYPE c.
    
    DATA: go_grid             TYPE REF TO cl_gui_alv_grid,
          go_custom_container TYPE REF TO cl_gui_custom_container.
    DATA: gt_fieldcat TYPE lvc_t_fcat,
          gs_fieldcat TYPE lvc_s_fcat,
          gs_variant  TYPE disvariant ,
          gt_filt     TYPE lvc_t_filt,
          gs_filt     TYPE lvc_s_filt,
          sla         TYPE lvc_s_layo .
    
    CLASS lcl_event_receiver DEFINITION DEFERRED .
    DATA: event_receiver TYPE REF TO lcl_event_receiver.
    
    *---------------------------------------------------------------------*
    *       CLASS lcl_event_receiver DEFINITION
    *---------------------------------------------------------------------*
    CLASS lcl_event_receiver DEFINITION.
      PUBLIC SECTION.
        METHODS handle_data_changed
            FOR EVENT data_changed OF cl_gui_alv_grid
                IMPORTING er_data_changed.
    ENDCLASS.                    "lcl_event_receiver DEFINITION
    
    *---------------------------------------------------------------------*
    *       CLASS lcl_event_receiver IMPLEMENTATION
    *---------------------------------------------------------------------*
    CLASS lcl_event_receiver IMPLEMENTATION.
      METHOD handle_data_changed.
    BREAK LZH.
    
        PERFORM handle_data_changed USING er_data_changed.
      ENDMETHOD.                    "handle_data_changed
    ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION
    
    INITIALIZATION.
      PERFORM fieldcat_init USING gt_fieldcat[].
    
    START-OF-SELECTION.
      CALL SCREEN 0100 .
    
    *&---------------------------------------------------------------------*
    *&      Module  USER_COMMAND_0100  INPUT
    *&---------------------------------------------------------------------*
    MODULE user_command_0100 INPUT.
      CASE ok_code.
        WHEN 'BACK' OR 'EXIT'.
          LEAVE PROGRAM.
        WHEN 'ENTE'.
          PERFORM enter.
        WHEN 'CHANGE'.
          PERFORM change.
      ENDCASE.
      CLEAR ok_code .
    ENDMODULE.                 " USER_COMMAND_0100  INPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  load_data_into_grid
    *&---------------------------------------------------------------------*
    FORM load_data_into_grid.
      SELECT * FROM mseg INTO CORRESPONDING FIELDS OF TABLE itab
      UP TO 20 ROWS .
    
      sla-cwidth_opt = 'X'.
      sla-zebra      = 'X'.
    
      CALL METHOD go_grid->set_table_for_first_display
        EXPORTING
          is_variant                    = gs_variant
          i_save                        = 'A'
          is_layout                     = sla
        CHANGING
          it_outtab                     = itab[]
          it_fieldcatalog               = gt_fieldcat[]
        EXCEPTIONS
          invalid_parameter_combination = 1
          program_error                 = 2
          too_many_lines                = 3
          OTHERS                        = 4.
    
      CALL METHOD go_grid->set_ready_for_input "处于编辑状态
        EXPORTING
          i_ready_for_input = 1.
    
      CALL METHOD cl_gui_control=>set_focus    "设置焦点在go_grid 上
        EXPORTING
          control = go_grid .
    ENDFORM.                    " load_data_into_grid
    
    
    *&--------------------------------------------------------------------*
    *&      Form  fieldcat_init
    *&--------------------------------------------------------------------*
    FORM fieldcat_init USING rt_fieldcat TYPE lvc_t_fcat.
      DATA: ls_fieldcat TYPE lvc_s_fcat.
    
      PERFORM frm_catlg_set USING:
      'MBLNR'  'X' '凭证'       '' 'MBLNR' 'MSEG' rt_fieldcat,
      'KOSTL'  '' '成本中心'   'X'  ''      ''     rt_fieldcat.
    ENDFORM.   "fieldcat_init
    
    *---------------------------------------------------------------------*
    *       FORM frm_catlg_set                                            *
    *---------------------------------------------------------------------*
    FORM frm_catlg_set USING p_field p_key p_text p_edit ref_f ref_t
                              rt_fieldcat  TYPE lvc_t_fcat .
      DATA:  tmp_fieldcat TYPE lvc_s_fcat.
    
      tmp_fieldcat-fieldname     =  p_field.
      tmp_fieldcat-key           =  p_key .
      tmp_fieldcat-scrtext_l     =  p_text.
      tmp_fieldcat-edit          =  p_edit.
      tmp_fieldcat-ref_field     = ref_f.
      tmp_fieldcat-ref_table     = ref_t.
    
      APPEND tmp_fieldcat TO rt_fieldcat .
      CLEAR tmp_fieldcat .
    ENDFORM.                    " FRM_CATLG_SET
    
    *&---------------------------------------------------------------------*
    *&      Form  change
    *&---------------------------------------------------------------------*
    FORM change .
      DATA: ls_stable TYPE lvc_s_stbl.
      ls_stable-row = 'X'.
      ls_stable-col = 'X'.
    
      IF go_grid->is_ready_for_input( ) = 0.
        CALL METHOD go_grid->set_ready_for_input
          EXPORTING
            i_ready_for_input = 1.
      ELSE.
        CALL METHOD go_grid->check_changed_data  "把修改的内容更改到内表里
          IMPORTING
            e_valid = l_valid.
        CALL METHOD go_grid->set_ready_for_input
          EXPORTING
            i_ready_for_input = 0.
        CALL METHOD go_grid->refresh_table_display
          EXPORTING
            is_stable = ls_stable
          EXCEPTIONS
            finished  = 1
            OTHERS    = 2.
      ENDIF.
    ENDFORM.                    " change
    
    
    *&---------------------------------------------------------------------*
    *&      Module  STATUS_0100  OUTPUT
    *&---------------------------------------------------------------------*
    MODULE status_0100 OUTPUT.
      SET PF-STATUS 'MAIN100'.
      gs_variant-report = sy-repid.
    
      IF go_grid IS INITIAL.
        CREATE OBJECT go_grid
          EXPORTING
            i_parent = cl_gui_container=>screen0.
        CREATE OBJECT event_receiver.
    
        SET HANDLER event_receiver->handle_data_changed FOR go_grid.
    
        IF sy-batch IS INITIAL.
          CALL METHOD go_grid->register_edit_event
            EXPORTING
              i_event_id = cl_gui_alv_grid=>mc_evt_enter. "回车时触发
    *        i_event_id = cl_gui_alv_grid=>mc_evt_modified. "单元格更改触发
        ENDIF.
    
        PERFORM load_data_into_grid.
      ENDIF.
    ENDMODULE.                 " STATUS_0100  OUTPUT
    
    *&---------------------------------------------------------------------*
    *&      Form  ENTER
    *&---------------------------------------------------------------------*
    FORM enter .
      DATA: ucomm LIKE sy-ucomm.
    
      ucomm = '&DATA_SAVE'." '&REFRESH'.
      CALL METHOD go_grid->set_function_code
        CHANGING
          c_ucomm = ucomm.
    ENDFORM.                    " ENTER
    
    *&---------------------------------------------------------------------*
    *&      Form  HANDLE_DATA_CHANGED
    *&---------------------------------------------------------------------*
    FORM handle_data_changed USING data_changed TYPE REF TO cl_alv_changed_data_protocol..
      FIELD-SYMBOLS: <fs_mod_rows> TYPE STANDARD TABLE,
                     <fs_cells> TYPE lvc_t_modi ,
                     <fs_cell_wa> TYPE lvc_s_modi ,
                     <fs>    LIKE LINE OF itab.
    BREAK LZH.
    
      IF NOT data_changed->mp_mod_rows IS INITIAL.
        ASSIGN data_changed->mp_mod_rows->* TO <fs_mod_rows>.
        ASSIGN data_changed->mt_mod_cells TO <fs_cells>.
        LOOP AT <fs_mod_rows> ASSIGNING <fs>.
          IF <fs>-kostl = 'ABC' .
            READ TABLE <fs_cells> INDEX sy-tabix ASSIGNING <fs_cell_wa>.
            CALL METHOD data_changed->add_protocol_entry
              EXPORTING
                i_msgid     = 'OO'
                i_msgty     = 'E'
                i_msgno     = '000'
                i_msgv1     = '不可以为ABC'
                i_fieldname = 'KOSTL'
                i_row_id    = <fs_cell_wa>-row_id
    *            i_tabix     = tabix
                 .
          ENDIF.
        ENDLOOP.
      ENDIF.
    ENDFORM.                    " HANDLE_DATA_CHANGED
    
    
    ************************************************************************
    *5、拓展内容
    *CL_ALV_CHANGED_DATA_PROTOCOL参数的常用方法和属性
    *
    *方法                   用途
    *MODIFY_CELL            修改指定位置单元格的值
    *GET_CELL_VALUE         获取单元格的值
    *ADD_PROTOCOL_ENTRY     弹出一个消息,必须使用系统标准的消息类
    *MODIFY_PROTOCOL_ENTRY  修改消息
    *PROTOCOL_IS_VISIBLE    是否显示错误信息提示
    *REFRESH_PROTOCOL       删除错误消息
    *
    *属性                   用途
    *MT_PROTOCOL            LOGs
    *MT_MOD_CELLS           更新的单元格信息
    *MP_MOD_ROWS            更新了的行的信息
    *MT_GOOD_CELLS          正确的CELL的值
    *MT_DELETED_ROWS        被删除的行信息
    *MT_INSERTED_ROWS       新插入的行信息
    
    *PS:alv编辑字段的检查,通常包括输入字段的重复性检查和存在性检查,想一想怎么实现
    ************************************************************************
  • 相关阅读:
    ubuntu系统里常用的几个命令
    Vue中常用知识点demo
    Vue基础知识学习(后端)
    ubuntu内lnmp相关操作命令
    linux下安装lnmp集成环境
    js时间戳与日期格式之间相互转换
    yii2中 选择布局的方式,可以设置不使用布局
    yii2中通过migration创建数据表
    php实现支付宝在线支付和扫码支付demo
    linux下添加用户并将文件夹授权给某一个用户
  • 原文地址:https://www.cnblogs.com/rainysblog/p/11980396.html
Copyright © 2011-2022 走看看