IBM iのシステム仕様や業務運用をそのままにUIをオープン化に踏み切る時、簡単に言えば脱エミュレータの時、
既存プログラム資産の RPG/CL/COBOL を活用することでシステム開発インパクトと改変リスクを低減できるケースが多分にあります。
この様なハイブリッド開発を行う際に、既存プログラムをどう連携させるか?手法は幾つかありますが、2024のAdvent Calendarでは、何回かに分けて、ある2パターン紹介しようと思います。
今回は、その2パターンを実装するための仮想既存資産の RPG プログラムを作成していきます。
仮想既存資産の RPG プログラム
①消費税計算サブルーチン(10%)
■ 引数
- IN :金額(税抜き)
- OUT:金額(税込み)
■返り値 - なし
②消費税計算サブルーチン(8%)
■ 引数
- IN :金額(税抜き)
■返り値 - 金額(税込み)
①と②のRPGサンプル
実際運用を考えると、課税、非課税、不課税、免税、輸入税、軽減税率などの各種シチュエーションや、税率マスターを使うかと思います。それら内部ロジックは一旦おいておいて、今回のサンプル RPG サンプルプログラムでは単純に入力値に対して、①では1.1倍した金額、②では1.08倍した金額を算出し返します。
サンプルプログラムは以下のとおりです。
- GitHub - ushiday - qiita-rpgle/QRPGSRC/Q240101R.RPGLE
- GitHub - ushiday - qiita-rpgle/QRPGSRC/Q240201R.RPGLE
**FREE
CTL-OPT
NOMAIN
DATEDIT(*YMD)
DECEDIT('0.')
EXPROPTS(*RESDECPOS)
CURSYM('¥')
COPYRIGHT('...')
;
DCL-PROC MY_ZEIKOMI EXPORT ;
//インターフェース
DCL-PI *N ;
IN_KING1 LIKE(W#KING2 ) CONST ; //金額(税抜
OT_KING2 LIKE(W#KING2 ) ; //金額(税込み
END-PI;
DCL-S W#KING2 ZONED(011 :00 ) ; //金額(税込み
DCL-C W#ZEIRIT1 10 ; //税率%
OT_KING2 = *ZERO ;
//税込み計算
W#KING2 = IN_KING1
* (1 + (W#ZEIRIT1 / 100 )) ;
SND-MSG '税込み…'
+ %CHAR(W#KING2 )
;
OT_KING2 = W#KING2 ;
RETURN ;
END-PROC;
上記プログラムを初学者のために少し解説します。初歩的な内容なのでわかっている人は飛ばして下さい。
少しだけプログラムの解説
CTL-OPT(旧H仕様書)
制御オプションでNOMAIN
としているのは、このプログラムはメインルーチンを持たないプログラムを意味しています。メインルーチンを持たないため、コマンドラインのCALL
で呼び出されてることを目的としていません。プログラムtoプログラムで利用される事を意図しています。
そのためこのプログラムは*SRVPGM(サービスプログラム)
と呼ばれるオブジェクトを作成することになります。
具体的には、CRTRPGMOD
でモジュールを作成後、そのモジュールを利用した、CRTSRVPGM
でプログラムを作成して下さい。例えば以下の様に
- CRTRPGMOD MODULE(USHIDA@Q24/Q240101R) SRCFILE(USHIDA@Q24/QRPGSRC) SRCMBR(Q240101R) REPLACE(*YES)
- CRTSRVPGM SRVPGM(USHIDA@Q24/Q240101R) MODULE(*SRVPGM) EXPORT(*ALL) TEXT(*MODULE)
次に幾つかのオプションが続きますが、詳細は公式サイトのV7R5 制御仕様キーワード を見て下さい。
DCL-PRCO
とDCL-PI
プロシージャと呼ばれる、外部呼び出しの入口点を定義しています。MY_ZEIKOMI
はこのプロシージャの名前を表しています。*N
はMY_ZEIKOMI
と同名という意味になります。
このプロシージャは入力用(IN_KING1)、出力用引数(OT_KING2)をそれぞれ一つずつとります。何れもLIKEオプションで、ゾーン10進数の11桁で定義されております。
CONST
はプログラム内で変数の変更が出来ないことを意味しています。
サブルーチンの内容は、10%税込み金額計算後、SND-MSG
命令で結果を出力し、出力用引数に値をセットして、プログラムをRETURN
で終了しています。
**FREE
CTL-OPT
NOMAIN
DATEDIT(*YMD)
DECEDIT('0.')
EXPROPTS(*RESDECPOS)
CURSYM('¥')
COPYRIGHT('...')
;
DCL-PROC MY_ZEIKOMI EXPORT ;
//インターフェース
DCL-PI *N LIKE(W#KING2 ) ; //金額(税込み
IN_KING1 LIKE(W#KING2 ) CONST ; //金額(税抜
END-PI;
DCL-S W#KING2 ZONED(011 :00 ) ; //金額(税込み
DCL-C W#ZEIRIT1 08 ; //税率%
//税込み計算
W#KING2 = IN_KING1
* (1 + (W#ZEIRIT1 / 100 )) ;
SND-MSG '税込み…'
+ %CHAR(W#KING2 )
;
RETURN W#KING2 ;
END-PROC;
このプログラムと①Q240101R.RPGLE
の違いは、DCL-PI
で返り値がゾーン10進数11桁で定義されていること、税率が8%となっている事です。返り値が定義されているのでRETURN 返り値
の形になります。
今回は以上です。続きはまた