プログラマ38の日記

主にプログラムメモです。

Salesforce: データ連携時に気をつけること(Salesforce→他システム)

Salesforceから他システムへデータを渡したい時があります。

入力はsalesforceでPCとモバイルから行い、その後入力したデータを基幹システムや分析システムに連携することはよくあることだと思います。

 

その時に気をつけておくことのメモです。

  1. 大量データを連携する方法
  2. 日付/時間の形式
  3. 数値の形式

 1. 大量データを連携する方法

データの取得は基本的に、SalesforceAPI のqueryを使うことになります。

1度に、大量データを取得する時に気をつけることがあって、取得結果が大き過ぎるとクエリがタイムアウトする場合があります。

(微妙な件数だと一度目は失敗するけど、二度目は成功するなんてこともあります。Salesforceのキャッシュの制御次第だと思います)

そういった時には、一度に取得する件数を少なくするように条件をつけることで解決します。

例えば、直近1ヶ月に作成されたデータを連携する場合

Where CreatedDate = LAST_N_DAYS:30

の条件をつけることで取得できますが、これでタイムアウトする場合は、

Where CreatedDate = LAST_N_DAYS:30
  and CreatedDate < LAST_N_DAYS:29
  

Where CreatedDate = LAST_N_DAYS:29
  and CreatedDate < LAST_N_DAYS:28  

・・・・

Where CreatedDate = LAST_N_DAYS:2
  and CreatedDate < LAST_N_DAYS:1  

Where CreatedDate = LAST_N_DAYS:1

 

と取得結果を分割することで対処します。

 

このextractを処理を、データローダのコマンドラインモードで何度も実行することになります。

 

あまり問題にはなりませんが、通常のsfdc.usernameとsfdc.passwordで指定すると、extractを実行するたびログインを行います。そのためログイン回数が増えてしいまい、イベントログではデータ連携のログインばかりになってしまいますし、APIの消費もかさみます。

 

ログインを減らすには、データローダのパラメータでセッションIDとインスタンスURLを指定することで解決できます。(ログインは最初に1度行い、そこでインスタンスURLとセッションIDの取得しておく必要があります)

process-conf.xmlに次を指定します。

<entry key="sfdc.endpoint" value="インスタンスURL(例.https://ap2.salesforce.com)"/>
<entry key="sfdc.oauth.accesstoken" value="セッションID/>

sfdc.oauth.accesstokenを指定する場合、sfdc.usernameとsfdc.passwordは不要です。

これでデータローダ実行時に、ログイン処理はスキップされます。

2. 日付/時間の形式

APIで取得した時の日付/時間のフォーマットは選べず、日付/時間はGMTの出力となります。(yyyy-MM-dd'T'HH:mm:ss'.000Z')

この形式となるため、データローダで出力した日付/時間の値を、連携先で日本時間として取り込む場合、取り込む時に、日本時間へ変換してもらうことになります。

※ETLツールを使う場合や、CSVを変換するプログラムを作らない場合の話です。

3. 数値の形式

取得する値が大きいと指数形式となります。(1.E+10 のような値)

また、Salesforceで小数点以下が0の項目としていても、データとして小数点を持っている場合があります。(apexや、APIでセットうっかりセットしている時があります)

データローダで出力したcsvを、連携先で取り込む場合は、正しい数値へ変換してもらう必要があります。(連携先の取込ツールが対応しているか、文字として取り込んでから変換するかなどになります)

 

最後に

salesforceとの連携処理は、データローダを使うことにして簡単に済ます場合が多いと思いますが、上のようなことを考慮・定義しておく必要があります。

さすがに作成日を1日に限定しないとタイムアウトするほど件数がある環境はまれだと思いますが。。

CSVの変換処理は件数が多いと意外と大変なので、どちらで変換するかは決めて、変換する側はその処理を行う時間を見ておく必要があります。