【问题标题】:How to report failures from RfcServerFunction methods?如何从 RfcServerFunction 方法报告失败?
【发布时间】: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 的程序。)

标签: sap sap-dotnet-connector


【解决方案1】:

您需要区分“tRFC 状态”和“ALE 状态”。

如果您从服务器函数中抛出异常,tRFC 状态应设置为“回滚”,您应该能够在事务 SM58 中验证这一点。你能检查一下吗?

但是,这不会影响 ALE 状态... ALE 基本上是异步的,并且不会等待传输 IDoc 的 tRFC 完成。所以 ALE 状态“03”只表示“IDoc 传输到通信层成功”。通信层(在本例中为 tRFC 层)实际上是否已成功交付 IDoc 或仍在尝试,不会向 IDoc 监视器报告回...

如果你想这样做,你有两个选择:

  1. 有一个可以在 SAP 系统中定期安排的 ALE 报告:RBDMOIND。此报告扫描 tRFC 监视器并将所有 IDoc(其相应 TID 已成功完成)设置为状态“12”。 (tRFC 仍在执行或当前处于“回滚”状态的 IDoc 仍处于“03”状态。)
  2. 您的程序可以定期将 SYSTAT01 IDoc 发送回 SAP 系统。此 IDoc 可用于更新 IDoc 状态监视器。只需用一组 IDoc DOCNUM、“EDI 子系统”的一些信息以及每个 DOCNUM 的所需状态填充它。应使用以下四种状态:“11”(派送时出错)、“12”(派送成功)、“13”(重发成功)、“23”(重发时出错) 为了处理这些 SYSTAT01 IDoc,需要相应地设置 SAP 系统:需要为您的“EDI 子系统”创建逻辑系统和合作伙伴配置文件。该合作伙伴配置文件中的“消息类型”需要为“STATUS”,“流程代码”需要为“STA1”。 然后,管理员可以过滤最终状态为 11/23 的 IDoc 的 ALE 监视器 (WE05) 并手动查看它们。 (并根据需要重新传输。)

【讨论】:

  • 对于消息没有到达外部软件并且没有docnum可以发回的时间,是否有任何收到确认(如#2)?
  • 不行,这只能通过检查SM58来检测。 SYSTAT01 仅适用于那些消息到达外部程序并在那里遇到问题的情况。因此,“解决方案”是将状态“03”不视为“成功状态”,而是视为“错误状态”:如果 IDoc 停留在“03”超过一天,则表示出现问题,管理员需要检查!所以基本上我们有:12 =“一切正常”。 11 = "错误,这里是错误详情"。 03 =“错误,但我不知道,怎么了”...
猜你喜欢
  • 2018-07-04
  • 2012-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
相关资源
最近更新 更多