原贴地址:http://blog.chinaunix.net/u1/40527/showart.php?id=1859510
*&---------------------------------------------------------------------*
*& Report Z_BARRY_ALV_DATACHANGED
*&
*&---------------------------------------------------------------------*
*& 更多参考程序:BCALV_EDIT_08
*&
*&---------------------------------------------------------------------*
REPORT
Z_BARRY_ALV_DATACHANGED.
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.
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 新插入的行信息