目次
1.目的
2.環境説明
3.Nodo.jsからRPGIIIプログラムを呼び出す方法
4.まとめ
5.参考サイト
1.目的
Nodo.jsからIBMi上のRPGIIIプログラムを実行し、ファイルを更新することを目的とします。
2.環境説明
- IBM i :7.3
- CCSID:5035(ジョブ・ユーザーともに同じ)
- Node.js:v22.13.1
- 使用モジュール:itoolkit
3.Nodo.jsからRPGIIIプログラムを呼び出す方法
3-1. 実行JSファイル
RPGIIIプログラムを呼び出すJSファイルを、IFSフォルダ上にアップロードします。
今回は以下のように配置します。
/home/TEST/calltestrpg.js
JSファイル calltestrpg.js の記述は以下の通りです。
itoolkitライブラリを使用し、IBMi上のRPGIIIプログラムをNodo.jsから実行します。
※「/home/TEST/node_modules/itoolkit」「IPアドレス」「ユーザーID」「パスワード」「TESTRPG」「TESTLIB」については各自の環境に合わせて変更してください。
const http = require('http');
const { Connection, ProgramCall } = require('/home/TEST/node_modules/itoolkit');
const connection = new Connection({
transport: 'ssh',
transportOptions: { host: 'IPアドレス', username: 'ユーザーID', password: 'パスワード' },
});
//RPG呼出し設定
const program = new ProgramCall('TESTRPG', { lib: 'TESTLIB' });
connection.add(program);
//RPG実行
connection.run((error) => {
if (error) {
throw error;
}
});
3-2. 実行プログラム
実行するRPGIIIプログラムの記述は以下の通りです。
テストファイル「TESTP」にレコードを追加、もしくは更新するシンプルなプログラムです。
TESTLIB/TESTRPG
H Y
F*****************************************************************
F* F仕様書 ファイル 定義 *
F*****************************************************************
F* テストファイル
FTESTP UF E K DISK A
I*****************************************************************
I* DS データ エリア *
I*****************************************************************
I*
I DS
I 1 140WKTMDT
I 1 60WKTIME
I 9 140WKDATE
C*****************************************************************
C* C仕様書 演算処理 (1.0) *
C*****************************************************************
C*
C EXSR #INIT *(2.0)
C*
C EXSR #MAIN *(3.0)
C*
C EXSR #END *(4.0)
C*
C SETON LR
C RETRN
C*
C*****************************************************************
C* #INIT 前処理 (2.0) *
C*****************************************************************
C*
CSR #INIT BEGSR
C* *日時設定
C TIME WKTMDT
C*
CSR #INITE ENDSR
C*
C*****************************************************************
C* #MAIN 主処理 (3.0) *
C*****************************************************************
C*
CSR #MAIN BEGSR
C*
C READ TESTP 99
C*
C 99 EXSR #INS
C N99 EXSR #UPD
C*
CSR #MAINE ENDSR
C*
C*****************************************************************
C* #END 後処理 (4.0) *
C*****************************************************************
C*
CSR #END BEGSR
C*
C*
CSR #ENDE ENDSR
C*
C*****************************************************************
C* #INS 登録処理 (3.1) *
C*****************************************************************
C*
CSR #INS BEGSR
C*
C Z-ADD1 TECONT
C*
C MOVEL'TESTINS' TEADDU
C MOVEL'TESTRPG' TEADDP
C Z-ADDWKDATE TEADDD
C Z-ADDWKTIME TEADDT
C*
C WRITETESTR
C*
CSR #INSE ENDSR
C*
C*****************************************************************
C* #UPD 更新処理 (3.2) *
C*****************************************************************
C*
CSR #UPD BEGSR
C*
C ADD 1 TECONT
C*
C MOVEL'TESTUPD' TEUPDU
C MOVEL'TESTRPG' TEUPDP
C Z-ADDWKDATE TEUPDD
C Z-ADDWKTIME TEUPDT
C*
C UPDATTESTR
C*
C*
CSR #UPDE ENDSR
C*
3-3. プログラム実行
5250エミュレーターのコマンドラインからQP2TERMを起動します。
CALL QP2TERM
IFS上に配置したjsファイルを実行します。
node calltestrpg.js
3-4. ファイルを確認
SQLスクリプトを実行し、テストファイル「TESTP」を確認します。
select * from testlib.testp
3-5. 更新できない原因
5250エミュレーターで直接プログラムを実行すると、レコードは追加されることは確認済みでした。
なぜNode.jsからの呼び出しでRPGIIIプログラムが実行されないのでしょうか。
チームメンバーと話し合ったところ、原因は ライブラリリスト ではないかと結論付けました。
5250エミュレーターで直接プログラムを実行できていたのに、なぜでしょう。
ここで思わぬ落とし穴がありました。
プログラムを記述後、コンパイルするときに無意識に行っていたことがあります。
それは5250エミュレーター上で EDTLIBL コマンドを実行し、ライブラリリストに TESTLIB を追加していたことです。
JSファイルで指定したユーザーでログインした後のライブラリリストはデフォルト値です。
プログラムのあるライブラリは指定しているので、プログラムは実行はできているようですが、対象ファイルが存在しないためにエラーとなっていたようです。
const program = new ProgramCall('TESTRPG', { lib: 'TESTLIB' });
そこで解決策として、Nodo.jsからRPGIIIプログラムを呼び出すのではなく、CLプログラムを呼び出す方法に変更しました。
CLプログラム内で ADDLIBLE をすることで、解決できるのではと考えました。
それでは実際にCLプログラムを呼び出す方法について記述していきます。
3-6. 実行JSファイル(CL用)
CLプログラムを呼び出すJSファイルを、IFSフォルダ上にアップロードします。
以下のように配置します。
/home/TEST/calltestcl.js
JSファイル calltestcl.js の記述は以下の通りです。
itoolkitライブラリを使用し、IBMi上のCLプログラムをNodo.jsから実行します。
3-1.の記述からの変更点は呼出し設定のプログラムを TESTCL に変更したのみです。
const http = require('http');
const { Connection, ProgramCall } = require('/home/TEST/node_modules/itoolkit');
const connection = new Connection({
transport: 'ssh',
transportOptions: { host: 'IPアドレス', username: 'ユーザーID', password: 'パスワード' },
});
//CL呼出し設定
const program = new ProgramCall('TESTCL', { lib: 'TESTLIB' });
connection.add(program);
//CL実行
connection.run((error) => {
if (error) {
throw error;
}
});
3-7. 実行プログラム(CL用)
実行するCLプログラムの記述は以下の通りです。
TESTRPG を実行する前に、ADDLIBLE によってライブラリリストに TESTLIB を追加しています。
TESTLIB/TESTCL
PGM
/*ライブラリリスト追加*/
ADDLIBLE LIB(TESTLIB)
MONMSG MSGID(CPF0000)
/*テストプログラム実行*/
CALL PGM(TESTRPG)
ENDPGM
3-8. プログラム実行(CL用)
3-3.と同様に5250エミュレーターのコマンドラインからQP2TERMを起動します。
CALL QP2TERM
IFS上に配置したjsファイルを実行します。
node calltestcl.js
3-9. ファイルを確認
SQLスクリプトを実行し、テストファイル「TESTP」を確認します。
select * from testlib.testp
4.まとめ
目的としていた「Nodo.jsからIBMi上のRPGIIIプログラムを実行し、テーブルを更新すること。」について、
RPGIIIを直接呼び出すことはできませんでしたが、CLを介することによって達成することができました。
RPGIIIやCLなどは普段の業務でも使っています。
普段使い慣れているがゆえに思わぬ落とし穴がありましたが、そこも踏まえて再認識できたことはよい経験でした。
「Nodo.js」は今回初めて触れる機会を得ました。
はじめはなかなかうまくいかずに苦戦していましたが、だんだんとわかってきてプログラムが実行された時はうれしかったです。
10年近くIBMiに触れてきましたが、まだまだ知らないことがたくさんあると実感しました。
これから先新しいことだけではなく既存のIBMiの機能などももっと学んでいきたいです。
5.参考サイト
Node.jsでWebアプリを作ってみよう
nodejs-itoolkit のドキュメント
当記事の著作権はIBMに帰属します。
詳細はこちらを参照ください

