【Fiori/UI5】ブラウザからのODataの見方および抽出オプション

#概要
SAP Netweaver GatewayでODataを作成し、ブラウザ側からODataを見る方法。
キーを指定したり、フィルターをかけたり、様々なオプションをかけることができる。

ODataサービスの作成方法をこちらをご参照ください。
https://qiita.com/tami/items/f49a4a6be1ffd83cc87c

#準備
当記事では、サンプルとしてSAP Gateway Demo Systemからデータを取得する。
下記のチュートリアルを参考に、SAP Gateway Demo Systemのアカウントを作成しログインする。
S-IDが必要。
https://developers.sap.com/tutorials/gateway-demo-signup.html

使えるSAP Gateway環境があるのならそれでも構わない。

#metadataの見方
Service Root URLに`$metadata`を付けてアクセスするとメタデータが閲覧できる。
各種Entityの名称、プロパティの名称や型、Associationなどを読み取る事ができる。
ABAPで言うと、SE11でテーブル定義を参照しているような感じである。
例として次のURLをブラウザに貼り付けてEnterを押下する。
https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/$metadata
`https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC`の部分がService Root URLである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/0897c289-f247-3896-2370-3a8eefd8210f.png)

各種要素の意味合いは以下の通り。

- EntityType

```xml:
<EntityType Name="BusinessPartner" sap:content-version="1">
```

概念モデルの最上位レベルの概念 (顧客や注文など) の構造を表す。RDBで言うテーブルに相当する。

- Key

```xml:
<Key>
<PropertyRef Name="BusinessPartnerID"/>
</Key>
```
EntityType要素の子要素であり、エンティティキーを定義する。RDBで言うキー。
例えば二つ以上のPropertyRefを組み合わせて複合キーのようにすることも可能。

```xml:
<EntityType Name="SalesOrderLineItem" sap:content-version="1">
<Key>
<PropertyRef Name="SalesOrderID"/>
<PropertyRef Name="ItemPosition"/>
</Key>
<Property Name="SalesOrderID" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Sales Order ID" sap:updatable="false"/>
（以下略）

```

- Property

```XML:
<Property Name="Address" Type="GWSAMPLE_BASIC.CT_Address" Nullable="false"/>
<Property Name="BusinessPartnerID" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Business Partner ID" sap:creatable="false" sap:updatable="false"/>
```

エンティティ型インスタンスまたは複合型インスタンスに格納されるデータの構造と特性を定義する。
RDBで言う項目定義に相当。

- Association

各Entity間のリレーションや多重度を表す。
RDBで言う、他テーブルとの関係を表す。
例えば、以下の箇所でEntity:SalesOrderとSalesOrderLineItemsがPropaty:SalesOrderIDで1:Nで紐づいている事が読み取れる。

```xml:
<Association Name="Assoc_SalesOrder_SalesOrderLineItems" sap:content-version="1">
<End Type="GWSAMPLE_BASIC.SalesOrder" Multiplicity="1" Role="FromRole_Assoc_SalesOrder_SalesOrderLineItems"/>
<End Type="GWSAMPLE_BASIC.SalesOrderLineItem" Multiplicity="*" Role="ToRole_Assoc_SalesOrder_SalesOrderLineItems"/>
<ReferentialConstraint>
<Principal Role="FromRole_Assoc_SalesOrder_SalesOrderLineItems">
<PropertyRef Name="SalesOrderID"/>
</Principal>
<Dependent Role="ToRole_Assoc_SalesOrder_SalesOrderLineItems">
<PropertyRef Name="SalesOrderID"/>
</Dependent>
</ReferentialConstraint>
</Association>
```

#Entityの中身の見方

以下解説する方法で、Entityの中身のデータを見る事ができる。
ABAPで言うと、SE16でテーブルの中身を見ているようなものである。

## 基本（全件出力）
`RootURL`+`EntitySet`で、中身を見る事ができる。
あまりデータ量が多いと取得に時間がかかる(SE16で抽出条件なしでVBAKを取得した場合を考えて頂きたい)ので後述する`top`オプションを活用すると良い。

例えばEntitySet:SalesOrderSetの中身を見てみる。

https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderSet

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/b0a2aa54-e6fa-98da-a157-d7d0810848a0.png)

## キー指定する
`RootURL`+`EntitySet`+`キーの値`で、表示対象のEntitySetを指定する事ができる。

https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderSet('0500000002')

SalesOrderLineItemSetのようにキーが複数存在するEntitySetの場合、次のような書き方でどのキーで絞り込むのか指定することもできる。

https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderLineItemSet(SalesOrderID='0500000003',ItemPosition='0000000010')

## フィルターをかける
`RootURL`+`EntitySet`+`?$filter=`+`フィルターしたいProperty = `+`フィルタの論理演算子`+`フィルターしたい値`でフィルターをかけられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378457/a7211e8a-1f69-6672-5a67-9bd456a2d6a5.png)

以下はCustomerIDが`0100000005`の受注データのみ絞っている。
https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderSet?$filter=CustomerID%20eq%20%270100000005%27

## 件数を絞り込む
例えば受注伝票のようにレコード数が膨大なデータをそのまま取得してしまうと、結果が帰ってくるまでに膨大な時間がかかってしまう恐れがある。
`RootURL`+`EntitySet`+`?$top=`+`出力したい件数`で出力対象件数を絞り込める。
SE16で出力件数を指定するのと同じような形である。

https://sapes5.sapdevcenter.com/sap/opu/odata/IWBEP/GWSAMPLE_BASIC/SalesOrderSet?$top=3

##後書き
他にも様々なオプションがあるが、詳しくは下記のサイトを参照されたし。

http://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part2-url-conventions/odata-v4.0-errata03-os-part2-url-conventions-complete.html#_Toc453752362

#参考
https://docs.microsoft.com/ja-jp/ef/ef6/modeling/designer/advanced/edmx/csdl-spec?redirectedfrom=MSDN#property-element-csdl

https://qiita.com/tami/items/4853415fdc826158618d