目次
大友(yomon8)です。
最近、私が参画しているプロジェクトでは、WEBアプリの開発にStreamlitを使う事例が増えてきています。デザインを追求しなくても良いなら、小さなWEBアプリをとても気軽に作ることができ、Pythonでデータの取得からフロントまで記述できるのが素敵なポイントだと思います。
SAPのデータを呼び出すための簡単なサンプルアプリを作ってみましたので、ここで紹介させていただきます。
Streamlitとは
Streamlitですが去年、Snowflakeに買収されニュースになったので、そちらから知った方もいるかもしれません。
Snowflakeに関係があるくらいなのでデータ関連です。こちらの公式ページにある説明を引用してきますと、以下の通りです。
A faster way to build and share data apps
Streamlit turns data scripts into shareable web apps in minutes.
All in pure Python. No front‑end experience required.
ざっくりと意訳すると、データ関連のWEBアプリをPythonだけで簡単に作れるツールです。
簡単なStreamlitアプリを作ってみる
どのくらい簡単か説明するためにWEBアプリを作ってみます。手元に、以下のようなdata.csvというCSVファイルがあるので、こちらをWEBで表示できるようにしてみます。
A,B,C
1,2,3
11,12,13
101,102,103
三行のPythonを publish_csv.pyとして保存します。
import streamlit as st
import pandas as pd
st.dataframe(pd.read_csv("./data.csv"))
後はstreamlitコマンドで起動すればWEBサーバーが立ち上がりますので、
streamlit run publish_csv.py
ブラウザでアクセスするとCSVがテーブル表示されています。本当にシンプルなアプリではありますが、簡単だということが伝わればと思います。
シンプルなアプリだけでなく、作り込むことで多機能なアプリも開発できます。以下のページでデモアプリが公開されているので、どのようなことができるかを見てみると面白いと思います。
本当に作り込む場合はフロント開発用の技術の利用を検討した方が良いと思います。データエンジニアのようなPythonを習得済みの方が、分析したデータを見せるためのフロント開発をするにはとても合っている技術と言えます。
StreamlitでSAP情報を表示するアプリを作ってみた
前置きが長くなりましたが、SAPの情報を表示するアプリを作ってみました。
簡単なアプリですが、ここから少し説明を書いていきます。
前提
- Git
- Docker
- Sユーザ(SAP NW SDKのダウンロードに利用)
- Python(開発に必要。動かしてみるだけなら不要)
利用準備
リポジトリをクローン
上記に記載したGithubリポジトリからソースコードをクローンします。
$ git clone https://github.com/beex-inc/sap-streamlit-app-sample.git
次にクローンしたリポジトリに移動します。
$ cd sap-streamlit-app-sample/
SAP NetWeaver RFC SDK取得・配置
以下の情報を参照してダウンロードしてきます。Sユーザが必要になります。
SAP NetWeaver Remote Function Call (RFC) Software Development Kit (SDK)
2573790 - Installation, Support and Availability of the SAP NetWeaver RFC Library 7.50
今回ダウンロードしたのは「nwrfc750P_10-70002752.zip」 というファイルです。参考までにダウンロード画面を貼っておきます。
以下のように resources/フォルダにnwrfcsdk.zipという名前で移動します。
$ mv nwrfc750P_10-70002752.zip resources/nwrfcsdk.zip
$ ls -l resources/
合計 19276
-rw-rw-r-- 1 ec2-user ec2-user 19737469 1月 14 13:06 nwrfc750.zip
これでSAP NetWeaver RFC SDKの配置が完了しました。
アプリのビルドと起動
以下の通りコマンドを打っていくとWEBアプリが立ち上がります。
# アプリ起動情報
IMAGE_NAME=sap-streamlit-app-sample # 任意のDockerイメージタグ
LISTEN_PORT=8501 # 任意の待ち受けポート
# SAP接続情報
SAP_HOST=xxx.xxx.xxx.xxx # SAP Host or IP
SAP_SYSNR=nn # SAP システム番号
SAP_CLIENT=nnn # SAP クライアント番号
SAP_USER=**** # SAP ユーザ(権限があるユーザ)
SAP_PASSWORD=***** # SAP ユーザパスワード
# Dockerイメージのビルド
docker build -t ${IMAGE_NAME} .
# 設定した変数を使ってアプリの立ち上げ
docker run -p ${LISTEN_PORT}:8501 ${IMAGE_NAME} \
--host ${SAP_HOST} \
--sysnr ${SAP_SYSNR} \
--client ${SAP_CLIENT} \
--user ${SAP_USER} \
--password ${SAP_PASSWORD}
コマンドを打つと以下のような画面で待ち受けになるはずです。
もしローカルPCで作業している場合は、「http://localhost:8501」でWEBアプリに接続できます。
WEBアプリを使ってみる
起動したアプリにアクセスして画面を見てみます。サイドバーからtop/read table/user listの3ページが選べます。
Top画面
Topには接続情報を確認できるようにしています。
なお、この記事で利用しているSAP環境はCALで一時的にGoogle Cloud上に作った空のSAP NetWeaver AS ABAP 7.51 SP02環境で、データはほとんど何も入ってません。
User List画面
次にuser listの画面に飛んでみます。ユーザの一覧をテーブル表示しています。
BAPI_USER_GETLISTとBAPI_USER_GET_DETAILの二つのBAPIを利用していますが、このページのコードはこれだけです。
import streamlit as st
import pandas as pd
from top import sap_connection
user_list_resp = sap_connection.call("BAPI_USER_GETLIST", MAX_ROWS=4)
records = []
for u in user_list_resp["USERLIST"]:
user_name = u["USERNAME"]
record = {"Name": user_name}
res = sap_connection.call("BAPI_USER_GET_DETAIL", USERNAME=user_name)
record.update(res["ADDRESS"])
records.append(record)
df = pd.DataFrame.from_dict(data=records)
st.markdown("# User List")
st.dataframe(df)
Read Table画面
最後にRead Tableに飛んでみます。ここは左の入力欄にテーブル名を入れてEnterを押すことで、RFC_READ_TABLEのBAPIを利用してテーブルの内容を読み込み表示してくれます。(大きなテーブルなどはエラーが出るものもあります)
最後に
一昔前までは、SAPと連携するとなると小さなアプリを作るにもかなりの手間がかかっていたと思います。しかし、現在ではちょっとした簡単なアプリなら手数が少なく開発できるようになってきています。
ここで公開しているのはあくまでサンプルアプリであり、エラーハンドリングや細かいテストは実施していないので、利用する場合はご注意ください。