业务场景
为了记录从客户或经销商询单到正式下达销售订单的过程并分析,需要记录销售订单创建和修改时的关键信息,其中包括:客户、物料、订单数量、交货日期、更改原因。
解决方案
创建销售订单时自动记录关键信息到自建表。
更改销售订单时弹出更改原因类别及更改明细说明到自建表。
增强点
使用到的增强点有两个:
1.MV45AFZZ程序USEREXIT_SAVE_DOCUMENT_PREPARE:销售订单保存增强点。
2.MV45AFZA程序USEREXIT_REFRESH_DOCUMENT:这个增强点是销售订单刷新前的增强点。(小声bb:这是我能找到的,能用的,点完保存按钮之后最后执行的增强点)。金色传说这个增强点在创建销售订单时,能取到新产生的销售订单编号!
程序实现
1.自建表
这里就贴个图,大家根据自己的需要选择即可。
2.找到增强点位置,创建隐式增强(小声bb:创建隐式增强的方法百度一堆,这里就不占字数了)。
3.销售订单保存增强点代码;
*--------------------------------------------------------------------S↓*
"S4 LJ 销售订单创建记录关键信息和修改时的关键信息,其中包括:客户、物料、订单数量、交货日期
* 销售订单修改订单数量和计划行日期时记录修改的关键信息,其中包括:客户、物料、订单数量、交货日期、更改原因 27.07.2021 10:13:05
* ZTSD_010 记录表 ZTSD_010A 原因类别表
DATA:gt_data LIKE TABLE OF ztsd_010,
gs_data LIKE LINE OF gt_data.
IF sy-tcode EQ 'VA01'."创建时直接保存下关键数据即可
CLEAR:gs_data.
LOOP AT xvbap INTO DATA(ds_vbap).
gs_data-vbeln = xvbak-vbeln.
gs_data-kunnr = xvbak-kunnr.
gs_data-uname = sy-uname.
gs_data-datum = sy-datum.
gs_data-uzeit = sy-uzeit.
gs_data-posnr = ds_vbap-posnr.
gs_data-matnr = ds_vbap-matnr.
gs_data-wmeng = ds_vbap-kwmeng.
gs_data-vrkme = ds_vbap-vrkme.
LOOP AT xvbep INTO DATA(ds_xvbep) WHERE posnr = ds_vbap-posnr AND edatu IS NOT INITIAL.
gs_data-etenr = ds_xvbep-etenr.
gs_data-etdat = ds_xvbep-edatu.
ENDLOOP.
gs_data-zxglb = '9999'.
gs_data-zxgxq = '新建'.
APPEND gs_data TO gt_data.
* MODIFY ztsd_010 FROM gs_data.
CLEAR:gs_data.
ENDLOOP.
EXPORT gt_data TO MEMORY ID 'ZSOCHANGELOG'.
ELSE."VA02等修改订单时,要进行修改前后数据的对比
DATA: lt_value TYPE TABLE OF sval,
ls_value TYPE sval,
lv_rtn_cd.
DATA:zmsg TYPE string,
zkwmeng TYPE vbap-kwmeng,
zedatu TYPE vbep-edatu,
zedatux TYPE vbep-edatu.
CLEAR:lt_value,ls_value,lv_rtn_cd.
**** 组装弹出输入框窗口的原因类别和原因详情字段
ls_value-tabname = 'ZTSD_010A'.
ls_value-fieldname = 'ZXGLB'.
ls_value-field_obl = 'X'."设置弹出框字段必输
ls_value-value = ''."这里可以给字段默认值
APPEND ls_value TO lt_value.
CLEAR:ls_value.
ls_value-tabname = 'ZTSD_010'.
ls_value-fieldname = 'ZXGXQ'.
ls_value-value = ''.
APPEND ls_value TO lt_value.
LOOP AT xvbap INTO DATA(ds_xvbap)."循环所有行,有变动的才记录
SELECT SINGLE kwmeng INTO zkwmeng FROM vbap WHERE vbeln = ds_xvbap-vbeln AND posnr = ds_xvbap-posnr.
SELECT SINGLE edatu INTO zedatu FROM vbep WHERE vbeln = ds_xvbap-vbeln AND posnr = ds_xvbap-posnr."改之前的
READ TABLE xvbep INTO DATA(ds_edatu) WITH KEY vbeln = ds_xvbap-vbeln posnr = ds_xvbap-posnr."改之后的
**** 销售单位订单数量和交货日期日期 时弹出
IF zkwmeng NE ds_xvbap-kwmeng OR zedatu NE ds_edatu-edatu.
zmsg = '输入 '&& xvbap-posnr && ' 行的修改原因类别和详情'.
CALL FUNCTION 'POPUP_GET_VALUES'
EXPORTING
popup_title = zmsg
IMPORTING
returncode = lv_rtn_cd
TABLES
fields = lt_value.
IF lv_rtn_cd IS INITIAL.
gs_data-vbeln = xvbak-vbeln.
gs_data-kunnr = xvbak-kunnr.
gs_data-uname = sy-uname.
gs_data-datum = sy-datum.
gs_data-uzeit = sy-uzeit.
gs_data-posnr = ds_xvbap-posnr.
gs_data-matnr = ds_xvbap-matnr.
gs_data-wmeng = ds_xvbap-kwmeng.
gs_data-vrkme = ds_xvbap-vrkme.
LOOP AT xvbep INTO DATA(ds_xvbep1) WHERE posnr = ds_xvbap-posnr AND edatu IS NOT INITIAL.
gs_data-etenr = ds_xvbep1-etenr.
gs_data-etdat = ds_xvbep1-edatu.
CLEAR:ds_xvbep1.
ENDLOOP.
READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'ZXGLB'.
IF sy-subrc = 0.
SELECT SINGLE zxglb INTO gs_data-zxglb FROM ztsd_010a WHERE zxglb = ls_value-value.
IF gs_data-zxglb IS INITIAL.
MESSAGE e005(zsd001).
ENDIF.
CLEAR ls_value.
ENDIF.
READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'ZXGXQ'.
IF sy-subrc = 0.
gs_data-zxgxq = ls_value-value.
CLEAR ls_value.
ENDIF.
APPEND gs_data TO gt_data.
CLEAR:gs_data.
ELSEIF lv_rtn_cd EQ 'A'."取消
MESSAGE e004(zsd001).
ENDIF.
ENDIF.
CLEAR:zkwmeng, zedatu.
ENDLOOP.
EXPORT gt_data TO MEMORY ID 'ZSOCHANGELOG'.
ENDIF.
*--------------------------------------------------------------------E↑*
金色传说这一步非常重要,因为保存增强点中没有销售订单号,所有把数据放到内存中,在另外的增强点进行接收和更新自建表
4.销售订单刷新增强点代码:
FORM USEREXIT_REFRESH_DOCUMENT.
ENHANCEMENT 7 ZEN_SD_01. "active version
* 创建和修改时保存关键信息。 LJ 20210727
IF sy-tcode EQ 'VA01' OR sy-tcode EQ 'VA02'.
DATA:gt_data LIKE TABLE OF ztsd_010.
IMPORT gt_data FROM MEMORY ID 'ZSOCHANGELOG'.
LOOP AT gt_data INTO DATA(ds_data).
ds_data-vbeln = xvbak-vbeln."写入订单号
MODIFY ztsd_010 FROM ds_data.
CLEAR:ds_data.
ENDLOOP.
FREE MEMORY ID 'ZSOCHANGELOG'.
CLEAR:gt_data.
ENDIF.
ENDENHANCEMENT.
ENDFORM.
金色传说用完的内存要记得及时释放
成果展示
所有修改了数量或者交货日期的行都会提示输入修改详情
如果点关闭或取消,则会提示要输入修改原因,会再次弹出上面的输入框。
以上
不妥之处欢迎留言指正。手动笑脸
欢迎关注公众号,每日更新: