この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

merge()

3 つまでのレコードを 1 つにマージします。

構文

1MergeResult[]= connection.merge(MergeRequest[] mergeRequests);

使用方法

同じオブジェクト種別のレコードをそのレコードの 1 つにマージし、その他を削除し、そして、関連レコードを再度親にするために、このコールを使用します。各マージ操作は、1 回のトランザクションで行われます。バッチマージは複数のトランザクション (バッチ内の各要素に対して 1 つ) を持っています。

サポートされているオブジェクト種別は、LeadContact および 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:00

SystemModstamp で絞り込むことにより、最も関連するレコードに結果を狭めることが、推奨されるベストプラクティスです。

API バージョン 15.0 以降、文字列を含む項目に値を指定し、値が項目に対して大きすぎる場合、コールは失敗してエラーが返されます。これまでのバージョンの API では、値は切り捨てられ、コールは正常に終了していました。バージョン 15.0 以降でもこの動作を保持する場合、AllowFieldTruncationHeader SOAP ヘッダーを使用してください。

メモ

サンプルコード —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 オブジェクトには、次のプロパティが含まれます。

名前 説明
masterRecord sObject 必須。その他のレコードのマージ先であるオブジェクトの ID を提供する必要があります。状況に応じて、更新される項目とその値を提供してください。
recordToMergeIds ID[] 必須。最小で 1 つ、最大で 2 つ。masterRecord にマージされるその他のレコード。

応答

MergeResult[]