merge()
3 つまでのレコードを 1 つにマージします。
構文
1MergeResult[]= connection.merge(MergeRequest[] mergeRequests);使用方法
同じオブジェクト種別のレコードをそのレコードの 1 つにマージし、その他を削除し、そして、関連レコードを再度親にするために、このコールを使用します。各マージ操作は、1 回のトランザクションで行われます。バッチマージは複数のトランザクション (バッチ内の各要素に対して 1 つ) を持っています。
サポートされているオブジェクト種別は、Lead、Contact および Account のみです。
masterRecord 項目は、他のレコードのマージ先である親レコードがどれであるかを示します。マージ中に削除されたレコードを表示させるために、queryAll() を使用可能です。
主レコード内の値より優先される主レコード以外のレコードからの項目値があるかをマージコールの前に決定することを、このコールは要求します。そのため、項目名とその新しい値は、更新のコールの場合と同様に、MergeRequest の masterRecord に設定する必要があります。
- 1 つの SOAP コール内に、最大 200 件のマージ要求を作成可能です。
- 親レコードを含めて、最大 3 つのレコードが 1 つの要求にマージ可能です。これは、Salesforce のユーザインターフェースと同じ制限です。マージするレコードが 3 つ以上ある場合は、エラー防止のために各要求内で同じ masterRecord を使用します。
- 外部 ID 項目では、merge() を使用することはできません。
指定の時間内にマージされたすべてのレコードを見つけるには、次に示すような SELECT ステートメントと一緒に queryAll() を使用します。
1SELECT Id FROM Contact WHERE isDeleted=true and masterRecordId != null
2 AND SystemModstamp > 2006-01-01T23:01:01+01:00SystemModstamp で絞り込むことにより、最も関連するレコードに結果を狭めることが、推奨されるベストプラクティスです。
サンプルコード —Java
このサンプルでは、1 つの取引先を主取引先とマージします。2 つの取引先を作成し、主取引先とマージするというメモを取引先に添付します。マージ後、マージされた取引先の ID および更新された子レコードの数を書き込みます。この場合、更新された子レコードの数は 1 です。マージされた取引先のメモが主取引先に移動したためです。
1public Boolean mergeRecords() {
2 Boolean success = false;
3 // Array to hold the results
4 String[] accountIds = new String[2];
5 try {
6 // Create two accounts to merge
7 Account[] accounts = new Account[2];
8 Account masterAccount = new Account();
9 masterAccount.setName("MasterAccount");
10 masterAccount.setDescription("The Account record to merge with.");
11 accounts[0] = masterAccount;
12 Account accountToMerge = new Account();
13 accountToMerge.setName("AccountToMerge");
14 accountToMerge
15 .setDescription("The Account record that will be merged.");
16 accounts[1] = accountToMerge;
17 SaveResult[] saveResults = connection.create(accounts);
18
19 if (saveResults.length > 0) {
20 for (int i = 0; i < saveResults.length; i++) {
21 if (saveResults[i].isSuccess()) {
22 accountIds[i] = saveResults[i].getId();
23 System.out.println("Created Account ID: "
24 + accountIds[i]);
25 } else {
26 // If any account is not created,
27 // print the error returned and exit
28 System.out
29 .println("An error occurred while creating account."
30 + " Error message: "
31 + saveResults[i].getErrors()[0].getMessage());
32 return success;
33 }
34 }
35 }
36
37 // Set the Ids of the accounts
38 masterAccount.setId(accountIds[0]);
39 accountToMerge.setId(accountIds[1]);
40
41 // Attach a note to the account to be merged with the master,
42 // which will get re-parented after the merge
43 Note note = new Note();
44 System.out.println("Attaching note to record " +
45 accountIds[1]);
46 note.setParentId(accountIds[1]);
47 note.setTitle("Merged Notes");
48 note.setBody("This note will be moved to the "
49 + "MasterAccount during merge");
50 SaveResult[] sRes = connection.create(new SObject[] { note });
51 if (sRes[0].isSuccess()) {
52 System.out.println("Created Note record.");
53 } else {
54 Error[] errors = sRes[0].getErrors();
55 System.out.println("Could not create Note record: "
56 + errors[0].getMessage());
57 }
58
59 // Perform the merge
60 MergeRequest mReq = new MergeRequest();
61 masterAccount.setDescription("Was merged");
62 mReq.setMasterRecord(masterAccount);
63 mReq.setRecordToMergeIds(new String[] { saveResults[1].getId() });
64 MergeResult mRes = connection.merge(new MergeRequest[] { mReq })[0];
65
66 if (mRes.isSuccess())
67 {
68 System.out.println("Merge successful.");
69 // Write the IDs of merged records
70 for(String mergedId : mRes.getMergedRecordIds()) {
71 System.out.println("Merged Record ID: " + mergedId);
72 }
73 // Write the updated child records. (In this case the note.)
74 System.out.println(
75 "Child records updated: " + mRes.getUpdatedRelatedIds().length);
76 success = true;
77 } else {
78 System.out.println("Failed to merge records. Error message: " +
79 mRes.getErrors()[0].getMessage());
80 }
81 } catch (ConnectionException ce) {
82 ce.printStackTrace();
83 }
84 return success;
85}サンプルコード —C#
このサンプルでは、1 つの取引先を主取引先とマージします。2 つの取引先を作成し、主取引先とマージするというメモを取引先に添付します。マージ後、マージされた取引先の ID および更新された子レコードの数を書き込みます。この場合、更新された子レコードの数は 1 です。マージされた取引先のメモが主取引先に移動したためです。
1public Boolean mergeRecords()
2{
3 Boolean success = false;
4 // Array to hold the results
5 String[] accountIds = new String[2];
6 try
7 {
8 // Create two accounts to merge
9 Account[] accounts = new Account[2];
10 Account masterAccount = new Account();
11 masterAccount.Name = "MasterAccount";
12 masterAccount.Description = "The Account record to merge with.";
13 accounts[0] = masterAccount;
14 Account accountToMerge = new Account();
15 accountToMerge.Name = "AccountToMerge";
16 accountToMerge
17 .Description = "The Account record that will be merged.";
18 accounts[1] = accountToMerge;
19 SaveResult[] saveResults = binding.create(accounts);
20
21 if (saveResults.Length > 0)
22 {
23 for (int i = 0; i < saveResults.Length; i++)
24 {
25 if (saveResults[i].success)
26 {
27 accountIds[i] = saveResults[i].id;
28 Console.WriteLine("Created Account ID: "
29 + accountIds[i]);
30 }
31 else
32 {
33 // If any account is not created,
34 // print the error returned and exit
35 Console.WriteLine("An error occurred while creating account."
36 + " Error message: "
37 + saveResults[i].errors[0].message);
38 return success;
39 }
40 }
41 }
42
43 // Set the Ids of the accounts
44 masterAccount.Id = accountIds[0];
45 accountToMerge.Id = accountIds[1];
46
47 // Attach a note to the account to be merged with the master,
48 // which will get re-parented after the merge
49 Note note = new Note();
50 Console.WriteLine("Attaching note to record " +
51 accountIds[1]);
52 note.ParentId = accountIds[1];
53 note.Title = "Merged Notes";
54 note.Body = "This note will be moved to the "
55 + "MasterAccount during merge";
56 SaveResult[] sRes = binding.create(new sObject[] { note });
57 if (sRes[0].success)
58 {
59 Console.WriteLine("Created Note record.");
60 }
61 else
62 {
63 Error[] errors = sRes[0].errors;
64 Console.WriteLine("Could not create Note record: "
65 + errors[0].message);
66 }
67
68 // Perform the merge
69 MergeRequest mReq = new MergeRequest();
70 masterAccount.Description = "Was merged";
71 mReq.masterRecord = masterAccount;
72 mReq.recordToMergeIds = new String[] { saveResults[1].id };
73 MergeResult mRes = binding.merge(new MergeRequest[] { mReq })[0];
74
75 if (mRes.success)
76 {
77 Console.WriteLine("Merge successful.");
78 // Write the IDs of merged records
79 foreach (String mergedId in mRes.mergedRecordIds)
80 {
81 Console.WriteLine("Merged Record ID: " + mergedId);
82 }
83 // Write the updated child records. (In this case the note.)
84 Console.WriteLine(
85 "Child records updated: " + mRes.updatedRelatedIds.Length);
86 success = true;
87 }
88 else
89 {
90 Console.WriteLine("Failed to merge records. Error message: " +
91 mRes.errors[0].message);
92 }
93 }
94 catch (SoapException e)
95 {
96 Console.WriteLine("An unexpected error has occurred: " +
97 e.Message + "\n" + e.StackTrace);
98 }
99 return success;
100}引数
このコールは MergeRequest オブジェクトの配列を受け取ります。MergeRequest オブジェクトには、次のプロパティが含まれます。