使用SAP Commit Work时犯的错误

16 篇文章 1 订阅
  • 在一次批量使用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语句了。
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值