組織 A から組織 B に S2S 経由で共有された連絡先が、正しい (以前に共有されていた) アカウントの下で組織 B に自動的に表示されるようにする必要があります。
私の目標は、組織 A からアカウント A1 とそれに関連する取引先責任者を公開し、同じ取引先/取引先責任者の関係を維持したまま、それらすべてを組織 B に自動的に表示することです (手動の介入は必要ありません)。
これは以前にも行ったことがあると確信していましたが、最近数回行ったのはカスタムのマスター/詳細レコードであった可能性があります。
これが実際に可能かどうかを明確にすることはできますか?それとも、S2S は真のカスタム マスター/ディテール関係に対してのみこれをサポートしますか?
これまでのところ、手動共有(「接続に転送」-「関連レコードの転送」チェックボックスの有無にかかわらず)と自動(更新後および/または挿入トリガー後のアカウントおよび/または連絡先のPartnerNetworkConnectionを介した)共有の両方を試しました。また、連絡先とアカウント、およびアカウントと連絡先の両方を試しました。また、連絡先の「自動受け入れ」をチェックしてチェックを外し、マッピングを解除することさえ試みました。
トリガーを使用して連絡先を自動送信し、PartnerNetworkRecordConnection レコードに ParentRecordId を設定すると、連絡先は共有されますが自動承認されず、手動で取引先にマッピングする必要があります。ParentRecordId を指定せずに共有すると、自動的に承認されますが、アカウントはありません。アカウントからの「関連レコードの転送」チェックボックスを使用した「接続への転送」チェックボックスは同じことを行うようです - アカウントとすべての子連絡先は転送されますが、連絡先レコードは自動的に受け入れられません。
Salesforce-to-Salesforce がこれを処理したと確信していましたが、それ以上の情報は見つかりませんでした。関連する連絡先との自動共有および自動承認アカウントで機能するレシピを持っている人はいますか?
それがコードの見落としである場合(私はそれを非常に疑っています)、連絡先を共有するために使用するコードを次に示します. 「Salesforce to 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);
}
}
}
}