UiPath から SAP S/4HANA の OData を呼び出す - その１ OData API の探し方

# はじめに
SAP ECC 6.0 から SAP S/4HANA に世代交代がすすんで、 SAP と外部システムとの連携に OData を用いる機会も増えてきたように感じます。特に Fiori では、UI とバックエンド間の連携で OData が利用されていることもあり、OData の役割が今まで以上に高まってきています。

本記事では、SAP S/4HANA で公開されている購買発注の OData エンドポイントを使って、UiPath からの SAP OData 呼び出し方法について説明します。

:::note info
本記事に記載の内容は下記環境で動作確認しています。S/4HANA バージョン 1909 を利用している都合上、OData V2 を使っての説明となっています。V4 が利用できる場合は適時読み替えてください。
<table>
  <thead>
    <tr>
      <th>製品</th> <th>バージョン</th>
    </tr>
  </thead>
  <tr>
    <td>SAP S/4HANA</td>
    <td>1909 FPS00</td>
  </tr>
  <tr>
    <td>SAP GUI</td>
    <td>7.70</td>
  </tr>
</table>
:::

# OData とは
OData (Open Data Protocol) は RESTFul なアーキテクチャを用いた Web API の一種です。UiPath では Orchestrator をはじめとした各製品の API で OData が採用されているため馴染みのある方もいらっしゃるかもしれません。

OData の詳細を知りたい方は下記リンクよりご確認いただければと思います。

https://learn.microsoft.com/ja-jp/odata/

https://docs.oasis-open.org/odata/odata/v4.0/errata03/os/complete/part1-protocol/odata-v4.0-errata03-os-part1-protocol-complete.html

# UiPath と SAP は親和性が高い
UiPath リリース初期から SAP GUI/WebGUI などの GUI ベース自動化に対応しており、UIAutomation バージョン 2020.4 からは SAP GUI 専用のアクティビティも提供されるようになったりと継続的に改良が加えられており、リリースを重ねるごとに安定性が増しています。

また、BAPI の呼び出しを実現する [UiPath.SAP.BAPI.Activities](https://docs.uipath.com/ja/activities/other/latest/legacy-integrations/about-the-sap-bapi-activities-pack) が公式アクティビティパックとして提供されており、API 経由での SAP 自動化も比較的容易に実装することが出来ます。もちろん OData による API 呼び出しも実装可能です。

詳しくは UiPath 公式ブログに記事がございますのでご確認ください。

https://www.uipath.com/ja/community-blog/tutorials/sap-wingui-activities

https://www.uipath.com/ja/community-blog/tutorials/sap-table-data-automation

https://www.uipath.com/ja/community-blog/tutorials/sap-wingui-tree-structure

https://www.uipath.com/ja/community-blog/tutorials/sap-bapi-activities

# OData API の探し方

S/4HANA に限らず SAP 製品向けに公開されている OData API は SAP Business Accelerator Hub で探すことができます。

https://api.sap.com/

ご利用の S/4HANA の環境に応じて下記より製品を選択していきます。オンプレの場合は SAP S/4HANA を選択します。

* SAP S/4HANA Cloud Public Edition
* SAP S/4HANA Cloud Private Edition
* SAP S/4HANA

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/6075e280-4a1f-faf1-4c7c-323a236b79ac.png)

製品を選択したら、APIs → ODATA V2 または ODATA V4 と進んでいくことで API エンドポイントの一覧を見ることが出来ます。目的のエンドポイントが V2 と V4 の両方で提供されている場合、ご利用の SAP 環境で V4 を利用できるのであれば V4 をご利用いただくと良いかと思います。

今回利用する購買発注の OData API は [Purchase Order](https://api.sap.com/api/OP_API_PURCHASEORDER_PROCESS_SRV_0001/overview) となります。クリックして詳細を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/d75801e5-80a1-e1bb-41de-70a294f82616.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/a4adf8bf-8654-3762-ae8c-2fdcffbbc975.png)

API Reference → Purchase Order と進むと、CRUD ごとのエンドポイントが用意されていることを確認することができます。今回は、POST の ``/A_PurchaseOrder`` を利用します。

:::note info
OData V4 用のエンドポイントは [/PurchaseOrder](https://api.sap.com/api/OP_PURCHASEORDER_0001/resource/Purchase_Order) となります。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/5f502b15-1bce-b9cd-8614-c885f4de2b6d.png)

POST /A_PurchaseOrder をクリックすると、リクエストパラメータやレスポンス情報を確認できます。ぱっと見た感じではトランザクションコード ME21N から入力できる項目と同じように見えますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/fec1e84f-3fe4-6d7b-ae39-67b0b39ba31f.png)

# ご利用の SAP 環境で目的のエンドポイントが利用できるか確認する
ドキュメントで確認する方法と、ご利用の SAP 環境で確認する方法をご紹介します。

## ドキュメントで確認する
API の Overview にある Business Documentation をクリックすると SAP Help Portal にある該当 OData API のページが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/0f6a9550-661e-3697-22ef-e28f9aff6c2d.png)

ご利用中の S/4HANA のバージョンに切替えることでそのバージョンで API が利用可能か確認できるかと思います。（私が利用している 1909 FPS00 は選択肢に出てきませんでした）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/37cb2c80-7e2f-1c53-4fff-d1f8bf01d19f.png)

## 実環境で確認する
OData V2 の場合はトランザクションコード ``/n/IWBEP/REG_SERVICE`` にて確認できます。
Technical Service Name を入力して Display ボタンをクリックします。API が存在する場合は、API の説明を見ることが出来ます。

:::note info
``/n/IWBEP/REG_SERVICE`` のように先頭に ``/n`` を付けないと画面表示できないので必ず付与ください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/115a7530-ed82-efd6-31e1-32baf71a6380.png)

Technical Service Name は SAP Help Portal の 該当 OData API ページに記載の Technical name となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/57b06f7b-6e00-da6e-d7e2-089e7403b6a2.png)

検索結果です。私の SAP 環境で ``/A_PurchaseOrder`` を利用することが出来そうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/02fcd5b1-d4b3-e3e6-27ba-77055f6cb2c3.png)

# SAP GUI から OData を実行してみる

エンドポイントの利用可否を確認できたところで、次は SAP GUI から該当エンドポイントの動作確認をしてみます。トランザクションコードは ``/n/IWFND/GW_CLIENT`` です。

``/A_PurchaseOrder`` の URL は Overview ページにある Configuration Details をクリックすることで確認することが出来ます。

```
https://{host}:{port}/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/8a031eb5-1e14-143b-96e1-1cc292717495.png)

以下の情報を入力して、実行をクリックします。

<table>
  <thead>
    <tr>
      <th>製品</th> <th>バージョン</th>
    </tr>
  </thead>
  <tr>
    <td>HTTP メソッド</td>
    <td>POST</td>
  </tr>
  <tr>
    <td>プロトコル</td>
    <td>HTTPS</td>
  </tr>
  <tr>
    <td>要求 URI</td>
    <td>/sap/opu/odata/sap/API_PURCHASEORDER_PROCESS_SRV/A_PurchaseOrder</td>
  </tr>
  <tr>
    <td>要求 ヘッダ</td>
    <td>
Content-Type : application/json<br />
Accept : application/json<br />
sap-client : 接続先クライアント
    </td>
  </tr>
</table>

今回は以下のデモデータを使います。リクエストボディに貼り付けてください。

```json:リクエストボディ
{
    "CompanyCode": "1710",
    "PurchaseOrderType": "NB",
    "PurchasingGroup": "001",
    "PurchasingOrganization": "1710",
    "Supplier": "17300001",
    "to_PurchaseOrderItem": [
        {
            "Material": "TG11",
            "NetPriceAmount": "130.00",
            "NetPriceQuantity": "1",
            "OrderQuantity": "1",
            "Plant": "1710",
            "PurchaseOrderItemCategory": "0"
        }
    ]
}
```

画面に入力するとこのような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/58dfe268-36bf-a24d-d63c-18bd342fe798.png)

HTTP ステータス 201 が返ってきたので無事登録できたようです。レスポンスボディを見ると、伝票番号 4500000865 が発行されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322296/92544402-5c3b-3f82-4c98-40a71eca8d28.png)

# おわりに
長くなりましたので、本記事はここまでで終わりとします。
次の記事で UiPath から OData の購買要求 API ``/A_PurchaseOrder`` を使って OData API の呼び出し方法について説明します。

UiPath から SAP S/4HANA の OData を呼び出すシリーズ

https://qiita.com/MasahiroHarada1105/items/31e7d017082cf7ef2c73

https://qiita.com/MasahiroHarada1105/items/83f61fd0a22cd9dee825