*&---------------------------------------------------------------------**& Report YDEMO_006*&*&---------------------------------------------------------------------**&*&*&---------------------------------------------------------------------*
REPORTYDEMO_006.DATA: BEGIN OF itab OCCURS 0,
mblnrLIKE mseg-mblnr ,
kostlLIKE mseg-kostl ,END OFitab .DATA: ok_code LIKE sy-ucomm .DATA: l_valid(1) TYPEc.DATA: go_grid TYPE REF TOcl_gui_alv_grid,
go_custom_containerTYPE REF TOcl_gui_custom_container.DATA: gt_fieldcat TYPElvc_t_fcat,
gs_fieldcatTYPElvc_s_fcat,
gs_variantTYPEdisvariant ,
gt_filtTYPElvc_t_filt,
gs_filtTYPElvc_s_filt,
slaTYPElvc_s_layo .CLASS lcl_event_receiver DEFINITIONDEFERRED .DATA: event_receiver TYPE REF TOlcl_event_receiver.*---------------------------------------------------------------------**CLASS lcl_event_receiver DEFINITION*---------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.PUBLIC SECTION.METHODShandle_data_changedFOR EVENT data_changed OFcl_gui_alv_gridIMPORTINGer_data_changed.ENDCLASS. "lcl_event_receiver DEFINITION
*---------------------------------------------------------------------**CLASS lcl_event_receiver IMPLEMENTATION*---------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.METHODhandle_data_changed.BREAKLZH.PERFORM handle_data_changed USINGer_data_changed.ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_event_receiver IMPLEMENTATION
INITIALIZATION.PERFORM fieldcat_init USINGgt_fieldcat[].START-OF-SELECTION.CALL SCREEN 0100.*&---------------------------------------------------------------------**& Module USER_COMMAND_0100 INPUT*&---------------------------------------------------------------------*
MODULEuser_command_0100 INPUT.CASEok_code.
WHEN‘BACK‘ OR ‘EXIT‘.LEAVE PROGRAM.
WHEN‘ENTE‘.PERFORMenter.
WHEN‘CHANGE‘.PERFORMchange.ENDCASE.CLEARok_code .ENDMODULE. "USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------**& Form load_data_into_grid*&---------------------------------------------------------------------*
FORMload_data_into_grid.SELECT * FROM mseg INTO CORRESPONDING FIELDS OF TABLEitab
UPTO 20ROWS .
sla-cwidth_opt = ‘X‘.
sla-zebra = ‘X‘.CALL METHOD go_grid->set_table_for_first_displayEXPORTINGis_variant=gs_variant
i_save= ‘A‘is_layout=slaCHANGINGit_outtab=itab[]
it_fieldcatalog=gt_fieldcat[]EXCEPTIONSinvalid_parameter_combination= 1program_error= 2too_many_lines= 3OTHERS= 4.CALL METHOD go_grid->set_ready_for_input "处于编辑状态
EXPORTINGi_ready_for_input= 1.CALL METHOD cl_gui_control=>set_focus "设置焦点在go_grid 上
EXPORTINGcontrol=go_grid .ENDFORM. "load_data_into_grid
*&--------------------------------------------------------------------**& Form fieldcat_init*&--------------------------------------------------------------------*
FORM fieldcat_init USING rt_fieldcat TYPElvc_t_fcat.DATA: ls_fieldcat TYPElvc_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 USINGp_field p_key p_text p_edit ref_f ref_t
rt_fieldcatTYPElvc_t_fcat .DATA: tmp_fieldcat TYPElvc_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 TOrt_fieldcat .CLEARtmp_fieldcat .ENDFORM. "FRM_CATLG_SET
*&---------------------------------------------------------------------**& Form change*&---------------------------------------------------------------------*
FORMchange .DATA: ls_stable TYPElvc_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_inputEXPORTINGi_ready_for_input= 1.ELSE.CALL METHOD go_grid->check_changed_data "把修改的内容更改到内表里
IMPORTINGe_valid=l_valid.CALL METHOD go_grid->set_ready_for_inputEXPORTINGi_ready_for_input= 0.CALL METHOD go_grid->refresh_table_displayEXPORTINGis_stable=ls_stableEXCEPTIONSfinished= 1OTHERS= 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 OBJECTgo_gridEXPORTINGi_parent= cl_gui_container=>screen0.CREATE OBJECTevent_receiver.SET HANDLER event_receiver->handle_data_changed FORgo_grid.IF sy-batch IS INITIAL.CALL METHOD go_grid->register_edit_eventEXPORTINGi_event_id= cl_gui_alv_grid=>mc_evt_enter. "回车时触发*i_event_id = cl_gui_alv_grid=>mc_evt_modified. "单元格更改触发
ENDIF.PERFORMload_data_into_grid.ENDIF.ENDMODULE. "STATUS_0100 OUTPUT
*&---------------------------------------------------------------------**& Form ENTER*&---------------------------------------------------------------------*
FORMenter .DATA: ucomm LIKE sy-ucomm.
ucomm= ‘&DATA_SAVE‘."‘&REFRESH‘.
CALL METHOD go_grid->set_function_codeCHANGINGc_ucomm=ucomm.ENDFORM. "ENTER
*&---------------------------------------------------------------------**& Form HANDLE_DATA_CHANGED*&---------------------------------------------------------------------*
FORM handle_data_changed USING data_changed TYPE REF TOcl_alv_changed_data_protocol..FIELD-SYMBOLS: TYPE STANDARD TABLE, TYPElvc_t_modi , TYPElvc_s_modi , LIKE LINE OFitab.BREAKLZH.IF NOT data_changed->mp_mod_rows IS INITIAL.ASSIGN data_changed->mp_mod_rows->* TO .ASSIGN data_changed->mt_mod_cells TO .LOOP AT ASSIGNING .IF -kostl = ‘ABC‘.READ TABLE INDEX sy-tabix ASSIGNING .CALL METHOD data_changed->add_protocol_entryEXPORTINGi_msgid= ‘OO‘i_msgty= ‘E‘i_msgno= ‘000‘i_msgv1= ‘不可以为ABC‘i_fieldname= ‘KOSTL‘i_row_id= -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编辑字段的检查,通常包括输入字段的重复性检查和存在性检查,想一想怎么实现************************************************************************