> ## Documentation Index
> Fetch the complete documentation index at: https://www.integrate.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ETL: Salesforceコネクション Q&A

> Integrate.io ETLとSalesforceの連携に関するよくある質問をまとめ、Bulk APIのバージョンやSOQLの使用方法、更新方法などを解説します。

## Q1. Xplentyで使用するAPIは?

「Bulk API」です。現在は、v1とv2があります。Xplentyは両方のバージョンが指定可能ですが、バージョンによって若干のオプションが異なります。可能であればより優れたAPI v2をお勧めします。

## Q2. データソース/デスティネーション（送信先）としてカスタムオブジェクトを指定することは可能ですか?

指定できます。

## Q3. SOQLは使えますか？

Access modeをデフォルトの「Object」から「Query」に変更することで、SOQLを使用できます。

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-1.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=00cc515266090209d167a6b0a10dad83" alt="salesforce-part02-jp image 1" width="1051" height="829" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-1.webp" />
</Frame>

## ヒント：Salesforceのオブジェクトで日付フィルタを指定する方法

またオブジェクトを指定した場合も、SOQLベースのフィルタ条件を設定可能です。

### 固定値の場合

フィルタをかける対象のフィールドが日付型の場合、シングルクォートなしで設定ください。

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-2.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=e080a1eaf5a9fa5dc25c0db661608089" alt="salesforce-part02-jp image 2" width="1054" height="829" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-2.webp" />
</Frame>

### 変数を使用する場合

#### 1) ２時間前以降のデータを取得する

**変数名：** two\_hours\_ago
**変数式：** `SubtractDuration(CurrentTime(),'PT2H')`

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-3.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=be736562bf4a78017de7b60db4c6ce77" alt="salesforce-part02-jp image 3" width="1052" height="829" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-3.webp" />
</Frame>

#### 2) 現在日付（日本時間）の0時以降のデータを取得する

変数式：
まず日本時間の現在日付のの0時を取得し、そこから-9時間(UTC)に変換する。
`SubtractDuration(ToDate(ToString(SwitchTimeZone (CurrentTime(),'Asia/Tokyo') ,'yyyy-MM-dd\'T\'00:00:00.000')),'PT9H')`

## Q4. Salesforceが[Destination（送信先）](https://www.xplenty.com/docs/using-components-salesforce-destination/)の場合： 更新方法について

* **Insert only**：レコードの追加のみ

* **Upsert**：レコードの追加/更新（Upsert KeyのIDを設定し、既存レコードがあった場合には、そのレコードを上書き）

* **Update** : レコードの更新

* **Delete**：Key列を指定し、一致するレコードを削除（Salesforceのゴミ箱に入るので、後に**復旧可能**）

* **Hard Delete**：Key列を指定し、一致するレコードを物理削除（Salesforceのゴミ箱を経由しないため、**復旧不可**）

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-4.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=bb4c676d9306f10ad059a65402c1ca10" alt="salesforce-part02-jp image 4" width="624" height="311" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-4.webp" />
</Frame>

**列のマッピング**
※関連オブジェクト（REFFERENCED OBJECT）を自動的に検知します。

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-5.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=caffbd18775bdba6ec9ee0eafe62a2f4" alt="salesforce-part02-jp image 5" width="1051" height="829" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-5.webp" />
</Frame>

## Q5. SalesforceがDestination（送信先）の場合： オブジェクトの既存レコードの一部のフィールドのみを更新することは可能ですか?

例）アカウント・オブジェクトの案件の確度（Account）を更新する場合

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-6.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=2393c9440b4bfb0072bdd94aedc9c485" alt="salesforce-part02-jp image 6" width="1053" height="829" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-6.webp" />
</Frame>

この場合、ジョブは以下のように動作します。

* **オブジェクトに指定したIDのデータがある場合:** 対象のレコードを更新

* **オブジェクトに指定したIDのデータがない場合:** エラー

## Q6. SalesforceがDestination（送信先）の場合： エラー判定の制御について

ジョブ全体で許容できるエラーレコード件数は、「**Maximum errors**」の値で制御可能です。ちなみに、「**Batch size**」とは一回の処理で扱うレコード数ですが、エラー数はBatch sizeに関係なく、処理全体でエラーとなったレコード数がどれくらいあったかと許容できる最大エラー数の値を比較し、ジョブの結果がエラーかどうか判定します。

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-7.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=6b9785bae3b1a561fd8a331009fbb50d" alt="salesforce-part02-jp image 7" width="533" height="395" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-7.webp" />
</Frame>

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-8.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=80511bf188898bf5dbe41900d4949f95" alt="salesforce-part02-jp image 8" width="536" height="403" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-8.webp" />
</Frame>

| シナリオ         | エラー最大数 | ジョブの結果 | 備考                       |
| ------------ | ------ | ------ | ------------------------ |
| 10件中1件失敗した場合 | 0      | エラー    | 最大エラー数0 \< 実際のエラー件数1     |
| 10件中1件失敗した場合 | 1      | 成功     | 最大エラー数1 **=** 実際のエラー件数1  |
| 10件中2件失敗した場合 | 1      | エラー    | 最大エラー数1 \< 実際のエラー件数2     |
| 10件中8件失敗した場合 | 10     | 成功     | 最大エラー数10 **>** 実際のエラー件数8 |

DBの場合は、更新に成功したレコードもロールバックされますが、Salesforceの場合は、APIの特性上、ロールバックされないので注意が必要です。[詳細はこちら](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/asynch_api_batches_failed_records.htm)

## Q7. SalesforceがDestination（送信先）の場合： バッチサイズ(Batch size)の設定によるAPI制限の回避

[Salesforceのドキュメント](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/asynch_api_concepts_limits.htm)によると１バッチの最大数が10,000 レコードとなっているので、API制限にお困りの場合、バッチサイズをなるべく大きな数値に設定することでAPI制限を回避することが可能になります。

<Frame>
  <img src="https://mintcdn.com/integrateio/X6Tbr12w4wun31Cu/images/japanese-knowledge-base/salesforce-part02-jp/image-9.webp?fit=max&auto=format&n=X6Tbr12w4wun31Cu&q=85&s=f0fa824d86738a11e25733ae09e85180" alt="salesforce-part02-jp image 9" width="532" height="396" data-path="images/japanese-knowledge-base/salesforce-part02-jp/image-9.webp" />
</Frame>
