Dynamics 365 Business Central から Power Query で CDS にデータを渡す。

先日、Microsoftの吉田さんによるPowerAppsのWebinerでデータ統合機能が説明されていたので、早速 **Dyanmics 365 Business Central** のデータを読み込んでみました。今回はその手順の説明です。

Dynamics 365 Business Central って何ですか？？という方は[**こちら**](https://dynamics.microsoft.com/ja-jp/business-central/overview/)をご参照ください。簡単に言うと、中小・中堅向けのERPパッケージですね。（詳しい説明は本旨ではないので割愛します。）
Dynamics 365 Business Central で試してみましたが、他のデータソースについても手順的には同様だと思いますのでご参考になるかと思います。

PowerAppsのデータ統合機能については、ざっくり言うと「ERPであれCRMであれ何であれ、とにかくCDSにデータを溜めましょう。そのためのツールを作りました。」といった所です。Microsoft製品であるDynamicsに限らずSalesForceであれSAPであれ何であれ、です。

PowerBIじゃなくてPowerApps？という疑問もあるかと思いますが、**要はPowerQuery**です。

##おさらい：Power BI デスクトップでD365BCのデータを読む。
PowerAppsのデータ統合プロジェクトの前にまずはPowerBIデスクトップでDynamics 365 Business Central（長いので以下D365BCと略記）のデータを読み込むところから。

PowerBIデスクトップでデータを取得を選択。色々コネクタがありますがD365のコネクタがここには無いので「その他」を選択。
![01_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/3f4545e2-a683-5e7f-c0e1-9e1944cc1323.png)

オンラインサービスの中にDynamics 365 Business Central のコネクタがあるので選択して接続。
![02_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/4b690720-c6c5-1749-0050-aff9edeb9ce4.png)

D365BCはSaaSで提供されているので(※)サインインが必要になります。サインインを選択。（※:オンプレ版もありますが、今回はSaaS版での説明です。オンプレ版だとゲートウェイとか色々面倒なので。）D365BC以外のサービスでも大抵はここで認証処理が走るはずです。
![03_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/2a3f37d5-5007-ad30-f845-f6f362b0d448.png)

D365BCのユーザーアカウントを選択してサインイン。
![04_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/b4cd01b5-a5c2-c4a9-6799-580a3859293d.png)

ユーザー認証後に接続。
![05_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/466fd92d-512b-187c-1a9d-12385e476cf7.png)

D365BCのテーブル（※）が一覧表示されました。
（※：正確にはテーブルではないですが、、後述。）
![06_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/636042d2-da7d-479c-8735-fae3f47f18f0.png)

今回はJob_Listで説明します。Jobは所謂「プロジェクト」です。
（Jobが何か？について今回は特に気にする必要はありません。単純にデータ件数が少なくて見やすいので選んだだけです。。）
Job_Listを選んで右側に表示される一番上のレコードが自分が手で登録したデータです。（残り3つは標準デモデータ）
![07_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/c096d49b-8a75-251b-7840-fabf12cdcf85.png)

一覧で表示されている「テーブル」の正体はこちらです。D365BCにWebServiceという機能があり、D365BC独自の言語で開発したQueryなどで取得したデータをWebAPIとして公開できます。
![09_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/b04d9abd-0c4a-3b8c-3866-b7e158fdcb85.png)

下線部のURLを叩くとD365BCがODataV4のjson形式でデータを返す、という仕組みです。
![10_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/fe4a4592-c505-4389-a9c4-c5cd8bfc7fa4.png)

要はODataなので、ODataフィードからデータを取得する事もできます。
![11_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/da4483fd-7821-e3bf-f2c6-8383bdbfdf40.png)

ODataのURLを指定して、、
![12_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/3305344b-646b-fdfb-27bf-788252d9c354.png)

そのままでは認証されないので、
![13_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/b6249498-f112-cccd-6878-7e533f41a833.png)

組織アカウントでサインイン。
![14_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/b123b2a6-f176-5428-6a1a-40c69ea220ab.png)

D365BCに接続できるアカウント指定して認証。
![15_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/658bd33c-a892-9ff6-d82d-2b8b19f2b461.png)

認証を通したら接続。
![16_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/c876032e-e07f-2b8c-d6e6-0c4c505c4314.png)

Dynamics 365 Business Central のコネクタを使っても、ODataフィードのコネクタを使っても、結果は同じでこんな感じでデータが取れます。
![17_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/3150ba30-cb1b-bb35-b762-48a181da8565.png)

下の方にスクロールして「JOB_List」を見つけます。
![18_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/e9c6f649-17fa-e4b0-d2d2-d22d18802a64.png)

右の列の「Table」をクリック。
![19_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/b27bfeb4-9258-6e07-f24c-8f7b6c0654c8.png)

データが表示されました。一番上のレコードが自分が手で登録したデータです。（残り3つは標準デモデータ）
![20_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/64838fcf-61bc-1a79-a01b-8f9a8f1b6415.png)

##本題：PowerAppのデータ統合機能でD365BCのデータを読む
前提として、PowerAppsのPlan2が必要です。
サイドメニューで「データ」の下の階層の「データ統合」を選択。
![21_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/7e5892fd-68f4-0b54-2412-48e7fdabcad6.png)

「データ統合プロジェクト」を選択。
![22_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/0f1fecf2-75ac-4745-cdac-de7bbc6ca4f4.png)

コネクタが一覧表示されます。PowerBIと違って少ないですね。そしてDynamicsのコネクタが見当たらない。。
コネクタについては今後順次追加予定とのことです。（Webinerで質問したところそういう回答を頂きましたw）
そしてよく見ると上の方に「PowerQuery」と書いてありますね。そうです、**要はPowerQuery**です。
![23_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/d2abf2fe-ef3e-7d81-a3d9-e3bfdfd642da.png)

Dyanmicsのコネクタが無くても諦めるのは早いです。PowerBIデスクトップの所で確認したように、**要するにOData**なので、ODataフィードのコネクタでやってみます。
![24_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/02591cd3-c3af-e8f8-32ca-6e6ee23db9c3.png)

接続の資格についてはPowerAppsを使用しているOffice365アカウントとD365BCのアカウントが同じであればサインイン不要です。そして、「次へ」。
![25_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/9436b656-fb4a-9e37-113d-45eb3527435b.png)

PowerBIデスクトップの時と同様にテーブルの一覧が表示されました。
![26_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/491f54c4-ace7-79ac-46ca-515553693e0e.png)

下の方にスクロールして、JOB_Listの[Table]をクリック。
![27_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/d48aa50f-5553-71ad-1d46-b3ce8bfbee11.png)

テーブルのレコードが表示されます。手登録したデータも含めて表示されています。ここまでいい感じです。「次へ」
![28_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/30e5bd21-5d1d-4fba-d946-7394c414c064.png)

読み込みの設定画面が表示されます。今回は読み込み先のエンティティを作成していないので、取り込み時に新規登録することにします。従って、、
![29_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/c821a468-aef3-f1eb-a142-fe01bc8346c9.png)

「新しいエンティティ読み込む」を選択すると右側が変わります。フィールドマッピングとありますが、これは取得元であるD365BCの項目名と読込先のCDSのエンティティの項目を対応付けよ、ということです。
![30_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/988c93c9-b00d-2e65-df4f-56880b31510c.png)

とは言ったものの、新規作成なので項目はそのまま右から左（左から右？）に渡すだけです。新規作成するカスタムエンティティに名前を付け、キー項目だけは明示的に指定が必要なので「No」と「cr5cd_No」をキーとして紐づけます。この「cr5cd_」というプレフィックスはカスタムエンティティ新規作成時に（多分）ランダムに振られる文字列です。恐らく、ユニークにするための文字列でしょう。指定した後は「次へ」。
![31_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/d2595c37-6a7d-3fec-fcab-00e7a8a0b8f3.png)

更新タイミングを指定します。今回は「手動」にします。（余談ですが、この手の設定は上手く行ってから「自動」にするのがよいです。でないと延々と同期エラーを繰り返すことがあります。）そして「作成」をクリック。
![32_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/9c582320-5194-ad4b-1ca0-de0898d60dc8.png)

処理が進みます。
![33_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/581a3046-b77b-c464-a581-5b8cc7f7f253.png)

進みます。
![34_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/683e7731-551b-b0ef-5b85-d0fc2ed06903.png)

進みます。いい感じです。
![35_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/744e7195-0b9f-0989-2fed-53a023241802.png)

失敗しました。。
![36_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/9fb681a7-df73-0783-9955-6b0670552ebd.png)

右端の「...」アイコンからログが取得できます。
![37_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/8f68aa59-7d09-5b53-bb6f-440f541f047a.png)

メッセージを読む限り、D365BC側の問題ではなく、CDS側の問題のように見えます。D365BC以外のODataフィードで試してみるとか、先にCDSのカスタムエンティティを作成してから取り込んでみるとかすれば、原因が切り分けられるかと思います。
![38_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/be29ca9e-5d69-785d-a0a5-5d2a1428558c.png)

が、その前に別の方法を試してみます。データソースの指定時にWebAPIを選びます。
![39_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/65b60f64-4882-e8ec-944b-a76cb879eee8.png)

URLを指定します。
![40_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/2babf839-a90c-00f9-fb05-a0064557d295.png)

URLの取得元はこちら。D365BCのWebServiceの一覧画面です。
![40-1_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/c9e5e11a-196a-f6dd-d2aa-333d9d86974e.png)

Json形式のファイルをテーブルに変換します。
![41_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/07e6a89e-bab6-36e2-194c-79d1c478067c.png)

深く考えずにそのまま「ＯＫ」。
![42_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/136ada05-3d5e-cc98-f42e-e3f8a9b7ce66.png)

若干分かりづらいですが、赤丸のアイコンをクリックして、、
![43_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/3a761987-4351-7fea-6c7b-a7e1aed38cb4.png)

ＯＫを押すと、、
![44_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/90140af7-e5ec-c62b-63f7-47648769b717.png)

データがサンプル表示されました。ここまでいい感じです。手で登録したデータも見えています。
![45_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/1785ee79-d519-08a1-295b-d79377816c24.png)

マッピング設定は先ほどと同じ。
![46_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/06c2c43f-cb89-bdd3-b442-58a93c140152.png)

同じように指定します。
![47_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/52a5f9ef-4748-fafc-3785-108fd799695e.png)

同じように指定します。
![48_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/9bbc951c-30dc-fc90-f858-f007b80a9167.png)

更新設定もとりあえず「手動」を選択して「作成」。
![49_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/9a24201a-07a1-a05c-3af6-59394b16b0a1.png)

処理が進みます。
![50_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/475a2316-30b8-39be-6127-c00fffb280a7.png)

進みます。。
![51_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/37ff451f-c343-d988-ba82-65470d97c937.png)

進みます。。。
![52_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/ddec4d1e-de05-3811-a0ec-577b2fd7da3c.png)

完了しました！
![53_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/3a381b96-70de-ef5b-8196-28fff7b3ed37.png)

データ統合プロジェクトの一覧画面で該当のプロジェクトを選択して「編集」を押すと、、
![54_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/0a0b8599-7aff-d53d-f227-0eafa77a58ba.png)

PowerQueryが編集できます。操作についてはPowerBIのそれと同じです。
![55_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/1d8c7327-63b0-91a4-96dd-072c0e6a5030.png)

新規作成したエンティティを見てみましょう。左サイドのメニューの「データ」の下の「エンティティ」を選んでエンティティ一覧を表示し、該当のエンティティをクリック。
![56_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/7ca64725-732b-cdd1-be7b-b233b525d3b8.png)

デフォルトはフィールドタブなのでフィールド一覧が表示されます。データタブをクリックすると、、
![57_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/57a66fb8-8c51-3f20-02d2-0f42a9a62c10.png)

データレコードが表示されました。ただ、標準のままだと列項目が少ないですね。。
![58_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/dc69b9f4-0cae-31e5-33d6-4d12107c8909.png)

そういう時は右上の「ビューの選択」で全項目表示するビューに切り替えます。
![59_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/78abd497-3c4b-8b0e-a461-4c94a00039ef.png)

列項目が追加された状態でデータを見る事ができました。
![60_CDS-DataIntegration-from-D365BC.png](https://qiita-image-store.s3.amazonaws.com/0/239116/5b100883-fd0e-b437-8f8b-24347ff10163.png)


と、こんな感じでデータ統合機能を用いるとDynamics 365 Business Central（あるいはその他のサービス）からデータを抜いてCDSに溜めることができます。問題は、このデータをどう使うか？ということです。データをBI的に見るだけならPowerAppsのPlan2をわざわざ契約するまでもなくPowerBI側でやれるわけですから、それ以上の付加価値が欲しいところです。つまり、このデータを使って業務プロセスを回すみたいなことができないと意味ないかな、と思ったりします。その辺はモデル駆動型アプリをどううまく使うかに掛かっていると思います。まだCDSやモデル駆動型アプリは全体像が見えてないように思えるのでウォッチしていきたいと思います。