背景:
最近项目上有个需求,需要将A供应商的物资转给B供应商。业务顾问给出的方案时,先将A供应商的物资走542外协转为自有,再将自有物资541转给B供应商,若541转储失败,自动冲销542凭证即可。
问题:
乍一看是个很正常的需求,但是在实际开发完测试的过程中发现了个很奇葩的问题。若物料启用序列号管理,542转储时是正常的,可以成功生成物料凭证。但在调用BAPI进行541自有转外协是会报错:序列号XXX的库存数据不适合移动!
测试:
为确认是否是我BAPI参数传值有问题,我进行了如下测试:
- 在前台MIGO将542转储过账后(通过BAPI过账)的结果进行541自有转外协,可以成功;
- 先在MIGO做542外协转自有,成功过账后,不退出MIGO,切换移动类型为541,直接做541自有转外协,报错:序列号XXX的库存数据不适合移动!;
- 先在MIGO做542外协转自有,成功过账后,退出MIGO,重新进入做541自有转外协,可以成功。
思路:
由测试结果可以推断,我BAPI参数的传值应该是没问题的。我推断可能是有以下几种可能造成的:
- MIGO过账后的数据库表的更新都是在更新进程中的,可能是两次操作的间隔过短,底表的数据还未更新,所以会在第二次过账时报错;(在调用两次BAPI之间等待20S,发现依旧报错,故排除此可能);
- MIGO过账后序列号的某个全局变量没情况,或是有缓存导致的。在BAPI中打了下消息断点,跟了下标准程序,发现报错是在如下位置出现的:
调试发现,EQBS的数据,还是542之前的数据,并不是最新数据,于是找了下EQBS赋值的地方,发现在如下位置:
调试发现:内表gt_eqbs_buf仍是542转储前的数据;由此可见,报错是因为全局内表gt_eqbs_buf没情况导致的。查了下gt_eqbs_buf的引用范围清单,发现了如下函数:
试着在调用BAPI前调用了下这个函数,果然,过账成功了。这种问题说实话,是真没想到的,可能SAP关于序列号这部分的功能还是有些Bug的,毕竟花费我几个小时的时间,值得浅浅记录一下。