一 背景说明
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名称 INVOICE_UPDATE
2.2 实施BADI,输入Tcode SE19
三 实施细节
CHANGE_AT_SAVE | ABAP ABAP 代码 | Invoice Document at Save |
CHANGE_BEFORE_UPDATE | ABAP ABAP 代码 | Invoice Document Before Update |
CHANGE_IN_UPDATE | ABAP ABAP 代码 | Invoice Document During Update |
CHANGE_AT_SAVE
3.1 代码样例
METHOD if_ex_invoice_update~change_at_save.
DATA(lv_code) = sy-tcode .
IF s_rbkp_new-lifnr IS NOT INITIAL AND lv_code = 'MIR7'.
LOOP AT ti_rseg_new ASSIGNING FIELD-SYMBOL(<fs_rseg>) .
SELECT SINGLE
rbkp~belnr
INTO @DATA(lv_belnr)
FROM rbkp
INNER JOIN rseg ON rbkp~belnr = rseg~belnr AND rbkp~gjahr = rseg~gjahr
WHERE rbkp~lifnr = @s_rbkp_new-lifnr
AND rseg~werks = @<fs_rseg>-werks "20210810 加入工厂作为判断条件
AND rbkp~rbstat = 'A' .
IF sy-subrc = 0.
MESSAGE e899(v1) WITH '该供应商已存在未过账预制发票,请先联系财务校对并过账,该预制凭证号为:' && lv_belnr .
ENDIF .
ENDLOOP .
ENDIF .
***MIR7/MIRO保存时,将屏幕字段付款方式设置为必填
IF lv_code = 'MIR7' OR lv_code = 'MIRO' .
IF s_rbkp_new-zlsch IS INITIAL .
MESSAGE e899(v1) WITH '付款方式设置为必填' .
ENDIF .
ENDIF .
*"20221123 MIR7分配号输入检验
DATA len TYPE i.
IF lv_code = 'MIR7' OR lv_code = 'MIR4'.
len = strlen( s_rbkp_new-zuonr ).
IF len > 0.
IF s_rbkp_new-zuonr+0(len) CA space .
MESSAGE e899(v1) WITH '分配号存在空格,请检查' .
ENDIF.
ENDIF.
ENDIF.
***MIR7/MIRO保存时,增强检查该供应商,通过输入的采购订单检查采购订单的付款条件(EKKO- ZTERM)是否一致
IF lv_code = 'MIR7' OR lv_code = 'MIRO' .
IF ti_rseg_new[] IS NOT INITIAL .
SELECT zterm
INTO TABLE @DATA(lt_zterm)
FROM ekko
FOR ALL ENTRIES IN @ti_rseg_new
WHERE ebeln = @ti_rseg_new-ebeln .
LOOP AT lt_zterm ASSIGNING FIELD-SYMBOL(<fs_zterm>).
LOOP AT lt_zterm ASSIGNING FIELD-SYMBOL(<fs_zterm2>) WHERE zterm <> <fs_zterm>-zterm .
MESSAGE e899(v1) WITH '采购订单的付款条件不一致' .
ENDLOOP .
ENDLOOP .
ENDIF .
ENDIF .
CLEAR lv_code .
ENDMETHOD.
3.2 效果