一 背景说明
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博客 |
二 实施步骤
参考:https://blog.csdn.net/java_zhong1990/article/details/133642824
2.1 BADI名称 ME_PROCESS_REQ_CUST
2.2 实施BADI,输入Tcode SE19
ZCL_IM_ME_PROCESS_REQ_CUST
三 实施细节
INITIALIZE | ABAP ABAP 代码 | Initializations (Invoked Once Only) |
OPEN | ABAP ABAP 代码 | Open a Purchase Requisition |
PROCESS_HEADER | ABAP ABAP 代码 | Processing of Header Data |
PROCESS_ITEM | ABAP ABAP 代码 | Processing of Item Data |
PROCESS_ACCOUNT | ABAP ABAP 代码 | Processing of Account Assignment Data |
CHECK | ABAP ABAP 代码 | Closing Check |
POST | ABAP ABAP 代码 | Post |
CLOSE | ABAP ABAP 代码 | Closing Processing |
FIELDSELECTION_HEADER_REFKEYS | ABAP ABAP 代码 | Field Selection Reference Key Document Header |
FIELDSELECTION_HEADER | ABAP ABAP 代码 | Special Field Selection Header |
FIELDSELECTION_ITEM_REFKEYS | ABAP ABAP 代码 | Field Selection Reference Key Document Item |
FIELDSELECTION_ITEM | ABAP ABAP 代码 | Special Field Selection Item |
CHECK
获取采购订单行数据
DATA lt_header TYPE mereq_header.
DATA:lt_items TYPE mmpur_requisition_items,
ls_items TYPE mmpur_requisition_item,
ls_item_data TYPE mereq_item,
ls_item TYPE REF TO if_purchase_requisition_item.
lt_header = im_header->get_data( ).
lt_items = im_header->get_items( ).
LOOP AT lt_items INTO ls_items.
ls_item = ls_items-item.
CLEAR ls_item_data.
ls_item_data = ls_item->get_data( ). //获取行中的信息
METHOD if_ex_me_process_req_cust~check.
DATA lt_header TYPE mereq_header.
DATA:lt_items TYPE mmpur_requisition_items,
ls_items TYPE mmpur_requisition_item,
ls_item_data TYPE mereq_item,
ls_item TYPE REF TO if_purchase_requisition_item.
lt_header = im_header->get_data( ).
lt_items = im_header->get_items( ).
DATA:l_flag TYPE c.
DATA:l_flag2 TYPE c."交货日期 用
DATA:l_flag3 TYPE c."数量用
DATA:l_frgkz TYPE eban-frgkz.
DATA:l_frgkz2 TYPE eban-frgkz."已存在的批准标识
DATA:eflag TYPE c.
DATA:eflag2 TYPE c.
DATA:eflag3 TYPE c.
DATA:oflag TYPE c.
l_frgkz = ''.
l_flag = ''.
l_frgkz2 = ''.
l_flag2 = ''.
l_flag3 = ''.
eflag = 0.
eflag2 = 0.
eflag3 = 0.
oflag = 0.
"判断所有行项是否存在已传输
LOOP AT lt_items INTO ls_items.
ls_item = ls_items-item.
CLEAR ls_item_data.
ls_item_data = ls_item->get_data( ).
l_frgkz = ls_item_data-frgkz.
l_frgkz2 = ls_item_data-frgkz.
"判断从P->X 的行项是否为订单已删除行项
IF lfrgkz = 'P' AND l_frgkz2 = 'X'.
SELECT SINGLE loekz INTO @DATA(lloekz) FROM ekpo WHERE bnfpo = @ls_item_data-bnfpo AND banfn = @lt_header-banfn .
IF lloekz = 'L' OR lloekz IS INITIAL .
ELSE.
IF ls_item_data-lfdat <> llfdat OR ls_item_data-menge <> lmenge OR ls_item_data-knttp <> lknttp OR ( lfrgkz = 'P' AND l_frgkz2 = 'X' ).
eflag2 = 1.
ENDIF.
ENDIF.
ENDIF.
"已审批 不可修改交货日期 LFDAT
"IF lfrgkz = 'P'.
"改前改后交货日期不一致则计数
"判断是否已转采购订单
SELECT COUNT(*) INTO @DATA(lcount) FROM ekpo WHERE bnfpo = @ls_item_data-bnfpo AND banfn = @lt_header-banfn AND loekz <> 'L'.
IF lcount > 0."OR ls_item_data-menge <> lmenge OR ( lfrgkz = 'P' AND l_frgkz2 = 'X' )
IF ls_item_data-lfdat <> llfdat OR ls_item_data-knttp <> lknttp .
eflag = 1.
ENDIF.
oflag = 1.
ENDIF.
"ZMM007已传输 不可从P到X
SELECT SINGLE statu,menge,lfdat INTO (@DATA(lstatu),@DATA(lmenge2),@DATA(llfdat2))
FROM ztmm0007 WHERE bnfpo = @ls_item_data-bnfpo AND banfn = @lt_header-banfn.
IF lstatu = 'S'.
IF lfrgkz = 'P' AND l_frgkz2 = 'X' ."lfrgkz <> l_frgkz2 .
MESSAGE e000(zmm01) WITH '项目' && ls_item_data-bnfpo && ':已推送OA不可修改'.
ENDIF.
IF ls_item_data-menge < lmenge2.
MESSAGE e000(zmm01) WITH '项目' && ls_item_data-bnfpo && ':数量小于已传输OA的数量'.
ENDIF.
IF ls_item_data-lfdat < llfdat2.
MESSAGE e000(zmm01) WITH '项目' && ls_item_data-bnfpo && ':交货日期小于已传输OA的交货日期'.
ENDIF.
ENDIF.
CLEAR:lstatu.
CLEAR:lcount,lloekz.
CLEAR:lmenge2,llfdat2.
CLEAR:lfrgkz,llfdat,lmenge,lknttp.
ENDLOOP.
IF oflag = 1.
IF eflag = 1.
MESSAGE '采购申请已转单' TYPE 'E'."采购订单不可修改
ENDIF.
ENDIF.
IF eflag2 = 1.
MESSAGE '采购申请已审批不可修改' TYPE 'E'.
ENDIF.
ENDMETHOD.