LoginSignup
1
2

More than 5 years have passed since last update.

node-jt400を試してみた(Programs)

Last updated at Posted at 2017-08-30

Programs

プログラムを呼び出してみます。

CLLE(パラメータ無し)

パラメータ無しの単純なCLプログラムをCALLしてみます。

MYLIB/SMPL010C.CLLE
             PGM                                                     
             SNDMSG MSG('SMPL010C が呼ばれました ') TOMSGQ(*SYSOPR)  
             ENDPGM                                                  
Programs.JS
app.get("/smpl010c", function (req, res, next) {
  var SMPL010C = pool.pgm('SMPL010C', []); 
  SMPL010C({}).then(
    function (result) {
      res.send(result);
    });
});

プログラムの呼び出しは一つ制約があります。
それは、ライブラリリストに必ず実行するプログラムが存在する事です。
以下は全てNGでした。

var SMPL010C = pool.pgm('MYLIB/SMPL010C', []); 
var SMPL010C = pool.pgm('MYLIB.SMPL010C', []); 
var SMPL010C = pool.pgm('/QSYS.LIB/MYLIB.LIB/SMPL010C.PGM', []); 

nodejt16.png

nodejt17.png

RPGLE(パラメータ有り)

パラメータ有りのRPGLEをCALLしてみます。

MYLIB/SMPL011R.SQLRPGLE
      *                                                                            
      * CRTSQLRPGI OBJ(MYLIB/SMPL011R) SRCFILE(MYLIB/QRPGLESRC) DBGVIEW(*SOURCE)
      *                                                                            
     H DFTACTGRP(*NO)                                                              
     D main            PR                  EXTPGM('SMPL011R')                      
     D                                3P 0                                         
     D                               12A                                           
     D                               12A                                           
     D                               40A                                           
     D                                7P 3                                         
     D main            PI                                                          
     D id                             3P 0                                         
     D lname                         12A                                           
     D fname                         12A                                           
     D prof                          40A                                           
     D tokuten                        7P 3                                         

     D stmt            S            512A                                           
     /free                                                 

         stmt = 'insert into member' +                     
                ' values(?, ?, ?, ?, ?)';                  
         exec sql prepare s1 from :stmt;                   

         exec sql execute s1                               
               using :id, :lname, :fname, :prof, :tokuten; 

         tokuten = tokuten + 100;                          

         *inlr = *on;                                      

         return ;                                          

     /end-free                                             
Programs.JS
app.get("/smpl011r", function (req, res, next) {
    var SMPL011R = pool.pgm('smpl011r', [
        { type: 'DECIMAL', precision:  3, scale: 0, name: 'id' },
        { type: 'CHAR',    precision: 12, scale: 0, name: 'lname' },
        { type: 'CHAR',    precision: 12, scale: 0, name: 'fname' },
        { type: 'CHAR',    precision: 40, scale: 0, name: 'prof' },
        { type: 'DECIMAL', precision:  7, scale: 3, name: 'tokuten' }
    ]);
    SMPL011R({
        id: 120,
        lname: '伊達   ',
        fname: '政宗   ',
        prof : '白装束で現れました。',
        tokuten: 10
    }).then(function (result) { 
      res.send(result); 
    });
});

ただし、このプログラムは正しく動きません。
原因を調べるためSMPL011Rをデバッグすると、日本語パラメータが正しく渡っていない事が分かりました。
nodejt18.png

nodejt19.png

node-jt400のJavaソース改修

そこで、node-jt400のJavaソースを直してみようと思います。
githubからソースを取得します。

git clone git@github.com:tryggingamidstodin/node-jt400.git mynode-jt400

nodejt20.png

改修するソースは、\java\src\nodejt400\Pgm.javaです。

Pgm.java
  public TextPgmParam(String name, Props paramDef)
  {
    super(name, paramDef);
    parser = new AS400Text(paramDef.getFirstInt("size", "precision"), "Cp871");
  }

Cp871が悪さをしていそうなので、以下のようにしました。

Pgm.java
  public TextPgmParam(String name, Props paramDef)
  {
    super(name, paramDef);
    parser = new AS400Text(paramDef.getFirstInt("size", "precision"));
  }

ソースを改修したら新しいjt400wrap.jarを作成し、\myfolder\node_modules\node-jt400\java\libにあるjt400wrap.jarを置き換えます。

改めて再実行し、同じ場所でデバッグを取りました。
今度は正しくパラメータが渡っています。

nodejt22.png

パラメータ「tokuten」は100を加算しました。戻り値も取れているようです。

nodejt23.png

nodejt24.png

なお、ソース改修における一切の責任を投稿者は負いません。自己責任でお願い致します。

2017年12月28日追記
ビルド済みのjt400wrap.jarをここに置きました。

1
2
0

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
1
2