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', []);
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をデバッグすると、日本語パラメータが正しく渡っていない事が分かりました。
node-jt400のJavaソース改修
そこで、node-jt400のJavaソースを直してみようと思います。
githubからソースを取得します。
git clone git@github.com:tryggingamidstodin/node-jt400.git mynode-jt400
改修するソースは、\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を置き換えます。
改めて再実行し、同じ場所でデバッグを取りました。
今度は正しくパラメータが渡っています。
パラメータ「tokuten」は100を加算しました。戻り値も取れているようです。
なお、ソース改修における一切の責任を投稿者は負いません。自己責任でお願い致します。
2017年12月28日追記
ビルド済みのjt400wrap.jarをここに置きました。