CLPのパラメータは必ずしも必須ではない。
ILE-RPG やC言語ではパラメータを参照するときに
パラメータの入力がないとわかるとそこで初めて
パラメータのエラーとなる。
次のCLPを見て欲しい。
[CLP: TESTPRM2 ]
ソースはこちらから
0001.00 PGM PARM(&FILE) 0002.00 /*-------------------------------------------------------------------*/ 0003.00 /* TESTPRM2CL : パラメータのテスト */ 0004.00 /* */ 0005.00 /* 2021/05/26 作成 */ 0006.00 /*-------------------------------------------------------------------*/ 0007.00 DCL VAR(&FILE) TYPE(*CHAR) LEN(10) 0008.00 DCL VAR(&MSG) TYPE(*CHAR) LEN(132) 0009.00 DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) 0010.00 DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) 0011.00 DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(10) + 0012.00 VALUE('*ESCAPE ') 0013.00 0014.00 RETURN 0015.00 ENDPGM
[質問]
このCLPをコンパイルして実行すると結果は次のうちのどれになるか?
(1)エラー「 CALL で渡されたパラメーターが必要なパラメーターと一致していない。」が発生して
異常終了する。
(2)エラーは発生せずに正常に終了する。
[解説]
多くの場合(1)と考える回答が多いはずであるがこれはOPMの場合であば(1)の結果となるが
ILEの場合は(2)の結果となる。
つまり
[OPMとしてのコンパイル]
CRTCLPGM OBJLIB/TESTPRM2CL SRCFILE(MYSRCLIB/QCLSRC9 AUT(*ALL)
[ILEとしてのコンパイル]
CRTBNDCL PGM(TEST.COM/TESTPRM2CL) SRCFILE(R610SRC/QCLSRC) DFTACTGRP(*NO)
ACTGRP(*NEW) AUT(*ALL)
….つまり CRTCLPGMによってコンパイルされたOPMプログラムによるCLPであれば
パラメータ不足のエラーにはなるが CRTBNDCLでコンパイルした場合は
パラメータの使用がなければエラーにはならないということである。
この事実はご存知でない方も多いと思うが実験してみて初めて判明した。
これはCLPをCGIとして利用したいときに重要になる。