我有一个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没有对此文件进行记录和支持,但它可能很好用...

08-06 18:59