在项目上遇到了要同时用BAPI和BDC更新数据的情况。开发的需求如下:
ME22N中
修改采购订单中物料条目的净价和每,然后在物料数据页的供应商物料号中记录旧价格和旧每,同时在EAN/UPC中写入'ZSJ'。

 
大部分的更新都可以由BAPI完成,但是EAN/UPC在BAPI中找不到对应的字段,而且客户不愿意改字段。一开始看到ME22N这种多条目的事务代码,觉得BDC录屏没法做,但是其实是可以做的,只是比较麻烦。
下面一点点总结分享。

BDC部分:

BDC录屏后,得到的结果基本是没法直接用的,我是通过录了很多次屏,然后东拼西凑、修修改改得出来的。

录屏的操作流程:其他采购订单->输入采购订单号->确定->项目点击下拉列表选择行项目->修改EAN/UPC->保存,得到的录屏结果如下 :

 

 

直接录屏的结果是没法用的,必须把红色下划线的部分去掉,保留反而会出错。这些是录屏的时候记录下来的屏幕上一些字段的值,但在程序操作调用BDC的过程中,你无法知道这些字段的具体值是多少,填不对的话反而会出错,所以要去掉。

而且在填写BDC_FIELD的时候,带BDC_SUBSCR的部分都可以不填写,只要填写一些关于操作和字段赋值的部分就可以了。

BDC调试:

BDC需要调试的话就设置模式MODE为A,这样就可以观看前台是怎么样一步一步执行的,便于发现错误。MODE为E是只有发生错误才转到前台,而MODE为N是完全的后台操作。一般先用A或E确认能执行成功后再换成N来执行。

BDC代码:

 

总结下BDC的适用范围:

BDC适用于录制较为单一的操作,并且一般情况下不适用于多条行项目,但是也有例外。在一些特殊的事物代码中,对于行项目的修改也能是一组比较单一的操作,比如ME22N就是每次选择下拉列表,然后修改相应的字段。所以有时候BDC录屏是一件需要业务顾问、技术顾问一起做、互相配合的事。

BAPI部分:

由于SAP各个表之间的关联关系非常复杂,一个前台操作可能同时更新了N张表,所以ABAP中严禁直接更新标准表,这会导致不一致性。而为了保持一致性,需要更新和修改的时候则需要使用BAPI。

BAPI与BDC相比,执行速度会快些、效率会高些,而且比较适合用来更新修改多条行项目的数据。

BAPI中值得一提的是它的X参数,参数明后代X后缀的参数标示了需要更新哪些相应的字段,所以必须对X参数中需要更新的字段赋值为 X ,否则BAPI并不会更新任何字段。

X参数:

 

对需要更新的字段赋值:

 

另外ABAP中能够支持多个BAPI连续调用,然后同时COMMIT或是ROLLBACK,以此来保证一致性。只需要再调用完BAPI后再调用BAPI_TRANSACTION_COMMIT或是BAPI_TRANSACTION_ROLLBACK。

 

值得一提的是BAPI_TRANSACTION_COMMIT的WAIT参数。注意:BAPI是异步更新的,所以如果不使用WAIT参数的话,那么它无法保证在执行下条语句时BAPI已经更新成功,这样如果连续两条语句都是写操作,有很大可能会造成读写冲突,比如:我在BAPI执行完后调用BDC,如果不WAIT的话,那么就会有读写冲突,BAPI锁住了一些表或是资源导致BDC无法更新。