Sept15

internal number assignment for Customer

对于客户,不同的account group定义的代码范围和external/internal assign属性是不一样的。外部的还好说,用户给个什么号,存到系统里头就什么号,对于内部自动分配的号码,在save之前是取不到的。

做现在这个XI项目的时候,本来对客户主数据的是写了一个程序,从CDHDR表中找到更改的数据,然后用background job定期下传。这个方法太原始了,做批倒入写个程序比较方便,不过对于正式上线后,还是写个user exits比较合适,因为这写主数据的变化量一般不大,接口程序由用户触发比用后台job触发更节省资源。

不过问题就来了。一开始想当然的考虑用user exits来做,因为对这个比较熟悉。对于主数据的修改的用户出口就只有SAPMF02D.

在用户出口中写好下传的程序,测试了一下,也挺好用的。不过我忽略了一件事情,那就是客户号码的内部分配。所谓内部分配就是由系统按照“帐户组”中定义的号码范围,自动分配号码给新建的主数据。而这两个user exits,都是在保存之前触发的,所以对自动分配的号拿不到。

这个让我太郁闷了,都有找模块顾问让他们把帐户组改成“外部分配”的冲动。后来在网上找到了下面这个BAPI:

BAPI_CUSTOMER_GETINTNUMBER

这个BAPI是用来为内部分配号码准备的,用来取得下一个未分配的号码。看上去可以用这个来搞到我们想要的,其实不然。这个BAPI取得到号码之后就把号码保留了,在user exits中调用的结果就是我们得到的号码比真正生成的号码要小。

最后只能考虑用BAdI:  CUSTOMER_ADD_DATA (SE18, SE19)

在这个BAdI中有SAVE_DATA的方法,不过只有一个传入参数就是KUNNR,我试了一下,这个号码是对的,在这个方法中从数据库是取不到值的,因为还没有保存。只能用CHECK_ALL_DATA这个方法了,保存前的数据可以在这里得到。在BAdI的implement class中增加一个type和一个attribute,用来在方法之间传递数据。

绕了一个大圈终于搞定了。


--EOF--

本篇文章已有0条评论