【发布时间】:2016-11-04 14:34:48
【问题描述】:
我正在使用 SAP .NET 连接器 3.0 接收入站 idocs。大多数时候我可以让它们正常工作,但有时收据会出现问题(磁盘已满/数据库连接断开等),而且似乎没有办法向发件人报告收据失败。
抛出异常仍会导致 SAP 中 idoc 的状态为“3”(良好)。
有谁知道如何向来电者报告回执不成功?
示例...
[RfcServerFunction(Name = "IDOC_INBOUND_ASYNCHRONOUS")]
public void ReceiveInboundIdocAsync(RfcServerContext context, IRfcFunction function)
{
throw new Exception("SM59 still reports status 3 for this idoc");
}
【问题讨论】:
-
我没有尝试过,但是在使用 SAP NCo 实现 RFC Server 时,您也需要实现 TransactionIDHandler。该处理程序具有提交和回滚功能。在您的 Commit() 实现中,您从应该提交的事务中获取事务 ID。如果您希望该事务失败,您很可能必须在此时抛出异常,而不是在 Receive 函数期间。至少 NCo 附带的示例代码看起来应该是这样使用的。
-
@DirkTrilsbeek - 异步 idoc 入站似乎不是事务操作。我确实尝试过使用默认 TID 处理程序中的操作,但永远无法让回滚(或提交)到达断点。
-
-- “至少 NCo 附带的示例代码看起来应该是这样使用的。”然后它是糟糕的示例代码......这些函数并不意味着将任何东西(如状态信息)发送回 SAP,它们是为了方便您(或者更确切地说是外部 .NET 程序),它可以自己做家政。 IE。在哪里更新您保存传入 TID 的您自己的数据库。 IE。如果 NCo 调用回滚函数,您应该只在状态数据库中将给定的 TID 标记为回滚。要继续。在下一条评论中...
-
在 Confirm() 中,您可以删除 TID,因为 SAP 系统“承诺”不再使用该 TID,因此不再需要保护自己免受重复。如果您想详细了解 tRFC 协议的实际工作原理,我推荐 wiki.scn.sap.com/wiki/x/FD67Gg(它谈到了 SAP 的 C/C++ RFC 库,但同样的概念也适用于基于 NCo 或 JCo 的程序。)