# Microsoft Dynamics 365 Sales Import Integration Using CLI

コマンドラインインターフェースからMS Dynamics 365 Salesデータコネクタを使用することもできます。以下の手順では、CLIを使用してデータをインポートする方法を説明します。

## Install the 'td' command v0.11.9 or later

最新の[Treasure Data Toolbelt](https://toolbelt.treasuredata.com/)をインストールしてください。


```
$ td --version
0.11.10
```

## Create Seed Config File (seed.yml)

以下の手順に従って、Dynamics 365 CRMへのアクセスを設定してください:

1. アプリケーションを作成し、client_id、client_secretを取得します [https://learn.microsoft.com/en-us/power-apps/developer/data-platform/use-single-tenant-server-server-authentication](https://learn.microsoft.com/en-us/power-apps/developer/data-platform/use-single-tenant-server-server-authentication)
2. アプリケーションユーザー用のカスタムセキュリティロールを作成します。最小限の権限（目的のオブジェクトに対する読み取り権限のみ）を持つカスタムセキュリティロールを作成することを推奨します。詳細はこちらを参照してください: [https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531130(v=crm.8)#create-a-security-role](https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531130(v=crm.8)#create-a-security-role) および [https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531090(v=crm.8)#security-roles](https://learn.microsoft.com/en-us/previous-versions/dynamicscrm-2016/administering-dynamics-365/dn531090(v=crm.8)#security-roles)
3. Dynamics 365インスタンスからアプリケーションユーザーを作成します。詳細はこちらを参照してください: [https://learn.microsoft.com/en-us/power-platform/admin/create-users#create-an-application-user](https://learn.microsoft.com/en-us/power-platform/admin/create-users#create-an-application-user)
4. アプリケーションユーザーにカスタムロールを割り当てます


Microsoft Dynamics 365の詳細情報を使用して、以下の例のようにseed.ymlを準備してください。


```yaml
in:
  type: ms_dynamics
  domain: YOUR_DYNAMICS_365_DOMAIN
  tenant_id: TENANT_ID
  auth_method: client_credentials
  client_id: CLIENT_ID
  client_secret: CLIENT_SECRET
  entity_type: contact
  filter_from: FROM_DATE
  incremental: true
out:
  mode: append
exec: {}
```

利用可能なoutモードの詳細については、[Appendix](/ja/int/microsoft-dynamics-365-sales-import-integration-using-cli#h1__1835053169)を参照してください。

### Supported config parameters

| **Parameters** | **Value** | Required | **Description** |
|  --- | --- | --- | --- |
| type | string | yes | ms_dynamics |
| domain | string | yes | Dynamic 365 CRMドメイン。https://プレフィックスの有無は問いません |
| tenant_id | string | yes | MicrosoftアカウントのテナントID |
| auth_method | string | yes | client_credentials |
| client_id | string | yes | アプリケーションのクライアントID |
| client_secret | string | yes | アプリケーションのクライアントシークレット |
| entity_type | string | yes | インポートするエンティティタイプ。例: contact、account、quoteなど... |
| filter_from | string | yes | この値からデータをフィルタリングします |
| filter_to | string | no | この値までデータをフィルタリングします。設定されていない場合はデフォルトの実行時刻が使用されます |
| filter_column | string | no | データをフィルタリングする列。デフォルトは**modifiedon** |
| incremental | boolean | no | 最後の実行以降の新しいデータのみをインポートします |
| skip_invalid | boolean | no | 列に無効なデータ形式が含まれている場合、そのレコードをスキップします |
| entity_set | string | no | エンティティセット名。通常はentity_typeの複数形です。例: contacts、accounts、quotesなど...この値が設定されていない場合、コネクタはAPIメタデータからentity_setを推測します |
| columns | array | no | インポートする列とそのデータタイプ。この値が設定されていない場合、コネクタはAPIメタデータから列とデータタイプを推測します |
| retry_limit | int | no | 各API呼び出しの最大リトライ回数 |
| retry_initial_wait_millis | int | no | 最初のリトライの待機時間（ミリ秒） |
| max_retry_wait_millis | int | no | API呼び出しを諦める前の最大待機時間 |
| connection_timeout_millis | int | no | API呼び出し時に接続がタイムアウトするまでの時間 |
| read_timeout_millis | int | no | リクエストにデータを書き込むまでの待機時間 |


# Guess Fields (Generate load.yml)

connector:guessを使用します。このコマンドは上記のseed.ymlを読み取り、新しいファイルを出力します


```bash
$ td connector:guess seed.yml -o load.yml
```

load.ymlを開くと、推測されたentity_setとcolumnsが表示されます。


```yaml
---
in:
  type: ms_dynamics
  domain: <YOUR_DYNAMICS_365_DOMAIN>
  tenant_id: <TENANT_ID>
  auth_method: client_credentials
  client_id: <CLIENT_ID>
  client_secret: <CLIENT_SECRET>
  entity_type: contact
  filter_from: <FROM_DATE>
  custom_expression_filter: your custom expression filter
  incremental: true
  entity_set: contacts
  columns:
  - {name: exchangerate, type: double}
  - {name: anniversary, type: string}
  - {name: lastname, type: string}
  - {name: employeeid, type: string}
  - {name: firstname, type: string}
  - {name: spousesname, type: string}
  - {name: customersizecode, type: long}
  - {name: fullname, type: string}

out: {mode: append}
exec: {}
filters:
- from_value: {mode: upload_time}
  to_column: {name: time}
  type: add_time
```

次に、previewコマンドを使用して結果をプレビューできます。


```
td connector:preview load.yml
```

システムが予期せず列タイプを検出した場合、または結果から列を削除したい場合は、load.ymlを直接変更して再度プレビューしてください。

現在、Data Connectorは「boolean」、「long」、「double」、「string」、「timestamp」タイプの解析をサポートしています。


```bash
td database:create td_sample_db
td table:create td_sample_db td_sample_table
```

## Execute Load Job

ロードジョブを送信します。データのサイズによっては数時間かかる場合があります。データを保存するTreasure Dataのデータベースとテーブルを指定してください。

また、*--time-column*オプションを指定することを推奨します。これは、Treasure Dataのストレージが時間によって分割されているためです（[data partitioning](https://docs.treasuredata.com/smart/project-product-documentation/data-partitioning-in-treasure-data)を参照）。オプションが指定されていない場合、データコネクタは最初のlongまたはtimestamp列を分割時刻として選択します。--time-columnで指定する列の型はlongまたはtimestamp型である必要があります。

データに時刻列がない場合は、add_timeフィルタオプションを使用して時刻列を追加できます。詳細については、[add_time filter plugin](https://docs.treasuredata.com/smart/project-product-documentation/add_time-filter-function)を参照してください。


```
$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at
```

connector:issueコマンドは、すでに*database(td_sample_db)*と*table(td_sample_table)*を作成していることを前提としています。データベースまたはテーブルがTDに存在しない場合、connector:issueコマンドは失敗するため、データベースとテーブルを[手動で](https://docs.treasuredata.com/smart/project-product-documentation/data-management)作成するか、td connector:issueコマンドで*--auto-create-table*オプションを使用してデータベースとテーブルを自動作成してください:


```
td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column created_at --auto-create-table
```

`time`というフィールドがある場合は、`--time-column`オプションを指定する必要はありません。


```bash
td connector:issue load.yml --database td_sample_db --table td_sample_table
```

## Scheduled execution

新しいデータの増分インポートのために、定期的なData Connector実行をスケジュールできます。TDは高可用性を確保するためにスケジューラを慎重に設定しています。この機能を使用することで、ローカルデータセンターでcronデーモンを使用する必要がなくなります。

増分ロードの詳細については、[About Incremental Loading](/int/microsoft-dynamics-365-sales-import-integration)を参照してください

## Create the schedule

新しいスケジュールはtd connector:createコマンドを使用して作成できます。以下が必要です:

- スケジュールの名前
- cron形式のスケジュール
- データを保存するデータベースとテーブル
- Data Connector設定ファイル



```bash
td connector:create \
daily_import \
"10 0 * * *" \
td_sample_db \
td_sample_table \
load.yml
```

また、Treasure Dataのストレージは時間によって分割されているため、--time-columnオプションを指定することを推奨します（[data partitioning](https://docs.treasuredata.com/smart/project-product-documentation/data-partitioning-in-treasure-data)を参照）。


```bash
td connector:create \
daily_import \
"10 0 * * *" \
td_sample_db \
td_sample_table \
load.yml \
--time-column created_at
```

`cron`パラメータは、`@hourly`、`@daily`、`@monthly`の3つの特別なオプションも受け付けます

デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、タイムゾーンでスケジュールを設定できます。`--timezone`オプションは、'Asia/Tokyo'や'America/Los Angeles'などの拡張タイムゾーン形式のみをサポートします。PSTやCSTなどのタイムゾーン略語は*サポートされておらず*、予期しないスケジュールになる可能性があります。

## List the Schedules

現在スケジュールされているエントリのリストは、td connector:listコマンドを実行することで確認できます。


```
td connector:list
```

## Show the Setting and Schedule History

td connector: スケジュールエントリの実行設定を表示します。


```
td connector:show daily_import
```

td connector:historyはスケジュールエントリの実行履歴を表示します。各実行の結果を調査するには、td job jobidを使用してください。


```
td connector:history daily_import
```

## Delete the Schedule

td connector:deleteはスケジュールを削除します。


```
$ td connector:delete daily_import
```

# Appendix

## Modes for out plugin

seed.ymlセクションでファイルインポートモードを指定できます。

### append (default)

これはデフォルトのモードで、レコードはターゲットテーブルに追加されます。


```
in:
  ...
out:
  mode: append
```

### replace (In td 0.11.10 and later)

このモードはターゲットテーブルのデータを置き換えます。ターゲットテーブルに対して手動で行われたスキーマ変更は、このモードでも保持されることに注意してください。


```
in:
  ...
out:
  mode: replace
```