2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Node.jsからRPGIIIの呼び出し

Last updated at Posted at 2025-10-28

目次

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

レコードが作成されていませんでした。
image.png

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

レコードが作成されていました。
呼び出し成功です。
image.png

4.まとめ

目的としていた「Nodo.jsからIBMi上のRPGIIIプログラムを実行し、テーブルを更新すること。」について、
RPGIIIを直接呼び出すことはできませんでしたが、CLを介することによって達成することができました。

RPGIIIやCLなどは普段の業務でも使っています。
普段使い慣れているがゆえに思わぬ落とし穴がありましたが、そこも踏まえて再認識できたことはよい経験でした。
「Nodo.js」は今回初めて触れる機会を得ました。
はじめはなかなかうまくいかずに苦戦していましたが、だんだんとわかってきてプログラムが実行された時はうれしかったです。

10年近くIBMiに触れてきましたが、まだまだ知らないことがたくさんあると実感しました。
これから先新しいことだけではなく既存のIBMiの機能などももっと学んでいきたいです。

5.参考サイト

Node.jsでWebアプリを作ってみよう
nodejs-itoolkit のドキュメント

当記事の著作権はIBMに帰属します。
詳細はこちらを参照ください

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?