node-jt400を試してみた（Programs）

#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](https://qiita-image-store.s3.amazonaws.com/0/146069/642f7d4d-aed5-d1ea-c4ff-934bfe785f85.png)

![nodejt17.png](https://qiita-image-store.s3.amazonaws.com/0/146069/4f8684db-72f2-5d56-ace7-d5d1ee89d618.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](https://qiita-image-store.s3.amazonaws.com/0/146069/a1f2c9df-d9ba-0420-2fce-f869e0d5a87f.png)

![nodejt19.png](https://qiita-image-store.s3.amazonaws.com/0/146069/3d4d4801-1d4d-c431-c3fe-b4b6ac32d194.png)

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

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

![nodejt20.png](https://qiita-image-store.s3.amazonaws.com/0/146069/448b92ac-1a29-9320-c4f7-165f039cea34.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](https://qiita-image-store.s3.amazonaws.com/0/146069/8e39cf51-7a5b-f1af-f1d6-876147663db5.png)

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

![nodejt23.png](https://qiita-image-store.s3.amazonaws.com/0/146069/b3867194-398d-edfb-8c7c-18099ad62b02.png)

![nodejt24.png](https://qiita-image-store.s3.amazonaws.com/0/146069/7a421ebb-734e-f3ba-d013-47ee4a68fb7f.png)

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

2017年12月28日追記
ビルド済みのjt400wrap.jarを[ここ](https://github.com/ymurata1967/node-jt400/releases/)に置きました。