# Microsoft Dynamics 365 Sales インポート連携

この Treasure Data 連携により、デジタルセールス組織に最新のリモートコラボレーション機能を提供し、優れたチームワークとスムーズなエンゲージメントを実現します。

- より強固な関係を見つけ、構築する
- 生産性とパフォーマンスを向上させる
- 顧客の単一ビューを取得する


このインポート連携により、MS Dynamics 365 から Treasure Data へ、コンタクトやトランザクションデータ(見積もりや受注を含む)を取り込むことができます。

## 前提条件

- Treasure Data の基本知識
- **Client Credentials 認証**: Azure Active Directory および Dynamics CRM セキュリティ設定にアクセスするための管理者権限
- **OAuth 認証**: 同意を付与するための Azure「エンタープライズアプリケーション」へのアクセス権を持つテナント管理者またはユーザー


## 増分データ読み込みについて

- 増分読み込みが有効な場合、Dynamics API に発行されるクエリには $filter と `$orderby` ステートメントが含まれます。$filter は目的の条件でデータをクエリし、$orderby はデータを降順で並べ替えます
- 最初に受信した値は、次回のジョブフィルターの参照として保持されます。次のジョブの $filter は前回のジョブデータを除外し、新しいデータのみを取得します
- このプロセスは後続の実行で繰り返されます


![](/assets/image2021-4-6_18-43-24.86d03abace4ca184c72b6857a6cc454f40bca56d8884edae922267e2da2e50bd.62ce3a79.png)

- 増分読み込みが有効な場合、終了時刻は空白のままにします(デフォルトでは現在時刻に設定されます)
- フィルター列(デフォルトでは **`modifiedon`**)には、null または空の値を含めることはできません


### 例

以下は、増分読み込みが有効な場合の例です。

- 前提条件/条件
  - 開始時刻 = 2021-01-01T00:03:01Z
  - ジョブは毎日実行するようにスケジュール
- 1回目のジョブ現在時刻 = 2021-01-15T00:03:01Z:  $filter=**`modifiedon`** > 2021-01-01T00:03:01Z and **`modifiedon`**`<= 2021-01-15T00:03:01Z, $orderby = modifiedon desc. 最初のレコード結果は modifiedon = 2021-01-10T00:00:00Z`
- `2回目のジョブ現在時刻 = 2021-01-16T00:03:01Z:` $filter=**`modifiedon`** > `2021-01-10T00:00:00Z` and **`modifiedon`**`<= 2021-01-16T00:03:01Z, $orderby = modifiedon desc. 最初のレコード結果は modifiedon = 2021-01-16T00:03:01Z`
- `3回目のジョブ現在時刻 = 2021-01-17T00:03:01Z:`$filter=**`modifiedon`** > `2021-01-16T00:03:01Z` and **`modifiedon`**`<= 2021-01-17T00:03:01Z, $orderby = modifiedon desc. 最初のレコード結果は modifiedon = 2021-01-17T00:00:01Z`
- `...`


## Client ID と Client Secret の取得

これらの値は、Client Credentials 認証オプションを使用して接続するために必要です。OAuth オプションを使用して認証する場合は、これらはオプションです。

Microsoft のドキュメントに従って、クライアントアプリケーションを作成し、Client ID と Client Secret を取得してください。

[https://docs.microsoft.com/en-us/powerapps/developer/data-platform/use-single-tenant-server-server-authentication#azure-application-registration](https://docs.microsoft.com/en-us/powerapps/developer/data-platform/use-single-tenant-server-server-authentication#azure-application-registration)

登録したアプリケーションに対して、最小限の権限を持つカスタムセキュリティロールを作成する必要があります。以下を参照してください。

- [https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531130(v=crm.8)](https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531130(v=crm.8))
- [https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531090(v=crm.8)](https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531090(v=crm.8))


## エンティティタイプ

以下の設定でインポートすることで、利用可能なすべてのエンティティを取得できます。

- Entity Type = entity
- Filter Column = overwritetime
- Start Time = 1800-06-21T00:00:00Z


![](/assets/authentications-treasure-data.11a13b5b370adaac27023746f9b19c3899fcc425e67242f9e44738ae25d70096.62ce3a79.png)

この連携は、汎用的な設定でほぼすべてのエンティティをサポートしていますが、特定の設定が必要なエンティティに気づいた場合は、サポートにお問い合わせください。

# Treasure コンソール を使用した接続の作成

## 新しい接続の作成

クエリを実行する前に、Treasure Data でデータ接続を作成して設定する必要があります。データ接続の一部として、連携にアクセスするための認証を提供します。

1. **Treasure コンソール** を開きます。
2. **Integrations Hub** > **Catalog** に移動します。
3. Microsoft Dynamic 365 Sales を検索して選択します。


![](/assets/image2021-3-26_13-56-23.c5debb8998238c05f8dc6b4920bfe1043fc3a53e8c1fa3d2fcf7dee26f513349.62ce3a79.png)

1. **Create Authentication** を選択します。


![](/assets/image2021-3-26_14-1-13.6ed67e7220d4eb7c2f166835f08a39f5b1c49cbe7956d269234c12f2ba8ae6bd.62ce3a79.png)

1. MS Dynamics のドメイン名を入力します。
2. 以下のいずれかの認証方法を選択します。


OAuth 認証
1. OAuth を選択します。 ![](/assets/image2021-3-26_14-1-13.6ed67e7220d4eb7c2f166835f08a39f5b1c49cbe7956d269234c12f2ba8ae6bd.62ce3a79.png)
2. 認証するための資格情報を入力します。
3. オプションで、「Click here and log in to Microsoft Dynamics 365 to grant consent」を選択します。
4. **Integrations Hub** > **Catalog** に戻ります。
5. Microsoft Dynamics 365 Sales を検索して選択します。
6. Domain の値を入力します。
7. OAuth Authentication Method を選択します。
8. 新しく作成した OAuth 接続を選択します。
9. OAuth 接続フィールドの定義を確認します。


Client Credentials 認証
1. Client Credentials を選択します。
![](/assets/image2021-3-26_14-3-59.8516ff9981b8c29ab4c044f3acd5271febeb25c7a31a6c4f9e8f5d5c79d4008e.62ce3a79.png)
2. Domain の値を入力します。
3. Tenant ID の値を入力します。
4. Client ID の値を入力します。
5. Client Secret を入力します。
6. **Continue** を選択します。
7. 接続の名前を入力します。
8. **Continue** を選択します。


## Treasure Data へのデータ転送

認証済み接続を作成すると、自動的に Authentications に移動します。

1. 作成した接続を検索します。
2. **New Source** を選択します。
3. Data Transfer フィールドで **Source** の名前を入力します。


![](/assets/image2021-3-26_14-55-0.59c9d050df7b5bee98615094570021ed08c011d22bd2c520815b92732a05ee55.62ce3a79.png)

1. **Next** を選択します。


Source Table ダイアログが開きます。

![](/assets/microsof_365_kaizen.35a80e764a9361f72471206d38bdfe3f1248a148a24cc3fce904744a7d9fc368.62ce3a79.png)

以下のパラメータを編集します。

| パラメーター | 説明 | **必須** |
|  --- | --- | --- |
| Entity Type | エンティティの論理名。例: contact、sales_order、account...すべての利用可能なエンティティを取得するには[fetch Entity Type](/ja/int/microsoft-dynamics-365-sales-import-integration)を使用してください | はい |
| Filter Column | データをフィルタリングする列（日時列のみサポート） | いいえ |
| Start Time | UTC形式 YYYY-MM-DDThh:mm:ssZ。このタイムスタンプから変更されたデータをインポートします。   - Start Timeフィールドは排他的です。つまり、この値と等しいデータはダウンロードされません。この値と等しいデータを含めたい場合は、時刻を1秒早く設定してください（End Timeは包含的です） | いいえ |
| End Time | このフィールドはオプションです。指定しない場合は現在時刻が使用されます。UTC形式 YYYY-MM-DDThh:mm:ssZ。このタイムスタンプから変更されたデータをインポートします。  Incremental loadingが有効な場合は、このフィールドを空白のままにすることを推奨します。 | いいえ |
| Custom Expression Filter | - データインポートを絞り込むためのカスタムフィルター式を入力できるテキストエリア - このフィルターは、ANDオペレーターを使用して時間ベースのフィルターと組み合わされます - 時間ベースのフィルタリングのみが必要な場合は空のままにします - カスタムフィルター式の作成方法の詳細については、以下の「カスタムフィルター式の構築」セクションを参照してください |  |
| Incremental Loading? | 有効にすると、最後の取り込みから新しいデータのみをインポートします。 | いいえ |
| Skip Invalid Data? | 列のデータ型を既知の値に変換できない場合、その行はスキップされます。  処理された行の30%以上が無効な場合、ジョブは失敗ステータスで停止します。 | いいえ |


## カスタムフィルター式の構築

**基本構文**

カスタムフィルター式は以下で構成されます：

- フィールド名（例: revenue、classification、status）
- 演算子（例: eq、ne、gt）
- 値（データ型に基づいて適切にフォーマットする必要があります）


**演算子**

1. **比較演算子**
  - `eq` - 等しい: `status eq 'active'`
  - `ne` - 等しくない: `classification ne 'confidential'`
  - `gt` - より大きい: `revenue gt 1000000`
  - `ge` - 以上: `priority ge 2`
  - `lt` - より小さい: `completion lt 100`
  - `le` - 以下: `risk_level le 3`
2. **論理演算子**
  - `and` - 両方の条件が真でなければならない: `status eq 'active' and revenue gt 1000000`
  - `or` - いずれかの条件が真であればよい: `type eq 'commercial' or type eq 'residential'`
  - `not` - 条件を否定する: `not (classification eq 'confidential')`


**値のフォーマット**

- テキスト: シングルクォート - `'active'`、`'confidential'`
- 数値: クォートなし - `1000000`、`2.5`
- 日付: `datetime'2024-01-08T00:00:00Z'`
- GUID: `guid'12345678-1234-1234-1234-123456789012'`


**関数**

- `startswith(fieldname, 'value')` - フィールドが値で始まるかチェックします
- `endswith(fieldname, 'value')` - フィールドが値で終わるかチェックします
- `substringof('value', fieldname)` - フィールドに値が含まれているかチェックします


#### 例

**基本的なフィルター**


```
revenue gt 1000000 and status eq 'active
```

**複雑なフィルター**


```
(classification ne 'confidential' and building_type ne 'government') or 'security_level eq 'public' and revenue gt 5000000)
```

**関数の使用**


```
not (startswith(customer_name, 'Gov')) and not (substringof('classified', description))
```

### **ベストプラクティス**

インポートで使用する前に、Dynamics 365のAPIを使用してフィルターをテストしてください

シンプルな条件から始めて、徐々に複雑さを構築してください

条件を明確にグループ化するために括弧を使用してください

フィールド名がDynamics 365システムのフィールド名と正確に一致していることを確認してください

フィールド名は大文字と小文字を区別します

テキスト値はシングルクォートで囲む必要があります

日付値は正しいUTC形式である必要があります

### Data Settings

Data Settingsページは必要に応じて変更できますが、ページをスキップすることもできます。

![](/assets/image2021-3-26_15-2-54.a276cd1e577429c636980498d360be3f14fc315570f86dede412a82ac0382d02.62ce3a79.png)![](/assets/image2021-3-26_15-3-14.190b1c9bfdd3941e6d7ff8c6c6a32e3bc320b55fd80ef338187d673865dcef94.62ce3a79.png)

オプションで、以下のパラメーターを編集します：

| パラメーター | 説明 | **必須** |
|  --- | --- | --- |
| Retry Limit | 各API呼び出しの最大再試行回数。 | いいえ |
| Initial retry time wait in millis | 最初の再試行の待機時間（ミリ秒単位）。 | いいえ |
| Max retry wait in mills | API呼び出しを諦める前の最大待機時間。 | いいえ |
| HTTP Connect Timeout | API呼び出し時に接続がタイムアウトするまでの時間。 | いいえ |
| HTTP Read Timeout | リクエストにデータを書き込むのを待つ時間。 | いいえ |
| Column Settings | 結果から列を削除したり、そのデータ型を定義したりできます。    列名を更新しないでください。更新すると、その列の値がnullになります。 | いいえ |


1. **Next**を選択します。


### Data Preview

インポートを実行する前に、Generate Preview を選択してデータの[プレビュー](/products/customer-data-platform/integration-hub/batch/import/previewing-your-source-data)を表示できます。Data preview はオプションであり、選択した場合はダイアログの次のページに安全にスキップできます。

1. **Next** を選択します。Data Preview ページが開きます。
2. データをプレビューする場合は、**Generate Preview** を選択します。
3. データを確認します。


### Data Placement

データの配置について、データを配置したいターゲット database と table を選択し、インポートを実行する頻度を指定します。

1. **Next** を選択します。Storage の下で、インポートされたデータを配置する新しい database を作成するか、既存の database を選択し、新しい table を作成するか、既存の table を選択します。
2. **Database** を選択 > **Select an existing** または **Create New Database** を選択します。
3. オプションで、database 名を入力します。
4. **Table** を選択 > **Select an existing** または **Create New Table** を選択します。
5. オプションで、table 名を入力します。
6. データをインポートする方法を選択します。
  - **Append** (デフォルト) - データインポートの結果は table に追加されます。
table が存在しない場合は作成されます。
  - **Always Replace** - 既存の table の全体の内容をクエリの結果出力で置き換えます。table が存在しない場合は、新しい table が作成されます。
  - **Replace on New Data** - 新しいデータがある場合のみ、既存の table の全体の内容をクエリの結果出力で置き換えます。
7. **Timestamp-based Partition Key** 列を選択します。
デフォルトキーとは異なるパーティションキーシードを設定したい場合は、long または timestamp 列をパーティショニング時刻として指定できます。デフォルトの時刻列として、add_time フィルターで upload_time を使用します。
8. データストレージの **Timezone** を選択します。
9. **Schedule** の下で、このクエリを実行するタイミングと頻度を選択できます。


#### 一度だけ実行

1. **Off** を選択します。
2. **Scheduling Timezone** を選択します。
3. **Create & Run Now** を選択します。


#### 定期的に繰り返す

1. **On** を選択します。
2. **Schedule** を選択します。UI では、*@hourly*、*@daily*、*@monthly*、またはカスタム *cron* の 4 つのオプションが提供されます。
3. **Delay Transfer** を選択して、実行時間の遅延を追加することもできます。
4. **Scheduling Timezone** を選択します。
5. **Create & Run Now** を選択します。


転送が実行された後、**Data Workbench** > **Databases** で転送の結果を確認できます。

# Workflowを使用したMS Dynamics 365 Salesからのインポート

ワークフローのtd_load>:オペレーターを使用して、MS Dynamics 365 Saleからデータをインポートできます。SOURCEを既に作成している場合は、それを実行できます

1. ソースを特定します。
2. 一意のIDを取得するには、Sourceリストを開き、MS Dynamics 365 Salesでフィルタリングします。
3. メニューを開き、**Copy Unique ID**を選択します。


![](/assets/image2021-10-12_12-26-58.09d9b84b0f1f752c7c95b0bc1c2d8e8b7302e5b91c6a3cb5f01309dadf53a604.62ce3a79.png)

1. td_load>オペレーターを使用してワークフロータスクを定義します。



```yaml
+load:
  td_load>: unique_id_of_your_source
  database: ${td.dest_db}
  table: ${td.dest_table}
```

1. ワークフローを実行します。