问题描述:
提到采购订单事务(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.
...