场景:用户编辑一个单元格的值,另一个单元格随之自动改变
如:最小包装变化,打印张数自动改变。
第一步:声明变量
第二步:设置退出单元格时可编辑的回调,立即出发data changed事件
第三步:设置单元格可编辑
第四步:设置ALV EVENT
NAME必须为’DATA_CHANGED’.
第五步:写回调的函数(ALV_DATA_CHANGED 事件)
* ALV_DATA_CHANGED 事件
FORM ALV_DATA_CHANGED USING PCL_DATA TYPE REF TO CL_ALV_CHANGED_DATA_PROTOCOL.
DATA:
LS_CELLS TYPE LVC_S_MODI.
DATA LV_ISINTEGER TYPE CHAR20.
DATA INTEGER TYPE CHAR20.
DATA DECIMAL TYPE CHAR20.
TYPES: BEGIN OF TY_MODDATA,
ROW_ID LIKE LS_CELLS-ROW_ID,
ZDYZS LIKE GS_DATA-ZDYZS,
END OF TY_MODDATA.
DATA LW_MODATA TYPE TY_MODDATA.
DATA LT_MODATA LIKE TABLE OF LW_MODATA.
"Get ALV grid
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = GR_GRID.
CLEAR GS_DATA.
"循环改变的可编辑列
LOOP AT PCL_DATA->MT_MOD_CELLS INTO LS_CELLS.
"如果改变的最小包装列
IF LS_CELLS-FIELDNAME = 'ZZXBZ'.
READ TABLE GT_DATA INDEX LS_CELLS-ROW_ID INTO GS_DATA.
"计算要打印张数的值
IF GS_DATA-SHKZG = 'S'.
"判断数量是否是小数
LV_ISINTEGER = GS_DATA-MENGE.
SPLIT LV_ISINTEGER AT '.' INTO INTEGER DECIMAL.
IF DECIMAL > 0. "小数
"打印张数向上取整
GS_DATA-ZDYZS = CEIL( GS_DATA-MENGE / LS_CELLS-VALUE ).
ELSE.
GS_DATA-ZDYZS = GS_DATA-MENGE / LS_CELLS-VALUE.
ENDIF.
ELSEIF GS_DATA-SHKZG = 'H'.
GS_DATA-ZDYZS = GS_DATA-MENGE / LS_CELLS-VALUE.
"判断打印张数是否是小数
LV_ISINTEGER = GS_DATA-ZDYZS.
SPLIT LV_ISINTEGER AT '.' INTO INTEGER DECIMAL.
IF DECIMAL = 0.
"整数
GS_DATA-ZDYZS = 0.
ELSE.
GS_DATA-ZDYZS = 1.
ENDIF.
ENDIF.
"修改内表
MOVE LS_CELLS-ROW_ID TO LW_MODATA-ROW_ID.
MOVE GS_DATA-ZDYZS TO LW_MODATA-ZDYZS.
APPEND LW_MODATA TO LT_MODATA.
CLEAR LW_MODATA.
ENDIF.
ENDLOOP.
"修改列数据
LOOP AT LT_MODATA INTO LW_MODATA.
PCL_DATA->MODIFY_CELL(
EXPORTING
I_ROW_ID = LW_MODATA-ROW_ID " Row ID
* I_TABIX = " Row Index
I_FIELDNAME = 'ZDYZS' " Field Name
I_VALUE = LW_MODATA-ZDYZS " Value
).
ENDLOOP.
"Refresh ALV
PERFORM F_REFRESH_ALV.
ENDFORM.
第六步:调用alv