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エンジンのプロシージャーを利用できる

ように拡張しているのである。