RPG

121. RPG III でサービス・プログラムをバインドするには?

ILE-RPG ではサービス・プログラム(*SRVPGM) で公開プロシージャーを作成して親プログラム
から CALLPCALLB で呼び出して使用することができる。

これに対して RPG III では CALL 命令しか使えないので、原理的にはサービス・プログラム
(*SRVPGM) は使用できないはずであるが、知られていない裏技を使えばこれらが可能になる
ことを発見したので、ここで紹介しよう。
もちろんこの手法は IBMマニュアルなどでは紹介されていない方法である。

あるサービス・プログラム : MYSRVPGM には、2つのプロシージャー : MY001MY002
持っているものとする。
親プログラム : OYA001 が、ILE-RPG であれば OYA001 はソース内で

のようにして MYSRVPGMMY001, MY002 を呼び出すことができる。
ILE-RPG : OYA002 のコンパイルは

 CRTRPGMOD QTEMP/OYA001 SRCFILE(MYSRCLIB/QRPGLESRC) AUT(*ALL)
 CRTPGM MYLIB/OYA001 MODULE(QTEMP/OYA001) SRVPGM(MYLIB/MYSRVPGM) AUT(*ALL)

のようにしてコンパイルが行われるはずである。

それでは RPG III から、これらのプロシージャーをどのようにして利用すればよいのであろうか?
答えから言うと、同じ活動化グループの名前を持つ ILE-RPG *PGM をプロシージャー毎に作成
して、それらを RPG III から CALL 命令で呼び出せばよいのである。

ここで新しく MY001PMY002P という名前の *PGM を作成する。
これらは MYSRVPGM をバインドするが活動化グループは *NEW ではなく、MYACTGRP
ように同じ名前で作成するものとする。
MY001PMY002P の機能は、それぞれプロシージャー MY001, MY002 を呼び出すだけ
の単純なものである。
OYA002 のコンパイルはもちろん CRTRPGPGM でよい。

さて、上記のような構成にすると RPG III : OYA002 が最初に CALL MY001P によって
プロシージャー : MY001 を利用した後で、CALL MY002P を実行すると MY001P を CALL
したときと同じ MYSRVPGM が利用されることになる。
つまり OYA002MYSRVPGM をバインドしているのと動作は同じになるのである。
もちろん OYA002 の終了後には RCLACTGRP MYACTGRP のようにして活動化グループ
を削除しておく必要がある。

■ RPG III での CGI 開発

EnterpriseServer Ver4.0 では RPG III でも CGI の開発をサポートした。
Ver4.0 では DSPF を SPECIAL ファイルに変更しているのだが、24 * 80 サイズを拡張しようと
すると、RPGエンジン(*SRVPGM) のプロシージャーを RPG III からでも利用できるようにする必
要があった。
Ver4.0 では上記の手法によって RPG III からでも RPGエンジンのプロシージャーを利用できる
ように拡張しているのである。