2

我需要通过 S2S 从 Org A 共享到 Org B 的联系人自动显示在 Org B 中正确的(以前共享的)帐户下。

我的目标是从组织 A 发布帐户 A1 及其相关联系人,并让它们全部自动显示在组织 B 中(无需手动干预),并保留相同的帐户/联系人关系。

我确信我之前已经这样做了,但我最近几次这样做可能是使用自定义主从记录。

有人可以澄清这是否真的可行,还是 S2S 仅支持真正的自定义主从关系?

到目前为止,我已经尝试了手动共享(“转发到连接” - 带有和不带有“转发相关记录”复选框)和自动(通过帐户中的 PartnerNetworkConnection 和/或更新后和/或插入触发器后的联系人)共享。我也尝试过先联系然后帐户,然后再联系帐户。我还尝试检查和取消选中联系人的“自动接受”,甚至取消映射它,天真地希望这会导致

如果我使用触发器自动发送联系人并在 PartnerNetworkRecordConnection 记录上填充 ParentRecordId,则联系人会被共享但不会自动接受,我必须手动将其映射到帐户。如果我在没有指定 ParentRecordId 的情况下共享它,它会自动接受,但没有任何帐户。来自帐户的“转发到连接”和“转发相关记录”复选框似乎做同样的事情 - 帐户和所有子联系人都被转发,但联系人记录不会被自动接受。

我确信 Salesforce-to-Salesforce 处理了这个,但我找不到任何关于它的更多信息。任何人都有一个适用于与相关联系人自动共享和自动接受帐户的配方?

如果是代码疏忽(我非常怀疑),这里是我用来共享联系人的代码。它大致基于“Salesforce 到 Salesforce 的最佳实践”代码示例 (http://wiki.developerforce.com/page/Best_Practices_for_Salesforce_to_Salesforce)

public static void share(List<Contact> triggerNew) {
    // Define connection id
    Id networkId = ConnectionHelper.getConnectionId('Some Partner Connection');

    Set<Id> localContactAccountSet = new Set<Id>();
    List<Contact> localContactSet = new List<Contact>();
    Set<Id> sharedAccountSet = new Set<Id>();

    // only share records created in this org, do not add contacts received from another org.
    for (Contact ct : triggerNew) {
        if (ct.ConnectionReceivedId == null) {
            localContactAccountSet.add(ct.AccountId);
            localContactSet.add(ct);
        }       
    }

    if (localContactAccountSet.size() > 0) {
        List<PartnerNetworkRecordConnection> newConns = new List<PartnerNetworkRecordConnection>();

        // Get the contact account's partner network record connections
        for (PartnerNetworkRecordConnection accountSharingRecord : [SELECT p.Status, p.LocalRecordId, p.ConnectionId FROM PartnerNetworkRecordConnection p WHERE p.LocalRecordId IN :localContactAccountSet]) {
            // for each partner connection record for contact's account, check if it is active 
            if ((accountSharingRecord.status.equalsignorecase('Sent') || accountSharingRecord.status.equalsignorecase('Received')) && (accountSharingRecord.ConnectionId == networkId)) {
                sharedAccountSet.add(accountSharingRecord.LocalRecordId); 
            }
        }

        if (sharedAccountSet.size() > 0) {
            for (Contact ct : localContactSet) {
                if (sharedAccountSet.contains(ct.AccountId)) {
                    PartnerNetworkRecordConnection newConnection =
                      new PartnerNetworkRecordConnection(
                          ConnectionId = networkId,
                          LocalRecordId = ct.Id,
                          SendClosedTasks = false,
                          SendOpenTasks = false,
                          SendEmails = false,
                          ParentRecordId = ct.AccountId);

                    newConns.add(newConnection);
                }
            }

            if (newConns.size() > 0 ) {
               database.insert(newConns);
            }
        }
    }
}
4

1 回答 1

2

更新:问题已解决。

结果发现 Contact 上有一个长期未使用且被遗忘的自定义 Lookup(Account) 字段。删除此字段可解决问题并导致帐户和联系人都被自动接受。

感谢 Salesforce 对此非常迅速的反应,帮助我解决了这个问题。

并且作为一个友好的提醒:子对象上的多个查找关系将阻止自动接受在子对象上发生。这在文档中,但在诊断过程中我没有发生。

于 2012-07-26T02:44:00.260 回答