ILE-RPG ではサービス・プログラム(*SRVPGM)
で公開プロシージャーを作成して親プログラム
から CALLP
や CALLB
で呼び出して使用することができる。
これに対して RPG III では CALL 命令しか使えないので、原理的にはサービス・プログラム
(*SRVPGM)
は使用できないはずであるが、知られていない裏技を使えばこれらが可能になる
ことを発見したので、ここで紹介しよう。
もちろんこの手法は IBMマニュアルなどでは紹介されていない方法である。
あるサービス・プログラム : MYSRVPGM
には、2つのプロシージャー : MY001
と MY002
を
持っているものとする。
親プログラム : OYA001
が、ILE-RPG であれば OYA001
はソース内で
のようにして MYSRVPGM
の MY001
, 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 命令で呼び出せばよいのである。
ここで新しく MY001P
と MY002P
という名前の *PGM
を作成する。
これらは MYSRVPGM
をバインドするが活動化グループは *NEW
ではなく、MYACTGRP
の
ように同じ名前で作成するものとする。
MY001P
と MY002P
の機能は、それぞれプロシージャー MY001
, MY002
を呼び出すだけ
の単純なものである。
OYA002
のコンパイルはもちろん CRTRPGPGM
でよい。
さて、上記のような構成にすると RPG III : OYA002
が最初に CALL MY001P
によって
プロシージャー : MY001
を利用した後で、CALL MY002P
を実行すると MY001P
を CALL
したときと同じ MYSRVPGM
が利用されることになる。
つまり OYA002
は MYSRVPGM
をバインドしているのと動作は同じになるのである。
もちろん OYA002
の終了後には RCLACTGRP MYACTGRP
のようにして活動化グループ
を削除しておく必要がある。
EnterpriseServer Ver4.0 では RPG III でも CGI の開発をサポートした。
Ver4.0 では DSPF を SPECIAL ファイルに変更しているのだが、24 * 80 サイズを拡張しようと
すると、RPGエンジン(*SRVPGM)
のプロシージャーを RPG III からでも利用できるようにする必
要があった。
Ver4.0 では上記の手法によって RPG III からでも RPGエンジンのプロシージャーを利用できる
ように拡張しているのである。