可编辑ALV的数据检查模板

原贴地址:http://blog.chinaunix.net/u1/40527/showart.php?id=1859510

*&---------------------------------------------------------------------*
*& Report  Z_BARRY_ALV_DATACHANGED
*&
*&---------------------------------------------------------------------*
*& 更多参考程序:BCALV_EDIT_08
*&
*&---------------------------------------------------------------------*

REPORT   Z_BARRY_ALV_DATACHANGED.


DATABEGIN  OF  ITAB OCCURS  0  ,
        MBLNR LIKE  MSEG-MBLNR ,
        KOSTL LIKE  MSEG-KOSTL ,
      END  OF  ITAB .

DATA : OK_CODE LIKE  SY-UCOMM .
DATA : L_VALID(1TYPE  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.
    PERFORM  HANDLE_DATA_CHANGED USING  ER_DATA_CHANGED.
  ENDMETHOD .                    "handle_data_changed
ENDCLASS .                    "lcl_event_receiver IMPLEMENTATION

INITIALIZATION .
*  gd_repid = sy-repid.
  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' .
      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.
    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.

  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


*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       新插入的行信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值