外部キーを使用して 1 つのステートメントで親レコードと子レコードを作成する
外部キーとして外部 ID 項目を使用することによって、最初に親レコードを作成して、その ID をクエリしてから子レコードを作成するのではなく、他の種別の sObject の親レコードおよび子レコードを 1 つの手順で作成することができます。手順は、次のとおりです。
- 子 sObject を作成し、必須項目 (必要に応じて、その他の項目) を入力します。
- 子 sObject に対する親外部キー参照を設定するためにのみ使用される、親参照 sObject を作成します。この sObject には定義された外部 ID 項目のみがあり、その他の項目は設定されません。
- 作成した親参照 sObject に子 sObject の外部キー項目を設定します。
- insert ステートメントに渡すその他の親 sObject を作成します。この sObject には、外部 ID 項目に加えて、必須項目 (必要に応じて、その他の項目) を設定する必要があります。
- 作成する sObject の配列を渡して、insert をコールします。親 sObject は配列の子 sObject の前に付ける必要があります、つまり、親の配列インデックスは子のインデックスより小さい必要があります。
最大 10 レベルの深度で関連レコードを作成できます。また、1 回のコールで作成される関連レコードには、他の種別の sObject が必要です。詳細は、『SOAP API 開発者ガイド』の「オブジェクト種別が異なるレコードの作成」を参照してください。
次の例では、1 回の insert ステートメントで親取��先に関連する商談を作成する方法を示します。この例では、商談 sObject を作成し、その項目のいくつかに入力してから、2 つの取引先オブジェクトを作成します。最初の取引先は外部キーリレーションのみであり、2 番目の取引先は取引先作成のためのものであり、取引先項目が設定されています。両方の取引先には外部 ID 項目 MyExtID__c が設定されています。次に、このサンプルでは、sObject の配列を渡して、Database.insert をコールします。配列の最初の要素は親 sObject で、2 番目は商談 sObject です。Database.insert ステートメントでは、1 つの手順で商談とその親取引先を作成します。最後に、このサンプルでは、結果を確認し、作成されたレコードの ID をデバッグログに書き込むか、レコードの作成が失敗した場合は最初のエラーを書き込みます。このサンプルでは、MyExtID という取引先に外部 ID テキスト項目が必要です。
1public class ParentChildSample {
2 public static void InsertParentChild() {
3 Date dt = Date.today();
4 dt = dt.addDays(7);
5 Opportunity newOpportunity = new Opportunity(
6 Name='OpportunityWithAccountInsert',
7 StageName='Prospecting',
8 CloseDate=dt);
9
10 // Create the parent reference.
11 // Used only for foreign key reference
12 // and doesn't contain any other fields.
13 Account accountReference = new Account(
14 MyExtID__c='SAP111111');
15 newOpportunity.Account = accountReference;
16
17 // Create the Account object to insert.
18 // Same as above but has Name field.
19 // Used for the insert.
20 Account parentAccount = new Account(
21 Name='Hallie',
22 MyExtID__c='SAP111111');
23
24 // Create the account and the opportunity.
25 Database.SaveResult[] results = Database.insert(new SObject[] {
26 parentAccount, newOpportunity });
27
28 // Check results.
29 for (Integer i = 0; i < results.size(); i++) {
30 if (results[i].isSuccess()) {
31 System.debug('Successfully created ID: '
32 + results[i].getId());
33 } else {
34 System.debug('Error: could not create sobject '
35 + 'for array element ' + i + '.');
36 System.debug(' The error reported was: '
37 + results[i].getErrors()[0].getMessage() + '\n');
38 }
39 }
40 }
41}