1. 前言
对于销售单屏幕增强:
- 屏幕使用sap程序SAPMV45A标准预留的两个子屏幕8309 8459
- 增强出口BAdI & USER_EXIT
- BAdI
- 使用SAP BADI_SD_SALES_BASIC(SE18->BAdI名称)中
- BADI_SLS_HEAD_SCR_CUS
- BADI_SLS_ITEM_SCR_CUS
进行增强
- USER_EXIT(MV45AOZZ)
- USEREXIT_FIELD_MODIFICATION
- USEREXIT_MOVE_FIELD_TO_VBAK
- USEREXIT_SAVE_DOCUMENT
- USEREXIT_SAVE_DOCUMENT_PREPARE
- 更多出口函数及函数作用请参考官方文档:User Exits In Sales Document Processing
对于销售订单增强的标准变量:
- BAdI
- 抬头
- XVBAK:新数据如有变化/否则与旧数据相同
- YVBAK:旧数据如果有变化(考虑项目)/否则为空
- VBAK:工作区
- 行项目
- XVBAP:新数据如有变化/否则与旧数据相同
- YVBAP:旧数据如果有变化(考虑项目)/否则为空
- VBAK:工作区
- 其他
- 等同抬头行项目(自行测试)
2. 增强效果
- 抬头
- 行项目
3. Step1:新增两个结构并include到VBAK(销售凭证抬头表) VBAP(销售凭证行项目表)
- 字段命名需要用YY ZZ开头(本例中由于某些原因未使用,系统升级有覆盖的风险),命名规则可参考Note:16466 - Customer name range for SAP objects
- 抬头
- 行项目
4. Step2:屏幕增加布局
- 抬头
- 行项目
5. Step3:屏幕PBO PAI事件
-
抬头
MODULE status_8309 OUTPUT. IF SY-TCODE EQ 'VA03'. LOOP AT SCREEN. IF SCREEN-NAME = 'VBAK-ZGFH' OR SCREEN-NAME = 'VBAK-ZJFD' OR SCREEN-NAME = 'VBAK-ZXTGG'. SCREEN-INPUT = 0. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF. ENDMODULE.
-
行项目
IF SY-TCODE = 'VA03'. LOOP AT SCREEN . IF SCREEN-NAME = 'VBAP-ZXTGG' OR SCREEN-NAME = 'VBAP-ZYQYQ' OR SCREEN-NAME = 'VBAP-ZXTDYXH' OR SCREEN-NAME = 'VBAP-ZXTBZ'. SCREEN-INPUT = 0. MODIFY SCREEN. ENDIF. ENDLOOP. ENDIF.
6. Step4:用户出口保存前增强和保存后增强(程序:SAPMV45A 包含程序:MV45AFZZ)
-
保存前 USEREXIT_SAVE_DOCUMENT_PREPARE(新建增强点,增加校验)
IF ( SY-TCODE = 'VA01' AND SY-UCOMM = 'SICH' AND VBAK-ERDAT > '20210916' ) OR "跳过历史订单;因为有信贷增强,所以增加了一个UCOMM ENT2 ( SY-TCODE = 'VA01' AND SY-UCOMM = 'ENT2' AND VBAK-ERDAT > '20210916' ) OR ( SY-TCODE = 'VA02' AND SY-UCOMM = 'SICH' AND VBAK-ERDAT > '20210916' ). DATA: BEGIN OF LT_MARA OCCURS 0, MATNR TYPE MARA-MATNR, MTPOS_MARA TYPE MARA-MTPOS_MARA, END OF LT_MARA. IF VBAK-AUART = 'Z001' OR VBAK-AUART = 'Z002' OR VBAK-AUART = 'Z003' OR VBAK-AUART = 'Z004' OR VBAK-AUART = 'Z005'. "Herder check * IF VBAK-ZXTGG IS INITIAL. * MESSAGE |销售凭证:{ VBAK-VBELN } "抬头-附加数据B-交付-箱贴规格"未维护值,不允许保存| TYPE 'E'. * ENDIF. "ITEM Check SELECT MATNR MTPOS_MARA INTO TABLE LT_MARA FROM MARA FOR ALL ENTRIES IN XVBAP WHERE MATNR = XVBAP-MATNR. LOOP AT XVBAP WHERE UPDKZ NE 'D'. READ TABLE LT_MARA TRANSPORTING NO FIELDS WITH KEY MATNR = XVBAP-MATNR MTPOS_MARA = 'NORM'. "NORN类型物料 IF SY-SUBRC = 0. IF XVBAP-ZMPXX IS INITIAL. MESSAGE |销售凭证:{ XVBAP-VBELN } "行项目:{ XVBAP-POSNR }-附加数据B-铭牌数据-铭牌选项"未维护值,不允许保存| TYPE 'E'. ELSEIF XVBAP-ZYSBM IS INITIAL. MESSAGE |销售凭证:{ XVBAP-VBELN } "行项目:{ XVBAP-POSNR }-附加数据B-铭牌数据-颜色编码"未维护值,不允许保存| TYPE 'E'. ELSEIF XVBAP-ZYQBZ IS INITIAL. MESSAGE |销售凭证:{ XVBAP-VBELN } "行项目:{ XVBAP-POSNR }-附加数据B-铭牌数据-油漆标准"未维护值,不允许保存| TYPE 'E'. ELSEIF XVBAP-ZXTGG IS INITIAL. MESSAGE |销售凭证:{ XVBAP-VBELN } "行项目:{ XVBAP-POSNR }-附加数据B-交付数据-箱贴规格"未维护值,不允许保存| TYPE 'E'. ELSEIF XVBAP-ZYQYQ IS INITIAL. MESSAGE |销售凭证:{ XVBAP-VBELN } "行项目:{ XVBAP-POSNR }-附加数据B-交付数据-要求编码"未维护值,不允许保存| TYPE 'E'. ENDIF. ENDIF. READ TABLE LT_MARA TRANSPORTING NO FIELDS WITH KEY MATNR = XVBAP-MATNR MTPOS_MARA = 'NOR2'. "NOR2类型物料 IF SY-SUBRC = 0. IF XVBAP-ZXTGG IS INITIAL. MESSAGE |销售凭证:{ XVBAP-VBELN } "行项目:{ XVBAP-POSNR }-附加数据B-交付数据-箱贴规格"未维护值,不允许保存| TYPE 'E'. ENDIF. ENDIF. ENDLOOP. ENDIF. ENDIF.
-
保存后:FORM USEREXIT_SAVE_DOCUMENT(无需求,未做增强)