- 在一次批量使用BAPI的功能开发时,在CALL BAPI之后,一般都会判断是否成功,如果成功则执行语句 COMMIT WORK AND WAIT,否则执行语句ROLLBACK WORK,比如:
LOOP AT ITAB.
CALL FUNCITON ‘BAPI_XXX_XXX’.
IF SY-SUBRC = 0.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
ENDIF.
"不管以上成功与否,接下来都要更新自定义表的某些数据
perform update_xxxx.
ENDLOOP.
- 以上看似没问题,但其实在更新自定义表时有的并不成功,也就是根本没有更新。
后来查看COMMIT WORK的说明,其中提到 “COMMIT WORK语句关闭当前SAP LUW(数据库事务),并打开一个新的SAP LUW(数据库事务)”。结合这个提示,再次调试程序发现,当第一次CALL BAPI成功时,执行了一次COMMIT WORK AND WAIT,SAP系统就打开了一个新SAP LUW,然后执行perform update_xxxx更新自定义表,此时并没有立即更新自定义表,需要在COMMIT WORK后或程序运行结束后才会更新,而我并没有在perform update_xxx中使用COMMIT WORK。接下来执行第二次BAPI,由于第二次BAPI不成功,执行了ROLLBACK WORK,会导致第一次的 perform update_xxxx更新自定义表产生了回滚,所以第一次的自定义表没有数据更改。
有的人在每次执行INSERT…,MODIFY…,UPDATE…语句时不管三七二十一都会执行COMMIT WORK。而且只要是更新数据库的语句每次都COMMIT WORK,其实可以在所有更新数据库语句 之后,来个一次性的COMMIT WORK,可以提高程序性能。我不喜欢这么做,因为程序运行完成后数据库会自动更新的,除非程序出现运行时错误。但碰到以上批量循环CALL BAPI 的情况就有必要在更新自定义表的所有语句之后执行一次COMMIT WORK语句了。