asp.net 个网页上的 BAPI 函数回滚

BAPI Function Rollback on asp.net web pages

我有一个 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 函数的 C# 代码上执行类似 sql 事务的回滚,并在 Web 捕获异常时回滚 C# 上的所有 BAPI 运行?

你的想法是正确的。理想情况下,您应该能够从 ASP.net 代码中执行以下操作:

  1. 调用 BAPI 1。
  2. 调用 BAPI 2。
  3. 等等
  4. 如果成功,调用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 支持,但它可能很好用...

首先您必须检查 BAPI 是否包含 COMMIT WORK 语句。当然这会干扰您的交易处理。

接下来您必须注意正确的会话处理。您已将以下函数调用置于 BAPI 调用周围。

RfcSessionManager.BeginContext() 

RfcSessionManager.EndContext()

没有这个上下文括号,每个 BAPI 调用都将在不同的上下文中执行。