ABAP DEMO ALV- monitor data modification

*&---------------------------------------------------------------------*
*& 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. 

DATES : go_grid              TYPE  REF  TO cl_gui_alv_grid, 
      go_custom_container TYPE  REF  TO cl_gui_custom_container.
DATES : 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, 
      lettuce         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- '  ' document '        ''  ' MBLNR '  ' MSEG ' rt_fieldcat,
   ' KOSTL '   ''  ' cost centers '    ' 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
*            = TABIX i_tabix 
             .
       ENDIF .
     ENDLOOP .
   ENDIF .
 EndForm .                     " HANDLE_DATA_CHANGED 


* *********************************** ************************************ 
* 5, to expand the content 
* common methods and properties CL_ALV_CHANGED_DATA_PROTOCOL parameters 
* 
* the method uses 
* MODIFY_CELL location of a cell to modify the specified value 
* GET_CELL_VALUE obtaining the cell value 
* ADD_PROTOCOL_ENTRY a pop-up message, the system must use the standard message class 
* MODIFY_PROTOCOL_ENTRY modification message 
* PROTOCOL_IS_VISIBLE whether to display an error information presentation
* REFRESH_PROTOCOL delete the error message 
* 
* Property Purpose 
* MT_PROTOCOL LOGs 
* MT_MOD_CELLS updated cell information 
* information MP_MOD_ROWS updated rows 
* value MT_GOOD_CELLS correct the CELL 
* line information MT_DELETED_ROWS deleted 
* MT_INSERTED_ROWS line information newly inserted 

* the PS : check alv edit field, often including repetitive inspections and checking the existence of the input field and think about how to achieve 
* ************************ ***********************************************

 

Guess you like

Origin www.cnblogs.com/rainysblog/p/11980396.html