5

自从我不得不进行 S2S 集成以来,已经发布了几个版本,但我遇到了一个意想不到的问题,希望有人能更有效地解决这个问题。

我有两个组织,通过 S2S 共享联系人。

每个组织中的联系人具有相同的架构,即标准字段和自定义字段。我已经复制了一个只有两个自定义字段的基本案例:复选框字段 A 和 Number(18,0) 字段 B。

组织 1 发布字段 A,并订阅字段 B。

组织 2 订阅字段 A,并发布字段 B。

组织 1 通过通过 S2S 与组织 2 共享联系人来启动所有 S2S 工作流程。组织 2 已启用自动接受。

Org 2 有一个 Contact Before Insert 触发器,它只使用字段 A 来计算字段 B 的值。例如,如果选中字段 A,则使用 2 填充字段 B,如果未选中,则填充 0。(这当然是对我真正需要做的,但这是基本的可重复案例。)

这在组织 2 中一切正常 - 联系人在字段 A 中遇到很好,我看到字段结果被计算到字段 B 中。

问题是结果 - 字段 B - 在下一次联系人更新之前不会自动共享回 Org 1。就像我在组织 2 中编辑同一联系人的非共享字段一样简单,例如“描述”,然后我立即看到字段 B 的先前计算值被推回组织 1。

我假设这是因为,由于字段 B 的计算发生在插入前,S2S 连接假定当前更新事务仅由它自己执行(我可以看到这个逻辑如何防止无限 S2S 更新循环)。

我首先尝试创建一个工作流字段更新,当字段 B 更改时强制更新一个(新的,虚拟的)共享字段,但这仍然没有导致更新回流,大概是因为它位于 Salesforce 认为可以免除 re -分享。还尝试了在字段更改时将潜在客户转发回连接队列的工作流规则,但它也不起作用。

然后,我在 AfterUpdate 触发器中尝试了重新更新语句 - 如果共享字段已更新,则重新加载并重新更新共享对象。那也没用。

我确实找到了一个解决方案,它是由 AfterUpdate 触发器调用的 Future 方法,该方法重新加载并触及其共享字段被 BeforeUpdate 触发器更改的任何记录。这确实会导致现场结果在原始组织中近乎实时地显示。

这个解决方案现在对我有用,但我觉得我必须遗漏一些东西。它导致执行的 Future 调用和 DML 超出了必要的范围。

有没有人对此有更优雅的解决方案?

4

2 回答 2

1

遇到了同样的问题,一位了不起的 Salesforce 支持代表发现了这份文档,其中涵盖了 Salesforce 在此处的具体指导:https ://web.archive.org/web/20210603004222/https://help.salesforce.com/articleView?id=sf .business_network_workflows.htm&type=5

有时使用 Apex 触发器而不是工作流是有意义的。假设您有一个工作流规则,当字段 A 更新时,它会更新辅助字段字段 B。即使您的 Salesforce 到 Salesforce 合作伙伴订阅了字段 A 和 B,由您的工作流规则触发的字段 B 更新也不会发送到您的合作伙伴的组织。这可以防止更新循环。

如果您希望将此类次要字段更新发送到您的 Salesforce 到 Salesforce 合作伙伴,请将工作流替换为使用提交后逻辑更新次要字段的 Apex 触发器。

在双向连接中,Salesforce 到 Salesforce 更新仅在“之后”触发器(例如,“插入之后”或“更新之后”)上触发,而不是在“之前”触发器上。

这就是 OP 最终所做的事情,但来自 Salesforce 的这份文档至少澄清了作为讨论的一部分在这里所做的假设和猜测。它还有助于指出,在这些情况下使用“之前”触发器并不是最佳实践,以供将来参考。

于 2021-06-03T00:49:07.033 回答
0

我认为没有比你正在做的更好的解决方法了。未来标注的限制增加到相当高的水平,这不应该是您的关注点。

可能您可以做的另一件事是(不确定这是否会起作用,因为我们仍然处于相同的上下文中) - 组织 1 - 字段 A 已更新,发布合同

组织 2 - 更新组织 2 中的合同之前;如果 A 已更新 - 将合同的 ID 保存在新的自定义对象中。在更新新自定义对象后,更新给定合同 ID 的字段 B。B 的更新将被发布

于 2013-07-23T13:15:08.920 回答