[SFDC][Bulk]レコードIDでリレーション指定するときに混乱した話

取り急ぎめも。BulkAPIで、SalesforceのレコードIDを使ってリレーション指定したかった。

■ID項目を使ってリレーション張るときは項目名そのまま指定でOK

  1. カスタムオブジェクト:History__cがある
  2. History__cには、標準オブジェクト:Accountへの主従関係項目「取引先」がある。
    API参照名:Account__c

Bulk APIでHistory__cに対してUpsertするとき、CSVヘッダ行の「取引先」列には「Account__c」と指定し、AccountオブジェクトのIDを書くと成功した。

■試した方法と結果

以下の各名称をCSVヘッダ行の「取引先」列に指定した。値はAccountのレコードID(ID項目の値)を書き込んだ。

  1. 「Account__c」→成功。
  2. 「Account__c.id」→バッチ登録失敗。
  3. 「Account__c.AccountId」→上と同じ。バッチ登録失敗。
  4. 「Account__r.AccountId」→上ふたつと同じ。バッチ登録失敗。
  5. 「Account__r.id」→バッチ登録は成功するも、その項目は外部キーではありませんエラー。結果取り込み失敗

最初、「Account__r.id」て書いて「外部IDじゃない」って言われてすごい焦ったけど普通に項目のAPI参照名をそのまま指定すれば良いだけだった。気持ちが焦ると変なつまずきが増える。ブログでも書いて落ち着かないと。

(参考)BulkAPI開発者ガイド(win13)20ページの記載
http://developerforcejp.s3.amazonaws.com/developer/docs/api_asynch/api_bulk.pdf
以下引用

ヘッダー行のリレーション項目
Salesforceのオブジェクトの多くは、別のオブジェクトに関連付けられています。たとえば、取引先は取引先責任者の親オブジェクトです。CSV ファイルでは、列ヘッダーでリレーションを示すことにより、関連付けられたオブジェクトへの参照を追加できます。Bulk API でレコードを処理する場合、CSV ファイルの列ヘッダーでRelationshipName.IndexedFieldName という構文を使用して、オブジェクトとその親オブジェクトのリレーションを記述します。RelationshipName は項目のリレーション名、IndexedFieldName は親レコードを一意に識別するインデックス化された項目の名前を示します。リレーション名を確認するには、SOAP ベースの SOAPAPI で、describeSObjects() コールを使用して項目の relationshipName プロパティの値を取得します。
別のオブジェクトではなく、同じオブジェクトに関連付けられるというケースもあります。たとえば、取引先責任者の [上司] 項目は、別の取引先責任者を参照します。このような場合、列ヘッダーでReportsTo.Emailと記述すると、[メール] 項目の値に基づいて、各取引先責任者の [上司] 項目を一意に識別できます。列ヘッダーのCSV ファイルの準備ReportsTo の部分は、[上司] 項目の relationshipName プロパティの値です。リレーションを使用した CSVファイルの例を次に示します。
FirstName,LastName,ReportsTo.Email
Tom,Jones,buyer@salesforcesample.com

CSV ファイルのヘッダー行でリレーションを参照する場合は、次の点に注意します。
• 子から親へのリレーションを使用できます。親から子へのリレーションは使用できません。
• 子から親へのリレーションを拡張して使用することはできません。つまり、子から親へのリレーションを参照し、さらに親からその親へのリレーションを参照することはできません。
• 親の識別では、インデックス化された項目のみを使用できます。カスタム項目は、外部 ID 属性が選択されている外部 ID項目である場合、インデックス化されています。標準項目は、idLookupプロパティの値がtrueに設定されている場合、インデックス化されています。詳細は、「標準オブジェクト」で、各オブジェクトの項目リストの「項目のプロパティ」列を参照してください。

カスタムオブジェクトのリレーション項目
カスタムオブジェクトでは、カスタム項目を使用してオブジェクト間のリレーションを追跡します。2 つのカスタムオブジェクト間のリレーションを示すには、__r (アンダースコア 2 つと「r」) で終わるリレーション名を使用します。列ヘッダーでこのリレーションを指定して、関連オブジェクトへの参照を追加できます。

たとえば、子オブジェクトに、あるカスタムオブジェクトを親として参照するMother_Of_Child__cというAPI参照名を持つカスタム項目があり、親となるオブジェクトに External_ID__c という API 参照名を持つ項目がある場合は、Mother_Of_Child__r.External_ID__c という列ヘッダーを記述することにより、親オブジェク
トの 外部 ID 項目を使用して、Mother Of Child 項目を一意に識別できます。列ヘッダー内のリレーション名では、子オブジェクトのカスタム項目の__cを__rで置き換えた値を入力します。リレーションについての詳細は、www.salesforce.com/us/developer/docs/soql_sosl/index.htm にある『Salesforce SOQL および SOSLリファレンスガイド』の「リレーション名について」を参照してください。
リレーションを使用した CSV ファイルの例を次に示します。
Name,Mother_Of_Child__r.External_ID__c
CustomObject1,123456


コメントを残す