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

レコードのマージ

データベースのリード、取引先責任者、取引先レコードが重複している場合、データをクリーンアップしてレコードを統合することをお勧めします。同じ sObject 型のレコードを 3 つまでマージできます。merge 操作は、最大 3 つのレコードを 1 つのレコードにマージし、他のレコードを削除してから、関連レコードを再ペアレント化します。

次に、既存の取引先レコードを主取引先にマージする方法を示します。マージする取引先には、マージ操作後に主取引先レコードに移動される関連取引先責任者があります。また、マージするレコードはマージ後に削除され、1 つのレコードのみがデータベースに残ります。この例では、2 つの取引先のリストを作成してからリストを挿入します。次に、クエリを実行して新規取引先レコードをデータベースから取得し、マージする取引先に取引先責任者を追加します。その後、2 つの取引先をマージします。最後に、取引先責任者が主取引先に移動していて、2 つ目の取引先が削除されていることを確認します。

1swfobject.registerObject("clippy.codeblock-0", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// Insert new accounts
18List<Account> ls = new List<Account>{
19    new Account(name='Acme Inc.'),
20        new Account(name='Acme')
21        };                                        
22insert ls;
23
24// Queries to get the inserted accounts 
25Account masterAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme Inc.' LIMIT 1];
26Account mergeAcct = [SELECT Id, Name FROM Account WHERE Name = 'Acme' LIMIT 1];
27
28// Add a contact to the account to be merged
29Contact c = new Contact(FirstName='Joe',LastName='Merged');
30c.AccountId = mergeAcct.Id;
31insert c;
32
33try {
34    merge masterAcct mergeAcct;
35} catch (DmlException e) {
36    // Process exception
37    System.debug('An unexpected error has occurred: ' + e.getMessage()); 
38}
39
40// Once the account is merged with the master account,
41// the related contact should be moved to the master record.
42masterAcct = [SELECT Id, Name, (SELECT FirstName,LastName From Contacts) 
43              FROM Account WHERE Name = 'Acme Inc.' LIMIT 1];
44System.assert(masterAcct.getSObjects('Contacts').size() > 0);
45System.assertEquals('Joe', masterAcct.getSObjects('Contacts')[0].get('FirstName'));
46System.assertEquals('Merged', masterAcct.getSObjects('Contacts')[0].get('LastName'));
47
48// Verify that the merge record got deleted
49Account[] result = [SELECT Id, Name FROM Account WHERE Id=:mergeAcct.Id];
50System.assertEquals(0, result.size());

この 2 番目の例は前の例と同様ですが、Database.merge メソッド (merge ステートメントではない) を使用する点が異なります。Database.merge の最後の引数は false に設定され、この操作で発生したすべてのエラーが、例外を使用するのではなく、マージ結果で返されるようにします。この例では、2 つの取引先を主取引先にマージし、返された結果を取得します。また、この例では、主取引先と 2 つの複製が作成され、それぞれが 1 つの子取引先責任者を持ちます。これにより、マージ後に取引先責任者が主取引先に移動されることが検証されます。

1swfobject.registerObject("clippy.codeblock-1", "9");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// Create master account
18Account master = new Account(Name='Account1');
19insert master;
20
21// Create duplicate accounts
22Account[] duplicates = new Account[]{
23    // Duplicate account 
24    new Account(Name='Account1, Inc.'),
25    // Second duplicate account
26    new Account(Name='Account 1')
27};
28insert duplicates;
29
30// Create child contact and associate it with first account
31Contact c = new Contact(firstname='Joe',lastname='Smith', accountId=duplicates[0].Id);
32insert c;
33
34
35// Merge accounts into master
36Database.MergeResult[] results = Database.merge(master, duplicates, false);
37
38for(Database.MergeResult res : results) {
39    if (res.isSuccess()) {
40        // Get the master ID from the result and validate it
41        System.debug('Master record ID: ' + res.getId());
42        System.assertEquals(master.Id, res.getId());                
43        
44        // Get the IDs of the merged records and display them
45        List<Id> mergedIds = res.getMergedRecordIds();
46        System.debug('IDs of merged records: ' + mergedIds);                
47        
48        // Get the ID of the reparented record and 
49        // validate that this the contact ID.
50        System.debug('Reparented record ID: ' + res.getUpdatedRelatedIds());
51        System.assertEquals(c.Id, res.getUpdatedRelatedIds()[0]);               
52    }
53    else {
54        for(Database.Error err : res.getErrors()) {
55            // Write each error to the debug output
56            System.debug(err.getMessage());
57        }
58    }
59}

マージに関する考慮事項

sObject レコードをマージする場合、次のルールとガイドラインを考慮する必要があります。
  • リード、取引先責任者、および取引先のみがマージ可能です。DML 操作をサポートしない sObjectを参照してください。
  • 1 つの merge メソッドには、1 つの主レコードと最大 2 つのその他の sObject レコードを渡すことができます。
  • Apex マージ操作を使用すると、主レコードの項目値のほうが、マージされたレコードの対応する項目値よりも常に優先されます。マージされたレコード項目値を維持するには、マージを実行する前に、この項目値を単に主 sObject に設定します。
  • 外部 ID 項目では、merge を使用することはできません。

リード、取引先責任者、および取引先のマージについての詳細は、Salesforce オンラインヘルプを参照してください。