Dynamics 365の仮想エンティティを介し、SQL Serverや外部データにアクセスする

外部システムに存在するデータにOData 4.0 APIを介してアクセスするには仮想エンティティを利用すれば良いのですが。。。

データベース用に独自の OData API を構築し、Dynamics 365にプラグインすればデータにアクセスできますが、これには開発、保守、テストに結構労力がかかります。

面倒なので、自動でOData 4.0のエンドポイントを作成してくれ、仮想エンティティとして設定できるProgress Hybrid Data Pipelineの使い方について記述します。

インスト方法は以下をご覧ください。

For AWS
https://www.progress.com/tutorials/cloud-and-hybrid/deploying-progress-datadirect-hybrid-data-pipeline-on-amazon-aws

For Azure
https://www.progress.com/tutorials/cloud-and-hybrid/deploying-hybrid-data-pipeline-on-microsoft-azure


#OData 4 エンドポイントの作成
１、ブラウザよりhttp://サーバIP/ でログインページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/ef5ed730-a532-dce0-cde9-de87b27210dc.png)


２、インストール時に設定した情報でログインすると、ダッシュボードが表示されます。

サイドバーの「Data Sources」タブをクリックすると、サポートされているすべてのデータストアが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/1df58306-8038-e08e-85ca-010fa3a86f5f.png)

３、SQL Serverまたは自分のデータベースをクリックすると、以下のような接続設定ページが表示されるので、データベースへの接続情報を入力し、Test Connectボタンをクリックして接続を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/68f7be62-994e-97d8-d03a-54afb5fd9b61.png)

オンプレミスのDBに接続している場合は、上記で設定したオンプレのコネクタ IDをドロップダウンで確認します。

４、ODataタブに移動し、クリックしてスキーマの構成ボタンをクリックします。
　　アクセスしたいテーブルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/099873a5-bb71-a304-1cb1-f7211ddd8e43.png)

５、Save and Close をクリックして設定を保存します。
ODataタブには、以下のようなエンドポイントURLが作られています。
SSLを有効にしていない場合は、httpにフォールバックしてください。

https://サーバ名:8443/api/odata4/SQLServer/

トラフィックをリダイレクトしているので、

https://サーバ名/api/odata4/SQLServer (SSLが有効な場合) 

または 

http://サーバ名/api/odata4/SQLServer 

からアクセスできるはずです。

#Dynamics CRM仮想エンティティの設定
１、Dynamics CRMのSettings -> Administration より、Virtual Entity Data Sourcesをクリックします。
２、新規作成をクリックし、新しいOData4データソースを作成します。下図のようなイメージです。

認証については、Hybrid Data Pipeline Serverは基本認証を使用するので、基本認証文字列を計算してくださいね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/184dfb5e-add7-7922-4754-67ba487d4fbc.png)

３、保存＆閉じます。

#エンティティの作成
仮想エンティティ経由でエンティティを見てみます。

```console
               <?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="SQLServer">
<EntityType Name="Customer">
<Key>
<PropertyRef Name="CustomerId"/>
</Key>
<Property Name="CustomerId" Nullable="false" Type="Edm.Guid"/>
<Property Name="FirstName" Nullable="false" Type="Edm.String" MaxLength="40"/>
<Property Name="LastName" Nullable="false" Type="Edm.String" MaxLength="20"/>
<Property Name="Company" Type="Edm.String" MaxLength="80"/>
<Property Name="Address" Type="Edm.String" MaxLength="70"/>
<Property Name="City" Type="Edm.String" MaxLength="40"/>
<Property Name="State" Type="Edm.String" MaxLength="40"/>
<Property Name="Country" Type="Edm.String" MaxLength="40"/>
<Property Name="PostalCode" Type="Edm.String" MaxLength="10"/>
<Property Name="Phone" Type="Edm.String" MaxLength="24"/>
<Property Name="Fax" Type="Edm.String" MaxLength="24"/>
<Property Name="Email" Nullable="false" Type="Edm.String" MaxLength="60"/>
</EntityType>
<EntityContainer Name="dbo">
<EntitySet Name="Customers" EntityType="SQLServer.Customer"/>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
```
２、Customerという名前のエンティティを持っており、データ型はEdm.Guid。主キーはCustomerIdです。エンティティのデータ型は Edm.GuidでなければDynamics CRMからデータにアクセスすることができません。

３、Entityでフィールド設定時の注意事項がいくつかあります。

・列名は大文字と小文字が区別されるため、OData 4.0のメタデータと同じように、フィールドの外部名に同じ名前を設定する必要があります。

・カラムがNullable=falseの場合、フィールド要件をBusiness Requiredに設定する必要があります。

・列に Nullable=true が設定されている場合は、フィールド要件を [option] に設定する必要があります。

・OData 4.0 メタデータで列に MaxLength プロパティがある場合は、フィールド構成で最大長を同じ値に設定します。

４、ここで、Settings -> Customizations -> Customize the Systemと進み、新規エンティティの作成を行います。以下のように設定します。

・Display Name: Customer
・Plural Name: Customers
・External Name
（OData 4.0設定のEntitySet Name="Customer "と同じである必要があります。
・External Collection Name: Customers
　(OData 4.0構成のEntitySet Name="Customer "と同じでなければなりません)

Virtual Entityをチェックすると、Data Sourceという新しいフィールドが表示され、ドロップダウンに上記で設定したVirtual Entityのデータソースが表示されます。

保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/d0c616c8-f78d-bc1f-76dd-e213bbbb2cb1.png)

５、エンティティを保存したら、次はFieldsを作成します。サイドバーの「Fields」タブをクリックすると、既に2つのデフォルトカラムが見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/86388d44-068f-a82a-2638-cb99a1d49651.png)

６、主キー：new_customerid をクリックすると、以下のようなフィールド構成が表示されるはずです。

外部名を設定します。CustomerId は、OData 4.0 メタデータのプライマリ・キーのカラム名と同一である必要があります。カラム名は大文字と小文字を区別するので注意です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/a7afccee-f097-7651-e36c-860bbe754c5a.png)

７、column new_nameをクリックして、以下のように設定します。

・External Name：FirstName (OData 4 メタデータと同じ)
・Field Requirement：Business Required（メタデータがNullable=falseなので）
・Maximum Length: 40

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/44d5b5d0-21cf-3bd3-6177-a9313c7d2bda.png)

８、同様に、メタデータ内のすべてのフィールドを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/9a9e52fe-9f0b-7410-5f6b-58b3fd76ddb2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/fbd16977-05a3-b351-c0a7-fcc79b07a533.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/e1c41ed8-a0d4-7fce-cf7d-5f0801118f49.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/48c374f3-652f-0e87-1bf0-a99c4abf3a28.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/b2372f22-95e5-9deb-a8bc-aa0f5cc0b4d5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/542e01d5-a151-1871-cb57-b587005a7f7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/1ba53044-1162-e8f4-9289-973289c3ec8a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/adc6319e-0ad1-96f0-75cb-19d58c1541b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/1f4aec35-e376-5fea-aa8e-53e834ef1cd5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/29ecf598-70f6-6055-dd58-be654c9f0a77.png)

９、すべてのフィールドを保存後、すべてのカスタマイズをパブリッシュします。
１０、Views, All Customers - Add Columnsよりすべての列をビューに追加、保存します。
１１、Advanced Viewに移動し、customerに関するクエリを実行すると、以下のようなデータが表示されるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556649/1118b244-2eea-32d8-577a-3d4ad1d28d5d.png)

以上
参考：<a href="https://www.ashisuto.co.jp/datadirect/hybrid-connectivity/" target="_blank">Progress Hybrid Data Pipeline</a>