7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Bulk APIで参照項目を含むCSVファイルをUpsertする方法

Last updated at Posted at 2019-08-12

はじめに

最近では外部データを取り込む際に、データ連携ツールのデータローダーやETLを利用するプロジェクトが多く、ツールが提供している標準の補助機能によってBulk APIの考慮事項を意識せず実装できます。
手組みで実装する場合、具体的に主従や参照項目が設定されている親子関係のオブジェクトで、親の外部IDを指定して子レコードを登録する項目の対応付けなど、明確に定義せず設計時に見落とされがちだと感じます。
ここでは、BulkAPIでSFIDを使わずに親の外部IDでこのレコードを登録する方法を説明します。

概要

API開発ツールのPostmanを使用してBulk APIにアクセスします。BulkAPIの処理の流れは、ジョブ登録、データ項目の対応付け登録、バッチ実行の順に実行します。今回はジョブの終了を割愛し、サードパーティーのデータを想定してデータ項目の対応付けの登録を行います。

目次

  1. オブジェクト構成
  2. 登録データ
  3. ジョブの登録
  4. データ項目の対応付けの登録
  5. バッチの登録
  6. 結果の確認
  7. 考慮事項
  8. まとめ

1. オブジェクト構成

契約に取引先名が参照項目として設定されており、取引先と契約は親子関係になっている。
image.png

2. 登録データ(CSV)の説明

 サードパーティーのデータからSalesforceのリレーションを設定する場合、SFIDではなくサードパーティーのキー項目として外部IDで登録するのが一番簡単な方法です。
 今回利用する登録データ(CSV)のヘッダー項目のAccountIDには、親オブジェクトの取引先の外部IDの契約番号A(ContractA__c)の値が設定されています。※AccountIdはCSVのヘッダー項目であり、Salesforceとは関係がない項目です。

image.png

リレーションの説明

各参照項目毎に項目作成時に親オブジェクトのリレーションが作成されます。リレーションを識別する最も確実な方法は、describeSObjects() コールを実行することですが、Enterprise WSDLやAJAX Toolkitでも確認することができます。
今回、標準の取引先オブジェクトと契約オブジェクトを利用し、契約オブジェクトの取引先名(AccountId)は標準項目で、取引先オブジェクトへの親リレーションは”Account”が利用できます。その他、カスタムの参照項目の場合、”__r”のサフィックスが付きます。

3. ジョブの登録

BulkAPIで、データを処理する場合ジョブの作成、項目の対応付け(任意)、バッチの登録、ジョブの終了の処理を順次実行します。まず最初に、ジョブの作成を行います。
以下のエンドポイントを利用します。
https://instance_name—api.salesforce.com/services/async/APIversion/job
ジョブの作成:Salesforcehelp
image.png
ジョブの内容は、下記の4つを記載します。

  1. JSON形式でレコード操作(insert|update|delete|upsert)
  2. 登録オブジェクト
  3. レコードのキー項目(外部ID)(※upsert時にのみ)
  4. 登録データ形式
    image.png
    正常に登録されると、下図のレスポンスが返ってきます。
    image.png
    Salesforceからも確認できます。
    image.png

4. 項目の対応付けの登録

サードパーティのデータを利用する場合、登録データのヘッダー行はSalesforceの項目名で設定されてない場合、Salesforceの項目と登録データのヘッダー項目を紐づけるために、項目の対応付けを登録します。

//instance_name—api.salesforce.com/services/async/APIversion/job/jobid/spec

項目の対応付け:SalesforceHelp
image.png
CSV形式で項目の対応付けの登録します。
image.png

Salesforce Field,Csv Header
ContractNum__c,ContractNum__c
Name,Name
Account.ContractB__c,AccountId

正常処理のレスポンスはありませんが登録できています。2回登録するとエラーが返却されます。
image.png

5. バッチの登録

実際に登録データを送信します。
今回は物理ファイルではなく、ボディーにCSVのテキストを張り付けて送信します。
https://instance_name—api.salesforce.com/services/async/APIversion/job/jobid/batch
ジョブへのバッチの追加:SalesforceHelp
image.png
メッセージボディーにCSV形式のデータを貼り付けます。
データは、親の取引先の外部IDがあるパーターンとないパターンで作成しました。
image.png
正常に登録されると下図のレスポンスが返却されます。
image.png

6. 結果の確認

登録データからSalesforceでBulk実行される際の、要求と結果を確認できます。
Salesforceの[設定]画面 > クイック検索[一括データ読み込みジョブ] > 対象の[ジョブID]をクリック
image.png
登録されたデータがジョブ実行される際の要求と結果を確認できます。
image.png
[要求]リンクをクリックすると、CSV形式のバッチ登録したデータが表示され、項目の対応づけで登録したマッピングデータでヘッダー部分が置換されていることが確認できます。
image.png
[結果]リンクをクリックすると、CSVデータがレコードごとに登録の状態を確認できます。先ほど登録したCSVデータの2レコードは親の取引先の外部IDが存在するパターンと、しないパターンでしないパターンは、外部IDが見つからなかったとエラーでそのレコードが登録できなかったことが確認できます。
image.png
画面からも確認できます。
image.png

7. 考慮事項

レコードの登録・更新用の外部IDと、リレーション設定用の外部IDのCSV項目が同じものの場合、エラーが発生します。おそらく、項目の対応付けの影響で登録データ(CSV)のヘッダーがBulk実行時の要求で置き換わるのが影響していると考えています。

8. まとめ

いかがだったでしょうか?
外部データの連携では、データローダーやETLを利用することが多いため朧げに処理をイメージされている方がおおいいと思います。
BulkAPIでリレーションを登録するイメージを持てたことで設計時に考慮すべきポイントも明確になったと思います。
では、

参考資料

  1. [Postmanホームページ]
    (https://www.getpostman.com/)
  2. 親子リレーションの識別:Salesforce Help
  3. データ項目の対応付け:Salesforce Help
  4. ヘッダー行のリレーション項目:Salesforce Help
7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?