XplentyでSAP HANA CloudにOData経由で接続し、データを取得してみた

今回はSAP HANA CloudのSandbox環境を使用し、ODATAでアクセスする方法についてご紹介します。

#ODataとは？
こちらのブログに詳細が分かりやすくまとまってますので、こちらを参照ください。
https://qiita.com/tami/items/411a226d1ea6bb25b5f1

#SAP API Business Hubでリクエストに必要な情報を取得する
今回はSandboxにあるSales OrderのODataサービスに接続します
まず、[SAP API Business Hub](https://api.sap.com/package/SAPS4HANACloud?section=Artifacts)にアクセスします。

1.条件を指定し、Sales Order (A2X)を選択します。（同期 OData API）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/222655ef-bb8f-c74e-a8b8-651789371e0c.png)

2.ログインし、Show API keyクリックすると、API keyを取得することができます。ここで表示されたAPI Keyをメモしておきます。(Basic認証でアクセスが必要なODataサービスの場合、ユーザー、パスワードをメモします）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/e5817414-2dfc-6522-f4bc-09b729cbe615.png)

3.Sandbox環境に対してリクエストを実行すると、実行時の条件に応じて設定されたURLを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/356b3377-453a-5390-3503-2b8d3a3a05ca.png)

URLは以下のとおりです。
https://sandbox.api.sap.com/s4hanacloud/sap/opu/odata/sap/API_SALES_ORDER_SRV/A_SalesOrder?%24top=50

#XplentyでSAP HANA CloudにOData経由で接続し、データを取得する

##1. Xplenty データソース接続
1.パッケージ作成画面で「**REST API**」コンポーネントを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/7ff421e7-e3d2-1da9-6a66-a6dd8ad7107c.png)

2.認証およびリクエストURLの設定
**API Keyによるアクセスの場合**
前の章の手順2と3でメモしたAPI KeyとURLをそれぞれ、以下のようにセットする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/d9a95a90-6ed6-614d-ce9f-3aab2ae49236.png)

**（注）Basic認証によるアクセスの場合は以下を参照ください。**
AuthenticationでBasicを選択し、ログインユーザーとパスワードをセットした後、手順3でメモしたURLを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c36c1cc9-1e38-2d2f-8600-e9c566e0d9c0.png)

3.レスポンスのJSONのパスをセットする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/fe45f77a-8a7b-4b96-f3e1-ff9d8178b084.png)

4.取得した結果を確認
実際に取得したデータをプレビューすると非常にシンプルなJSONデータです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/47a54e3b-6d37-876f-26ca-1fb9752a3b82.png)
全ての列を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/8545e971-5ee1-d10b-c265-dd7356073bb9.png)

##Xplenty データ加工
1.JSONデータの一部でデータの加工が必要なため、Selectコンポーネントで加工を行う。
**変換処理その１:日時データの変換**
取得されたJSONをみると日付データが以下のように取得されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/c42b344f-8bf6-4d1a-a7e6-fcf47f851391.png)

[こちらの投稿](https://blogs.sap.com/2017/01/05/date-and-time-in-sap-gateway-foundation/)によると、以下のようなルールがあるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/2479f34b-0490-fbfa-80e1-be2a1e14f444.png)
JSONでは**1970年1月1日午前0時**からのミリ秒で時間が表されているため、通常の日時フォーマットに変換するには、以下の加工を行う必要がある。
REGEX_EXTRACT関数を使用した数値部分のみの取得例：
`REGEX_EXTRACT('/Date(1467981296000)/','([0-9]+)',1)`
上記の式をもとに日時フィールドを変換する
例）時間はUTCから日本時間(+9時間)に変更
`AddDuration(ToDate('1970-01-01T00:00:00.000Z'),CONCAT('PT',((chararray)((long)REGEX_EXTRACT(CreationDate,'([0-9]+)',1)/1000+(9*60*60))),'s')) `
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/587a4e5c-27d7-afeb-18f4-5e5cb413f894.png)

**上記関数式の説明：**
`ToDate`:DateTime型へ変換
`(long)`：long型への変換　**>>注意**：ここで`Double`型を指定した場合は、Round関数を使用し少数点のけた数を３桁までに調整する必要がある）
`(chararray)`：文字列型への変換
`/1000`：`AddDuration`関数が秒単位でしか加算できないため（ただし、0.003のように小数点でミリ秒を表現することは可能です）、ミリ秒の単位の数値を秒単位に変換
`9*60*60`：9時間を秒数に変換

**CASE文使用時の注意点**
CASE文を使用する場合、必ずELSE条件も明記する必要がある

**変換処理その2： ネストされたJSONから必要な値を抽出**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/d8ab077b-5fdf-a699-62e3-dad879ae9f04.png)

上記JSON部分を`JsonStringToMap`関数を使用し、Selectコンポーネントで変換する。
例)`JsonStringToMap(to_Item#'__deferred')#'uri'`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/61bc3c1a-dc57-f281-58aa-831216c93ab7.png)
##Xplenty データロード先の設定およびジョブ実行
1.ロード先のデータベースを指定
データベースコンポーネントをDestinationに配置し、ロード先として設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/680f6675-b870-c30d-ac8a-fe2a01bedb31.png)

2.ジョブを実行し、結果を確認する
先ほどのSELECTコンポーネントで実装したDatetimeの変換処理およびJsonStringToMapでデータが正しく変換、取得されていることをロード先のデータベース（MySQL）で確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65461/3839bd52-bbad-8633-7a18-4773e360b8d1.png)

#最後に
今回はSAPの受注（Sales Order）データをODataサービス経由で取得しました。これ以外にも、購買発注（Purchase Order）や出荷（Outbound Delivery）、入庫（Inbound Delivery）などのデータも同様に取得することが可能です。また、HANA側で分析用のテーブルやビューを作成し、ODataサービスを介してデータを取得することも可能です。

実際に実戦で使う場合は、APIのPaginationの設定についてXplenty側で対応する必要があります。もし、ご興味のある方は、[XplentyのHP](https://www.xplenty.com/jp)からチャットもしくは「オンライン相談」でご相談ください。