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 代码中执行以下操作:
- 调用 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 支持,但它可能很好用...
首先您必须检查 BAPI 是否包含 COMMIT WORK
语句。当然这会干扰您的交易处理。
接下来您必须注意正确的会话处理。您已将以下函数调用置于 BAPI 调用周围。
RfcSessionManager.BeginContext()
和
RfcSessionManager.EndContext()
没有这个上下文括号,每个 BAPI 调用都将在不同的上下文中执行。
我有一个 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 代码中执行以下操作:
- 调用 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 支持,但它可能很好用...
首先您必须检查 BAPI 是否包含 COMMIT WORK
语句。当然这会干扰您的交易处理。
接下来您必须注意正确的会话处理。您已将以下函数调用置于 BAPI 调用周围。
RfcSessionManager.BeginContext()
和
RfcSessionManager.EndContext()
没有这个上下文括号,每个 BAPI 调用都将在不同的上下文中执行。