Odataフィードについて

#ごあいさつ
Power BI 大好きな皆様へ
こんにちは、susumutanakaでございます。

突然ですが、みなさんは、
「Odataフィード」って使ってますか？

自分は、業務上、Microsoft Dynamics 365を利用しているので、めっちゃ使います。

僕が知り得る範囲での知識で「Odataフィード」について書かせてもらいます。

#Odataって？

Odataは、
以下URLから引用となりますが
https://qiita.com/Terry3/items/6aa56e49278b1d5f3856

>Open Data Protocolの略でRESTfulなWebAPI（Webサービス）プロトコル。
OASISという規定に従って作られたプロトコル。
つまり、OData特有の書き方があるということか。今はマイクロソフトが主導となって進めている模様。
Excelとかでデータ連携する場合にODataがあったりする。


で、そのodataですが、仕様を理解すると大変便利なコネクターです。

便利と思うのが、SQLのように、データ取得する際に、

**項目を指定できる（select）　
+条件指定(filter)ができる**
※SQLだとWhere句ですが、odataだと、filterとなる

ということが、できちゃいます。

*これが、できると大量データの読み込みや、不要なデータの読み込みがされないため、
パフォーマンスが劇的に変わります。
特に、テーブルにしこたま、項目がついている場合に、威力を発揮します。*
（弊社で利用しているDynamicsもSFDCも大量に項目を保有するので、効果抜群です。）


サンプルソースがあるので皆さんでやってみましょう！

#準備するもの

・SQLServer使いにはおなじみのサンプルデータNorthwindをOdataで取得できるサイト
http://services.odata.org/northwind/northwind.svc/

#とりあえず、普通にodataでデータ取得#

ODataフィードの画面に以下のURLを張り付ける

http://services.odata.org/northwind/northwind.svc/


![1.png](https://qiita-image-store.s3.amazonaws.com/0/322851/1274fc7a-3f2b-916a-6556-7ee37b705ab6.png)


ナビゲーター画面で「Customers」（顧客）を選択し、「OK」ボタンクリック。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/322851/99e6a4a6-84df-66e3-829c-425af522c525.png)


「Customers」（顧客）が取得されている。すべての項目、レコードが取得された状態です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/5abfd313-cb68-fb28-d46c-289afbe0b567.png)

続きまして、項目を絞った形での取得方法。

#項目を指定し、データ取得してみる#
ODataフィードの画面で「詳細設定」で以下項目を設定

| No | 値                                                  |説明|
|:--:|:--------------------------------------------------------|:---|
|1   |http://services.odata.org/northwind/northwind.svc/        |URL|
|2|Customers|テーブル名|
|3|?$select=|パラメータ|
|4|CustomerID,CompanyName,Country,City|取得したい項目|


入力画面はこんな感じ↓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/b82f6a79-bc28-3bce-fc29-d2ea99d03afb.png)

すべて入力が終わると、URLプレビュー欄がこのようになるはずです。

`http://services.odata.org/northwind/northwind.svc/Customers?$select=CustomerID,CompanyName,Country,City`


取得すると、以下画面のように必要な項目だけが取得された状態となります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/834926ab-90f5-34f5-5b4a-4c39e44f6fc1.png)


つづいて、条件を指定して、
「City」（都市）が【London】のものだけ取得する方法です

#条件を指定してデータを取得してみる#
ODataフィードの画面で「詳細設定」で以下項目を設定
※前項からNo.5,6が増えるだけです。


| No | 値                                                  |説明|
|:--:|:--------------------------------------------------------|:---|
|1   |http://services.odata.org/northwind/northwind.svc/        |URL|
|2|Customers|テーブル名|
|3|?$select=|項目選択のパラメータ|
|4|CustomerID,CompanyName,Country,City|取得したい項目|
|5|&$filter=|条件選択のパラメータ|
|6|City eq 'London'|条件|

※eqはイコールの略で、Londonのデータを取得する


入力画面はこんな感じ↓

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/9f5f6d9b-13e4-ff63-b79a-c21b1916995b.png)

入力したURLプレビューはこんな感じになるはず。

`http://services.odata.org/northwind/northwind.svc/Customers?$select=CustomerID,CompanyName,Country,City&$filter=City eq 'London'`


データを取得すると、項目と条件で必要なデータのみ取得されている状態になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/4900bc60-9ac6-9ea1-ec88-9ab174cdac7c.png)


さらに、顧客のデータに、受注のデータを結合して取得する方法です。
（SQLでいうところのJOINです。）

業務上はほぼ別々で取得し、リレーションを張るのでほぼ活用するイメージがないのですが、
ご紹介しておきます。

#とりあえず、受注テーブルが紐づいているかを確認してみる#

前提条件として、
odataが参照しているサービスでリレーションシップが張られていることが前提になります。（たぶん）

とりあえず、顧客と受注テーブルがリレーションシップがあるかを、確認するため、普通にデータ取得してみる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/bd68088f-30b8-5ef3-7ae4-ed3211362b1c.png)

「関連テーブルの選択」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/a737d649-c5a9-9809-5ffa-2e3a6d147f27.png)

「Orders」（受注）テーブルが選択されるのがわかりますね！
リレーションがはられているのかを確認するには、ここまで十分です。

念のため、
データを取り込み、リレーションシップを確認すると、「CustomerID」で
つながっているのがわかります。
（「顧客」と「受注」がこれ自体は確認の作業なので、特段意味はないです。
また、PowerBIのリレーションシップの機能で自動判定しているのかは不明）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/4fe00d46-fd33-9ed9-0f32-fe755827bb5d.png)

#受注テーブルを結合してデータを取得#

ODataフィードの画面で「詳細設定」で以下項目を設定
※前項から、2-1,4-1が追加。3がちょっぴり変わるだけ

| No | 値                                                  |説明|
|:--:|:--------------------------------------------------------|:---|
|1   |http://services.odata.org/northwind/northwind.svc/        |URL|
|2|Customers|テーブル名|
|2-1|?$expand=Orders|結合するテーブルを指定|
|3|&$select=|項目選択のパラメータ|
|4|CustomerID,CompanyName,Country,City|取得したい項目|
|4-1|,Orders/OrderID|結合したテーブルの項目を指定|
|5|&$filter=|条件選択のパラメータ|
|6|City eq 'London'|条件|

イメージはこんな感じ↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/3d2ff33c-e463-8e20-8251-7758ed3c50c2.png)

URLはこんな感じ↓

`http://services.odata.org/northwind/northwind.svc/Customers?$expand=Orders&$select=CustomerID,CompanyName,Country,City,Orders/OrderID&$filter=City eq 'London'`

データ取得すると、ordersテーブルが結合された状態になっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/85957802-0db3-c6a0-837e-a64f8de78a38.png)

必要な項目を展開すればOK
今回は、OrderIDしか、結合しなかったので、表示上もOrderIDしか存在しない。**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/322851/61d70b96-9526-fa68-bc79-718b408ee9df.png)


#最後に
みなさんどうでしょうか？使えそうなイメージつきましたでしょうか？

もし、Odataが利用できるサービス（Dynamics,SFDCなど）でビジュアル化を検討の方は、
参考していただければと思います。


参考URL：
■英語サイトですが、指定できるパラメータ・サンプルなど載ってます。
https://www.odata.org/documentation/odata-version-2-0/uri-conventions/

補足：
PBIXファイルもUPしたかったのですが・・あげた方がわからず・・汗
もし、必要な方は個別ご連絡ください。