我有一个C#Web应用程序,它在ASP.net网站中的功能之一处调用多个BAPI和存储过程。如果函数内的方法之一失败,我需要回滚在网络上调用的函数上执行的所有bapi。
在SQL中我可以叫
SqlTransaction transaction = connectionsql.BeginTransaction();
并打电话
transaction.Rollback();
如果其中一种方法失败,则在C#代码上显示。 (这可以针对SQL回滚来完成)
但是对于SAP BAPI,即使我在C#catch语句上调用BAPI_TRANSACTION_ROLLBACK,更改仍然存在。 (回滚不成功)
仅供参考,在我的BAPI函数中,我使用CSAP_MAT_BOM_MAINTAIN来更新BOM表信息。
有什么方法可以对SAP BAPI Function的C#代码执行回滚之类的sql事务,如果网络捕获到异常,也可以回滚在C#上运行的所有BAPI?
最佳答案
你的想法是正确的。理想情况下,您应该能够从ASP.net代码执行以下操作:
呼叫BAPI 1。
呼叫BAPI 2。
等等
如果成功,则调用BAPI_TRANSACTION_COMMIT
,如果错误,则调用BAPI_TRANSACTION_ROLLBACK
。
不幸的是,如果BAPI本身包含一个COMMIT
(许多旧版本和非BAPI功能模块都包含),则您的ROLLBACK
将为时已晚-数据已经提交。
在您的情况下,功能模块CSAP_MAT_BOM_MAINTAIN
包含一个FL_COMMIT_AND_WAIT
参数,但这仅影响COMMIT
是否等待(无论哪种方式仍会发生提交)。但是,可能有一种解决方法:在我的系统的子例程CSAP_MAIN_INIT
(包括LCSAPF01
)中,存在以下代码行:
import flg_no_commit_work from memory id 'CS_CSAP'.
此标志(
flg_no_commit_work
)稍后传递到对功能模块CS_DI_BOM_VB
的调用(从CSAP_MAT_BOM_MAINTAIN
调用),如果已设置,则不执行COMMIT
。也许尝试通过EXPORT TO MEMORY
设置该标志,看看是否有帮助。当然,SAP没有对此文件进行记录和支持,但它可能很好用...