minisap のライセンス更新
minisap とは
S/4HANAで開発界隈の仕事をしていると、気軽に色々試せる環境が欲しくなることがあります。 恵まれている方は社内にサンドボックス機があったりしますが、その場合でも少しディープなベーシス権限が要ると面倒くさい手続を求められますし、フリーランスで働くような場合は顧客の開発機でしか試せなかったりするので、自ずと「冒険」はし難くなってしまいます。
そのようなニーズに応えるため、SAP社は開発者向けに minisap と呼ばれる Netweaver アプリサーバを用意してくれています。 SAPアプリ、つまりモジュールは何も入っていない反面、ベーシス部分は HANA DB を含めて S/4HANA とほぼ同等の環境が整った Docker イメージが配布されており、無料で利用可能です。 現在は ABAP Cloud Developer Trial 2022 の SP1 が配布されています。 (こちらのインストールについてはいつか稿を改めて書くつもりです。)
利用期間は90日に制限されますが、ありがたいことに無料でライセンス更新が可能で、更新後はまた90日間利用が可能です。
ライセンス有効期限の確認
前置きが長くなりましたが、ここからが本題の更新手順です。
基本的に手順書の記載に従って進めます。
まずクライアント 000 に管理ユーザ SAP* でログオンし、Tr-cd: SLICENSE を実行します。
更新前は、ステータス欄が黄色でワーニング表示され、End Date が迫っていることが分かります。
ここでハードウェアキーの情報を取得しておきます。
(画像では意図的に隠していますが、SIDの右隣列や Current Settings のセクションに表示されます。)

新ライセンスファイルの取得
開発者ライセンスの配布サイトにアクセスし、該当システム(ここではA4H)を選択します。
下部の Personal Data & System Info に名前・メールアドレス・ハードウェアキーを記載し、License Agreement に同意して Generate を押下すると、新しいライセンスファイルがダウンロードされます。(A4H_Multiple.txt)

新ライセンスのインストール
再度 SLICENSE の画面に戻り、A4Hでは旧ライセンスが残っているとエラーが出るため、(-) マークの Delete License ボタンを押して旧ライセンスの行を削除します。

次に Install New License ボタン(F6でも可)を押下し、先に取得した新ライセンスファイルを取り込みます。

結果を確認し、Status が緑色に変わっていたらインストール成功です。

まとめ
minisap は何かと便利に使えますが、Docker イメージでの配布であるため、ライセンス切れ時の対応はやや面倒です。 ライセンス更新時に有効期限日をチェックし、予定表アプリ(Outlookとか)で更新忘れがないよう管理することをお勧めします。
Odoo Community 版に「ホーム」画面を追加する
Odoo Community Edition とは
最近、Pythonで書かれたオープンソースERPの Odoo を試しています。オープンソースプロジェクトにありがちな話ですが、これには有料の Enterprise 版と無料の Community 版があり、Community 版にもそこそこ多くのモジュールが含まれてはいるものの、「あと一歩!」な部分はしっかり Enterprise 版限定扱いにされています。まぁそうでないと商売にならないし、そもそも企業で使うならサポートのない Community 版は選びにくいのですよね。
但し、PythonにPypiがあるように、Odooにはアプリストアが存在して、3rdパーティー製を含め機能追加を行うことができます。Community 版を利用する場合、運が良ければEnterprise版との差異を埋めてくれる機能が公開されていることもあります。
「ホーム」画面がない!
ここから今日の本題です。Enterprise版にはCommunity版にはない「ホーム画面」が存在します。あまり良いリンクが見つからなかったのですが、こちらの動画の3分20秒過ぎに現れるのがそれです。
幸いなことに、これをカバーする3rdパーティー製モジュールは複数公開されています。今回は MuK Backend Themeを試してみました。
設定方法の概要
今回は詳細までスクショ取りませんでした。(申し訳ない、、)
- アプリストアからダウンロードしモジュールを抽出
- 該当モジュールをアドオンフォルダにコピー
- (開発者モードで)アプリリストを更新
- 当該モジュールを有効化
結果
適用後は左上のタイル様アイコンから「ホーム」画面にアクセス可能となり、各アプリを呼び出せるようになります。めでたしめでたし。

pyodata - Python OData V2 Client を試す
ご挨拶
お初にお目にかかります、RedDemio と申します。SAP界隈の技術者稼業で生計を立てております。自身の備忘を兼ね、技術系のネタを今後こちらに貼らせて頂こうと思い立ち、ブログ開設致しました。悪文乱筆ご容赦頂けますと幸いです。
pyodata について
さて、S/4等で立ち上げたサービスに対しクライアントとして OData 連携を行う際、POST等のデータ更新系の処理ではトークン(CSRF Token)を事前取得したうえで改めてリクエストを行う必要があります。 クライアントとして Python を用いて開発する場合、pyodata ライブラリを使うとトークン処理やJSON/XMLのパースをまとめて処理してくれるため、大変便利です。
サンプルコード
Read
データ抽出(Read)のサンプルコードは以下の通りです。(URLや認証情報は適宜読み替えてください)
import requests, pyodata SERVICE_URL = "https://enter.your.ip.address:port/sap/opu/odata/SAP/YOUR_SERVICE/" session = requests.Session() session.auth = ('USERID','Password') session.params = {'sap-client': '999'} service = pyodata.Client(SERVICE_URL, session) records = service.entity_sets.YOUR_ENTITY_SET.get_entities().select('Key01,Key02,Field03,Field04').execute() for r in records: print(f"{r.Key01}\t{r.Key02}\t{r.Field03}\t{r.Field04}")
Create
データ登録(Create)のサンプルコードは以下の通りです。
import requests, pyodata SERVICE_URL = "https://enter.your.ip.address:port/sap/opu/odata/SAP/YOUR_SERVICE/" session = requests.Session() session.auth = ('USERID','Password') session.params = {'sap-client': '999'} response = session.head(SERVICE_URL, headers={'x-csrf-token': 'fetch'}) token = response.headers.get('x-csrf-token', '') session.headers.update({'x-csrf-token': token}) service = pyodata.Client(SERVICE_URL, session) record = { 'Key01': '8000000009', 'Key02': '00010', 'Field03': '100', 'Field04': 'TESTMAT0001', } request = service.entity_sets.YOUR_ENTITY_SET.create_entity() request.set(**record) new_entity = request.execute()
Update
データ更新(Update)のサンプルコードは以下の通りです。
import requests, pyodata SERVICE_URL = "https://enter.your.ip.address:port/sap/opu/odata/SAP/YOUR_SERVICE/" session = requests.Session() session.auth = ('USERID','Password') session.params = {'sap-client': '999'} response = session.head(SERVICE_URL, headers={'x-csrf-token': 'fetch'}) token = response.headers.get('x-csrf-token', '') session.headers.update({'x-csrf-token': token}) service = pyodata.Client(SERVICE_URL, session) request = service.entity_sets.YOUR_ENTITY_SET.update_entity(Key01='8000000009',Key02='00010') request.set(Field04='TESTMAT0002') request.execute()
Delete
データ更新(Delete)のサンプルコードは以下の通りです。
import requests, pyodata SERVICE_URL = "https://enter.your.ip.address:port/sap/opu/odata/SAP/YOUR_SERVICE/" session = requests.Session() session.auth = ('USERID','Password') session.params = {'sap-client': '999'} response = session.head(SERVICE_URL, headers={'x-csrf-token': 'fetch'}) token = response.headers.get('x-csrf-token', '') session.headers.update({'x-csrf-token': token}) service = pyodata.Client(SERVICE_URL, session) request = service.entity_sets.YOUR_ENTITY_SET.delete_entity(Key01='8000000009',Key02='00010') request.execute()
まとめ
サンプルコードから雰囲気は感じて頂けたかと思いますが、Python を OData 接続のクライアントとして利用する際、pyodata を使うと大変楽に開発することができます。他方、このライブラリは OData V4 には非対応のため、V4 接続する際には別のライブラリを試す必要がありそうです。