概要
Node.jsからSQLRPG(ILE)を呼び出し、JSON形式でデータを取得してブラウザに表示するプログラムを作成します。
本記事ではその「準備編」として、SQLRPG(ILE)側の処理について解説します。
環境情報
- IBM i :7.3 QCCSID:5035
- Node.js:v22.13.1
- IFSにあるファイルは1208になります
- 使用モジュール:itoolkit、fast-xml-parser、http
処理概要
IBM i のデータベースから情報を取得し、JSON形式の文字列に変換して返す処理です。
SQLでデータを取り出し、1件ずつ整形してJSON配列を作成しています。
SQLRPGプログラムの作成
サンプルソース
**FREE
CTL-OPT DFTACTGRP(*NO)
ACTGRP(*CALLER);
//パラメータ受け取り
DCL-PI *N;
JSONRESULT CHAR(5000);
END-PI;
//外部プロシージャ
DCL-PR QCMDEXC_WK EXTPGM('QCMDEXC');
THECMD CHAR(3000) CONST;
CMDLNE PACKED(15 : 5) CONST;
DBCS CHAR(3) CONST OPTIONS(*NOPASS);
END-PR;
DCL-S CMD VARCHAR(100);
DCL-S JSONLINE VARCHAR(1000);
DCL-S JSONARRAY VARCHAR(5000);
DCL-S FIRSTRECORD IND;
DCL-DS TKMASPDS QUALIFIED;
TKOKCD CHAR(4);
TKOKKJ CHAR(52);
END-DS;
//環境設定
CMD = 'ADDLIBLE LIB(QEOL) POSITION(*LAST)';
QCMDEXC_WK (CMD : %LEN(CMD));
//データ取得
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT TKOKCD, TKOKKJ
FROM QEOL/TKMASP;
EXEC SQL
OPEN C1;
FIRSTRECORD = *ON;
JSONARRAY = '[';
JSONRESULT = *BLANK;
DOW SQLCODE = 0;
EXEC SQL
FETCH C1 INTO :TKMASPDS.TKOKCD, :TKMASPDS.TKOKKJ;
IF SQLCODE = 0;
IF NOT FIRSTRECORD;
JSONARRAY += ',';
ENDIF;
JSONLINE = *BLANK;
JSONLINE = '{"TKOKCD":"' +
%TRIM(TKMASPDS.TKOKCD) +
'","TKOKKJ":"' +
%TRIM(TKMASPDS.TKOKKJ) +
'"}';
JSONARRAY += JSONLINE;
FIRSTRECORD = *OFF;
ENDIF;
ENDDO;
EXEC SQL
CLOSE C1;
JSONARRAY += ']';
JSONRESULT = JSONARRAY;
RETURN;
要点 ここからソース解説
1. QCMDEXCの呼び出しとライブラリ追加
RPGプログラム内でCLコマンドを実行するために、QCMDEXCプロシージャを宣言します。
DCL-PR QCMDEXC_WK EXTPGM('QCMDEXC');
THECMD CHAR(3000) CONST;
CMDLNE PACKED(15 : 5) CONST;
DBCS CHAR(3) CONST OPTIONS(*NOPASS);
END-PR;
必要なライブラリ(例:QEOL)をADDLIBLEコマンドで追加し、SQLでのテーブル参照を可能にします。
DCL-S CMD VARCHAR(100);
CMD = 'ADDLIBLE LIB(QEOL) POSITION(*LAST)';
QCMDEXC_WK (CMD : %LEN(CMD));
2. SQLによるデータ取得
EXEC SQL文を使用してカーソルを宣言し、対象テーブル(例:TKMASP)から必要な項目を取得します。
FETCHループで1件ずつデータを読み込みます。
EXEC SQL
DECLARE C1 CURSOR FOR
SELECT TKOKCD, TKOKKJ
FROM QEOL/TKMASP;
EXEC SQL
OPEN C1;
DOW SQLCODE = 0;
EXEC SQL
FETCH C1 INTO :TKMASPDS.TKOKCD, :TKMASPDS.TKOKKJ;
IF SQLCODE = 0;
//文字列作成処理
ENDIF;
ENDDO;
3. JSON形式で文字列作成
取得した各レコードをJSONオブジェクトとして整形します。
以下の流れでJSON配列を構築します。
1. 最初のレコードでなければ、カンマを追加
2. 取得したレコードからJSON文字列(JSONLINE)を作成
3. JSON文字列をJSON配列(JSONARRAY)に追加
IF NOT FIRSTRECORD;
JSONARRAY += ',';
ENDIF;
JSONLINE = *BLANK;
JSONLINE = '{"TKOKCD":"' +
%TRIM(TKMASPDS.TKOKCD) +
'","TKOKKJ":"' +
%TRIM(TKMASPDS.TKOKKJ) +
'"}';
JSONARRAY += JSONLINE;
FIRSTRECORD = *OFF;
4. OUTパラメータでJSON文字列を返す
JSON配列をJSONRESULTに格納し、呼び出し元に返却します。
JSONRESULT = JSONARRAY;
RETURN;
SQLRPG側の解説は以上です。
次はNode.js側の実装について解説します!
Node.js × SQLRPG連携(Node.js実装編)
参考サイト
JBCC株式会社 IBM Powerコラム
フリーフォーマットRPGでプログラムを書いてみよう
chrome-extension://efaidnbmnnnibpcajpcglclefindmkaj/https://www.jbcc.co.jp/products/files/ibmpowercolumn202206_freeformatRPG.pdf
株式会社福岡情報ビジネスセンター FBI BLOG
FFRPG言語徹底解説~RPG開発においてSQLを使用するメリット~
https://fbicenter.co.jp/blog/20220720_embedded-sql#SQL
当記事の著作権はIBMに帰属します。
詳細はこちらを参照ください。