如何使用BADI修改PO (processing to ME21N )

本文介绍如何使用SAP BADI实现采购订单创建时的后处理功能,具体为从销售订单中继承装运点到采购订单上。通过实施特定BADI并调用后台任务中的BAPI来更新采购订单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Requirement:

Populate EVERS [ Shipping Point ] at the time of purchase order ceration. Shipping point should be derivated from the shipping point on sales order [ if PO created from in reference to a sales order ].


Processing:

This is an example to show - how to achieve post-processing [ follow-on processing ] functionality using BADIs [ Business Add-inn ] or user-exits.

  • Find the relevant BADI using transaction SE18. In this case BADI ME_PURCHDOC_POSTED is used.
  • Further, implement the BADI using transaction SE19.
  • In Attributes section of BADI, define a STATIC attribute as PO_NUMBER. Static means the attribute will keep its value between the calls. This will be checked to ensure that same PO will not be processed twice. Also these kind of user-exits and BADIs might get called recursively and get caught into an infinite loop, if not coded properly. Rememeber that this BADI is at the time of PO save and then you are again trying to change & save the Purchase Order from within the BADI.
  • BAPI to change Purchase Order 'BAPI_PO_CHANGE' will be called IN BACKGROUND TASK to ensure that it will be called when COMMIT WORK is encountered.
  • Don't forget to activate the BADI implementation in SE19.


method IF_EX_ME_PURCHDOC_POSTED~POSTED .

DATA: wa_ekpo like line of IM_EKPO,
      lt_po_item type standard table of BAPIMEPOITEM,
      lt_po_itemx type standard table of BAPIMEPOITEMX,
      wa_po_item type BAPIMEPOITEM,
      wa_po_itemx type BAPIMEPOITEMX,
      lt_return type standard table of BAPIRET2.


*data: ls_ebeln type BAPIMEPOHEADER-PO_NUMBER.

check im_ekko-ebeln ne PO_NUMBER.

PO_NUMBER = im_ekko-ebeln.

LOOP AT IM_EKPO into wa_ekpo.

  wa_po_item-PO_ITEM = wa_ekpo-ebelp.
* EVERS to be derived
  wa_po_item-SHIPPING = 'C'.
  APPEND wa_po_item to lt_po_item .

  wa_po_itemx-PO_ITEM = wa_ekpo-ebelp.
  wa_po_itemx-SHIPPING = 'X'.
  APPEND wa_po_itemx to lt_po_itemx.
ENDLOOP.

 CALL FUNCTION 'BAPI_PO_CHANGE' IN BACKGROUND TASK
   EXPORTING
     purchaseorder                = PO_NUMBER
*    POHEADER                     =
*    POHEADERX                    =
*    POADDRVENDOR                 =
*    TESTRUN                      =
*    MEMORY_UNCOMPLETE            =
*    MEMORY_COMPLETE              =
*    POEXPIMPHEADER               =
*    POEXPIMPHEADERX              =
*    VERSIONS                     =
    NO_MESSAGING                 = 'X'
    NO_MESSAGE_REQ               = 'X'
    NO_AUTHORITY                 = 'X'
    NO_PRICE_FROM_PO             = 'X'
*  IMPORTING
*    EXPHEADER                    =
*    EXPPOEXPIMPHEADER            =
   TABLES
     RETURN                       = lt_return
     POITEM                       = lt_po_item
     POITEMX                      = lt_po_itemx
*    POADDRDELIVERY               =
*    POSCHEDULE                   =
*    POSCHEDULEX                  =
*    POACCOUNT                    =
*    POACCOUNTPROFITSEGMENT       =
*    POACCOUNTX                   =
*    POCONDHEADER                 =
*    POCONDHEADERX                =
*    POCOND                       =
*    POCONDX                      =
*    POLIMITS                     =
*    POCONTRACTLIMITS             =
*    POSERVICES                   =
*    POSRVACCESSVALUES            =
*    POSERVICESTEXT               =
*    EXTENSIONIN                  =
*    EXTENSIONOUT                 =
*    POEXPIMPITEM                 =
*    POEXPIMPITEMX                =
*    POTEXTHEADER                 =
*    POTEXTITEM                   =
*    ALLVERSIONS                  =
*    POPARTNER                    =
           .

endmethod.
来源:http://www.geocities.com/rmtiwari/main.html?http://www.geocities.com/rmtiwari/Resources/MySolutions/Dev/ABAP_nsFAQ.html

<think>好的,用户想在SAP系统中对ME21N事务代码进行采购发票过账保存的增强处理。首先,我需要确认ME21N是否直接涉及发票处理。实际上,ME21N主要用于创建采购订单,而发票校验通常是在MIRO事务中完成的。因此,用户可能混淆了事务代码,需要先明确需求的具体场景。 接下来,用户提到的增强点需要对应正确的BADI或用户出口。根据SAP的标准功能,采购订单的增强通常使用BADIME_PROCESS_PO_CUST或用户出口,例如在程序M06BIF02中的出口。但发票过账的增强应该在MIRO中使用BADI INVOICE_UPDATE,如引用[1]提到的。因此,需要引导用户确认实际需求是处理采购订单还是发票校验。 如果用户确实需要在ME21N中增强,可能的场景是在保存采购订单时触发自定义逻辑。这时需要检查ME21N的增强点,比如使用BADI ME_PROCESS_PO_CUST的CHECK方法,或者查找相关的用户出口。此外,还要考虑隐式增强的可能性,如在保存时调用函数BAPI_PO_CREATE1后进行增强。 还需要提醒用户注意系统版本和可用增强选项,建议通过SE24检查BADI是否存在,并测试代码是否生效。最后,用户可能需要根据实际业务需求调整代码逻辑,如写入日志或更新自定义表。</think>在SAP系统中对ME21N事务代码进行采购发票过账保存的增强处理,可以通过以下步骤实现: ### 一、确定增强类型 建议采用BADI增强方式,因为: 1. ME21N属于采购订单创建事务 2. 发票过账相关逻辑实际发生在MIRO事务中(如引用[1]所述) 3. 若需在采购订单保存时触发逻辑,应使用采购订单保存BADI ### 二、实施步骤 1. **查找BADI**: 通过事务代码SE18查找`ME_PROCESS_PO_CUST` BADI ```abap METHOD if_ex_me_process_po_cust~check. " 采购订单保存前校验逻辑 ENDMETHOD. ``` 2. **用户出口增强**(推荐): 使用采购订单的保存出口: ```abap ENHANCEMENT 1 ZMM_PO_ENHANCE. "版本号 " 在程序M06BIF02中找到USEREXIT_SAVE_DOCUMENT DATA: lv_ebeln TYPE ebeln. lv_ebeln = mekko-ebeln. " 添加自定义逻辑 ENDENHANCEMENT. ``` 3. **隐式增强**: 在函数组MEGUI的`SAVE_DOCUMENT`方法中添加逻辑: ```abap ENHANCEMENT 1 ZMM_PO_SAVE_ENH. "版本号 " 调用BAPI_PO_CREATE1后添加处理逻辑 CALL FUNCTION 'Z_CUSTOM_INVOICE_POSTING' EXPORTING im_ebeln = document->get_ebeln( ). ENDENHANCEMENT. ``` ### 三、注意事项 1. 采购发票校验核心逻辑在MIRO事务中实现(如引用[1]提到的`INVOICE_UPDATE` BADI) 2. 预算检查相关逻辑需结合CJI3等成本报表分析(参考引用[2]) 3. 增强前需通过事务代码SPRO确认标准配置路径: ```路径 SPRO > 物料管理 > 采购 > 采购订单 > 增强 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值