日本アイ・ビー・エム株式会社が毎月開催しているIBM Powerユーザーのための自由な語り場「IBM Power Salon」(月1回、第二水曜日の朝9時から開催)をご存じでしょうか?
https://www.ibm.com/blogs/systems/jp-ja/ibm-power-salon/
2022年12月14日に開催された第13回の、株式会社 松沢書店様による「IBM i エンジニア不在でもDXはできる」では、既存IBM i環境を見事に活用し、DXを実現された素晴らしい事例が披露されました。
https://video.ibm.com/recorded/132400405
とはいえ、1時間の講演時間では語りきれなかった詳細は、きっと他のIBM i ユーザーの方にも参考になるはず!ということで、松沢書店 システム部部長の山口様に課題解決の方法について具体的にご説明いただきます。
第3回目の今回はIBM i に蓄積された貴重なデータを公開し、活用するというテーマで解説頂きます。これは何もわからずシステム担当になり、いくつかの運用コマンドしか引き継がれなかったという山口様が、日々蓄積されていくデータを活用するために、JDBCやODBCで接続し、APIを作成しWEBページを社内に公開し運用できる様になった悪戦苦闘のログでもあります。Power Salonではこれによりピッキング作業の効率が24%も改善されたとのお話がありましたが、その実現方法について詳細に解説頂きます。
第3回:様々な環境からIBM iに接続する
株式会社松沢書店
システム部
山口昌一
目的と概要と経緯
情報システム部などの部門が無く、所謂一人情シス状態になっている方は少なくないかと思います。私も最初はその状態で、IBM iに沢山の情報がある事は認識しておりましたが、出来上がったプログラム(RPG)以外から、社内に公開することが出来ずにいました。
私自身はRPGが書けないというか、RPGは私の範疇では無いという限界を勝手に定めて逃げておりました。そのためRPGで画面を作ればいいじゃないか、という一番近い選択肢を無視して、Javaで繋ぐ、PHPで繋ぐ、pythonで繋ぐという選択をいたしました。それがたまたまWebでデータを公開するという事に繋がったので結果オーライになりましたが、皆様は行き当たりばったりではなく、必要に応じた接続を選んで頂ければと思います。
※ 今回はコードメインになりますので、環境構築等は割愛しておりますので予めご了承ください。
1. PHP+ZendServerでIBM iのデータに接続する
▲図1. 環境 : IBM i上にZendServerがある場合
環境が無い場合は2からお読み下さい。(弊社はPHPQUERYを導入しているため環境が出来ておりました。)
1-1. 簡単な接続を書いてみる
実行すると以下の様に表示されます。
ZendServerがあるという恵まれた環境の場合、PHPにdb2_connectという非常に便利な関数があります。そのため非常に簡単にIBM iにある貴重なデータを取得できます。
- コードの解説はコメントにて記載しております。
- functionやdefineも同一のファイルに記載しております。お好みで分けて下さい。
- テーブルはQSYS2のAUTHIDSにしております。
- 文字化けについても特に考慮せず問題なく表示されるかと思います。
取り敢えず接続してみたいという要望であれば、数十行書けば接続できますので、是非お試し下さい。
1-2. ユーザー定義関数
簡単なスクリプトですぐに接続できることが分かりましたが、これだけでは面白くないので、SQLで使えるユーザー定義関数を作って実行してみます。
ユーザー定義関数とは
例えば
上記の様なCOUNTを取る関数を、自分で作成し定義することです。
極端な例ですが、「のプロファイル」という文字列をREPLACEで取り除くユーザー定義関数を作ってみます。
ユーザー定義関数の作成変更は
「CREATE OR REPLACE FUNCTION ライブラリ/関数名(引数)」
という形式になります。
RETURNS は戻り値の型になります。
REPLACEで「のプロファイル」を取り除いたものをRETURNSで指定した型で戻します。
PHPで実行する際は
上記の様に引数に定義した型にキャストして呼び出してあげます。
当たり前ですが「のプロファイル」は空文字に置き換えられてすっきり表示が出来ました。
この様にIBM iで定義した関数もSQLを書く事でPHPから簡単に呼べます。
- STRSQLで関数を確認する場合はSTRSQLの前にCHGJOB CCSID(5035)を実行してから行って下さい。
- 作成した関数を確認する場合は、
http://IBM iのIP:2004/ibm/console/
に接続し「データベース」→「データベース」→「データベース名」→「スキーマ」→「先ほど作成したライブラリ」を選択することで作成した関数を確認出来ます。
スキーマに先ほどのライブラリが無い場合は以下の様に
「データベース」→「データベース」→「データベース名」→「スキーマ」
右画面のアクションで「表示するスキーマの選択」から追加してください。
2.ネットワーク上のサーバーからIBM iに接続する
先ほどはIBM i上にZendServerがあるというかなり都合の良い環境でした。
しかしそういう環境が無く、別のサーバーにPHP環境がある(図2)ケースでの接続方法をご説明します。
環境 Windows11
2-1.ODBCデータソースを登録します
※ ODBCの導入につきましては
https://iworldweb.info/column/serials/dekiruIBM i_no8
IBM佐々木様の記事をご確認下さい。分かり易いです。
上記を参考にPHP用のDSNを作成してください。今回は「TESTIBM i」という名前で作成致しました。DSN設定時のライブラリリストはご自分が良く使うライブラリで問題ございません。コード上で「ライブラリ.ファイル名」で指定した以外のライブラリも呼び出せます。
2-2. 注意点
php.iniで以下の項目の「;」セミコロンを削除してコメントアウトを解除してください。
extension=odbc
extension=pdo_odbc
extensinon=mbstring
2-3.PHPの接続コード
取得して表示するだけであればこんなに簡単なコードで済みます。注意点としては文字化け対策として
上記関数を使用しております。これを使用しないと「㈱」等の文字が文字化けしてしまいますのでご注意下さい。
3.他の言語も試してみる Java
3-1. Java接続の開発環境と注意点
開発環境
Intellij community(無料版)
Build system: Gradle
JDK:11
※Intellijはbuildでエラーが出まくりますが基本JDKのversionの問題が多いです。エラーメッセージをコピペして検索すると、全く論点の違う議論に辿り着き、すごく難しい事をした挙句解決しません。
https://docs.gradle.org/current/userguide/compatibility.html
上記サイトで互換性を確認してJDKを適切なものに設定下さい。
jt400を使用するためにBuild.gradleを以下の様に変更します。
上記を追加しております。jt400.jarをDLして配置などはしなくて問題ございません。
3-2.Javaでの接続コード
ポイントは以下接続文字列
カラム取得方法
添字は1からになります。
こちらも簡単に取得できました。
3-3.jt400は非常に便利ですので、少し便利な機能を紹介致します。
以下のコードはカラム名とカラムヘディングを取得できます。英語だとわかりづらいなと言う時に、日本語のカラムヘディングを取得できます。
ポイントはIBM iのIPを指定
見たいライブラリ、ファイル名を以下の様に指定です。
あとがき
今回は色々な環境からIBM iに接続してみました。単純に接続するだけなら少しのコードで接続できますので、あのデータをどこかで使いたいなというアイデアがあれば是非ご活用下さい。
折角接続できたので次回は簡単なAPIを作ってみます。