ABAP-增强 BADI ME_PROCESS_PO_CUST OPEN/POST

问题描述:

提到采购订单事务(ME21N/ME22N/ME23N) 的相关的增强,大家首先想到的就是BADI ME_PROCESS_PO_CUST。
那么现在我们有一个需求,需要在显示(或编辑、或创建)一个采购订单时做一些逻辑处理(或校验、或修改抬头行项目),如何实现需求呢?


问题分析:

要完成此需求,我们首先会想到根据事务代码去做判断。但me21/2/3n都是可以通过新建按钮创建采购订单的。如下图,通过me23n新建采购订单。而且当你使用BAPI BAPI_PO_CREATE 创建采购订单时同样会进入此BADI,那么判断事务码很有可能是错的。
在这里插入图片描述


解决方案:

通过观察ME_PROCESS_PO_CUST的几个方法,我们发现OPEN方法(打开采购订单)的IM_TRTYP 参数规定了事务类型(A显示 B编辑 H添加 V更改 L删除等),而OPEN方法在第一次打开采购单主界面时或在通过主界面(ME2XN)上的编辑按钮在显示与编辑模式之间切换时,或者在不同的PO之间进行切换时,就会调用一次。那么我们只需要将这个参数记录下来并在其他方法里使用即可。
memmoryID或许是个好的方案,但我们这里采用另一种方式。

你的BADI实施类属性创建一个私有的(private)实例属性(instance attribute) MD_TRTYP(命名随意,类型 参考IM_TRTYP)。

public:表示全局,在本类内部、外部类、子类都可以访问
private:表示私有的,只有本类内部可以使用
protected:表示受保护的,只有本类或子类或父类中可以访问

在OPEN方法中增加如下逻辑

METHOD if_ex_me_process_po_cust~open.
* define local data
  DATA:
    lo_po          TYPE REF TO cl_po_header_handle_mm,
    ls_header      TYPE mepoheader.

  me->md_trtyp = im_trtyp.  " save transaction type

  IF ( im_trtyp = 'H' ).  " add new purchase order
...

现在你就可以在其他方法里轻易的通过这个私有属性来进行判断了
比如METHOD if_ex_me_process_po_cust~post.

CASE me->md_trtyp.  
    WHEN 'H'.    " add new purchase order
  ...  " do required action for CREATE

    WHEN ... .

    WHEN others.
      ...
  ENDCASE.
...
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值