案例:标准逻辑中采购信息记录号是按照供应商和物料获取,现调整为按照供应商+物料+工厂获取采购信息记录号。
发布时间:2025/12/3
-
采购信息记录如下图所示,本案例中需要获取工厂3411对应的采购信息记录号5301306408。

-
在用ME21N,ME22N创建或修改采购订单时,在输入供应商、物料和工厂并回车后,我们可以看到行项目上获取到了采购信息记录号5302788988,并非5301306408。

-
通过事务码ST05跟踪SQL读取情况(这是一个跟踪标准逻辑中数据获取位置的小技巧),找到了标准代码中按照供应商+物料获取到一条采购信息记录号的逻辑。发现获取到的不是我们需要的采购信息记录号,所以通过增强的方式重新获取工厂级采购信息记录号。

-
在BAPI 方法IF_EX_ME_PROCESS_PO_CUST~PROCESS_ITEM中写增强。

源码如下:
METHOD if_ex_me_process_po_cust~process_item.
DATA: ls_mepoitem TYPE mepoitem,
ls_mepoheader TYPE mepoheader,
ls_head TYPE REF TO if_purchase_order_mm.
DATA: lv_msg TYPE string.
DATA:it_eine TYPE STANDARD TABLE OF eine.
ls_mepoitem = im_item->get_data( ).
ls_head = im_item->get_header( ).
ls_mepoheader = ls_head->get_data( ).
CHECK sy-tcode = 'ME21N' OR sy-tcode = 'ME22N' OR sy-tcode = 'ME23N'. "用ME23N进去更改,而事务代码不会变成ME22N.
SELECT *
INTO CORRESPONDING FIELDS OF TABLE it_eine
FROM eine AS e
INNER JOIN eina AS a ON e~infnr = a~infnr
WHERE e~ekorg = ls_mepoheader-ekorg AND e~werks = ls_mepoitem-werks AND e~esokz = ls_mepoitem-pstyp AND e~loekz = ''
AND a~lifnr = ls_mepoheader-lifnr AND a~matnr = ls_mepoitem-matnr AND a~loekz = ''.
IF sy-subrc <> 0.
lv_msg = '物料:' && |{ ls_mepoitem-matnr ALPHA = OUT }| && '供应商:' && |{ ls_mepoheader-lifnr ALPHA = OUT }| && '在工厂:' && ls_mepoitem-werks && '下无采购信息记录!'.
CONDENSE lv_msg NO-GAPS.
mmpur_business_obj_id ls_mepoitem-id.
mmpur_message_forced 'E' 'ZMM01' '999' lv_msg '' '' ''.
CALL METHOD im_item->invalidate( ).
RETURN.
ELSE.
READ TABLE it_eine INTO DATA(ls_infnr) INDEX 1.
ls_mepoitem-infnr = ls_infnr-infnr.
"重写采购信息记录号
CALL METHOD im_item->set_data
EXPORTING
im_data = ls_mepoitem.
ENDIF.
ENDMETHOD.
- 最后看一下增强后的效果吧!获取到了工厂级的采购信息记录号5301306408。

1839

被折叠的 条评论
为什么被折叠?



