一 背景说明
1.1 BADI的概念
SAP BADI(Business Application Development Interface)是SAP在标准程序中为客户自定义逻辑所预留的接口(属于第三代增强),在技术本质上是一个interface,通过实现类的向上继承,完成用户逻辑的调用。
1.2 BADI清单
采购申请创建 | 采购订单创建 | 采购订单审批 | 采购订单收货 | 采购发票校验
生产订单收货 |
采购申请创建 | ME_PROCESS_REQ_CUST | SAP_MM_ABAP_BADI清单案例教程——PR采购申请创建_ME_PROCESS_REQ_CUST_ME51N_Terry谈企业数字化的博客-CSDN博客 |
采购订单创建 | ME_PROCESS_PO_CUST | SAP_MM_ABAP_BADI清单案例教程——PO采购订单创建_ME_PROCESS_PO_CUST_ME21N-CSDN博客 |
采购订单审批 | ZME_PURCHDOC_POSTED | SAP_MM_ABAP_BADI清单案例教程——PO采购订单审批_ME_PURCHDOC_POSTED_ME29N-CSDN博客 |
采购订单收货 | MB_MIGO_BADI | SAP_MM_ABAP_BADI清单案例教程——PO采购订单收货_MB_MIGO_BADI_MIGO_Terry谈企业数字化的博客-CSDN博客 |
采购发票校验 | INVOICE_UPDATE | SAP_MM_ABAP_BADI清单案例教程——PO采购发票校验_INVOICE_UPDATE_MIRO-CSDN博客 |
生产订单收货 | ZMB_DOCUMENT_BADI | SAP_MM_ABAP_BADI清单案例教程——生产订单收货_MB_DOCUMENT_BADI_MB1B_Terry谈企业数字化的博客-CSDN博客 |
二 实施步骤
2.1 BADI名称 MB_DOCUMENT_BADI
2.2 实施BADI,输入Tcode SE19
三 实施细节
MB_DOCUMENT_BEFORE_UPDATE | ABAP ABAP 代码 | Exit After Writing a Material Document. Not in 'update task' |
MB_DOCUMENT_UPDATE | ABAP ABAP 代码 | When Writing a Material Document. In 'Update task' |
MB_DOCUMENT_BEFORE_UPDATE
method IF_EX_MB_DOCUMENT_BADI~MB_DOCUMENT_BEFORE_UPDATE.
*** TYPES: BEGIN OF WS_MESSAGE ,"返回消息
*** MSGID LIKE SY-MSGID,
*** MSGTY LIKE SY-MSGTY,
*** MSGNO LIKE SY-MSGNO,
*** MSGV1 LIKE SY-MSGV1,
*** MSGV2 LIKE SY-MSGV2,
*** MSGV3 LIKE SY-MSGV3,
*** MSGV4 LIKE SY-MSGV4,
*** LINENO TYPE MESG-ZEILE,
*** END OF WS_MESSAGE.
*** DATA IT_MESSAGE TYPE STANDARD TABLE OF WS_MESSAGE .
*** DATA WA_MESSAGE TYPE WS_MESSAGE.
*** DATA: L_MSG TYPE STRING.
*** CLEAR:WA_MESSAGE,IT_MESSAGE[].
***
***
*** LOOP AT xmseg INTO DATA(l_mseg) .
*** SELECT SINGLE * FROM mbew INTO @DATA(l_mbew) WHERE bwkey = @l_mseg-werks AND matnr = @l_mseg-matnr AND vprsv = 'S'.
*** IF sy-subrc = 0.
*** IF l_mseg-mat_pspnr IS INITIAL.
*** IF l_mbew-bwkey = l_mseg-werks AND l_mbew-stprs EQ 0.
**** WA_MESSAGE-MSGID = '00'.
**** WA_MESSAGE-MSGTY = 'E'.
**** WA_MESSAGE-MSGNO = '001'.
**** WA_MESSAGE-MSGV1 = l_mseg-LINE_ID.
**** WA_MESSAGE-MSGV2 = '物料标准价为0,不允许移动!'.
**** WA_MESSAGE-MSGV3 = ''.
**** WA_MESSAGE-MSGV4 = ''.
**** DESCRIBE TABLE IT_MESSAGE LINES WA_MESSAGE-LINENO.
**** WA_MESSAGE-LINENO = WA_MESSAGE-LINENO + 1.
**** APPEND WA_MESSAGE TO IT_MESSAGE.
***
*** CONCATENATE '行项目' l_mseg-LINE_ID '不允许移动!' INTO L_MSG.
**** MESSAGE E895(M7) WITH L_MSG .
**** MESSAGE E001(00) WITH L_MSG .
***exit.
***
***
*** ENDIF.
*** ELSE.
*** SELECT SINGLE feh_sta FROM keko INTO @DATA(feh_sta) WHERE matnr = @l_mseg-matnr AND werks = @l_mseg-werks AND pspnr = @l_mseg-mat_pspnr.
*** IF feh_sta IS INITIAL OR feh_sta NE 'VO' .
***
*** WA_MESSAGE-MSGID = '00'.
*** WA_MESSAGE-MSGTY = 'E'.
*** WA_MESSAGE-MSGNO = '001'.
*** WA_MESSAGE-MSGV1 = l_mseg-LINE_ID.
*** WA_MESSAGE-MSGV2 = '项目物料价格为0,不允许移动!'.
*** WA_MESSAGE-MSGV3 = ''.
*** WA_MESSAGE-MSGV4 = ''.
*** DESCRIBE TABLE IT_MESSAGE LINES WA_MESSAGE-LINENO.
*** WA_MESSAGE-LINENO = WA_MESSAGE-LINENO + 1.
*** APPEND WA_MESSAGE TO IT_MESSAGE.
*** CONCATENATE '行项目' l_mseg-LINE_ID '不允许移动!' INTO L_MSG.
***
**** MESSAGE E895(M7) WITH L_MSG .
**** exit.
***
*** ENDIF.
*** ENDIF.
*** ENDIF.
*** ENDLOOP.
***
***
**** IF IT_MESSAGE[] IS NOT INITIAL.
**** CALL FUNCTION 'C14Z_MESSAGES_SHOW_AS_POPUP'
**** TABLES
**** I_MESSAGE_TAB = IT_MESSAGE.
****
**** RETURN.
**** ENDIF.
endmethod.