CLで引数を省略したり、可変数にする方法。昔から使われているレガシーな方法だけど、若い子が見るとナニコレってなるやつ。
実装イメージ
引数は、必ず渡される保証がないため、プログラム参照した時に「ポインター・エラー」となる。これをモニターして、別のプログラム変数に省略値を代入し、後続処理を行う。
モニターすべきメッセージは QCPFMSG.MCH3601(参照された位置のポインターが設定されていない )
となる。
省略の可能性がある引数は、プログラム内のワーク変数を用意し、後続の処理はこちらを使用して処理を続ける。
コードサンプル抜粋
PGM PARM( +
&P@VAR1 +
&P@VAR2 +
)
/*======================================*/
/*引数定義 */
/*======================================*/
/*入力*/
DCL VAR(&P@VAR1 ) TYPE(*CHAR) LEN(016 ) /*IN引数1 */
DCL VAR(&P@VAR2 ) TYPE(*CHAR) LEN(016 ) /*IN引数2 */
↓↓↓↓↓↓↓↓ 省略される可能性がある引数のワーク変数 ↓↓↓↓↓↓↓↓
/*======================================*/
/*変数定義 */
/*======================================*/
DCL VAR(&W@VAR1 ) TYPE(*CHAR) LEN(016 ) /*WK引数1 */
DCL VAR(&W@VAR2 ) TYPE(*CHAR) LEN(016 ) /*WK引数2 */
~~~~~~~~~~~~~~~~~~~~~~~~~
SUBR @INPARM
/*入力引数の有無を判定*/
↓↓↓↓↓↓↓↓ ポインターエラーをモニターし、省略値を設定する ↓↓↓↓↓↓↓↓
/*引数1が渡されていない時に省略値をセット*/
CHGVAR VAR(&W@VAR1 ) VALUE(&P@VAR1 )
MONMSG MSGID(MCH3601) EXEC(CHGVAR VAR(&W@VAR1 ) VALUE('省略1'))
/*引数2が渡されていない時に省略値をセット*/
CHGVAR VAR(&W@VAR2 ) VALUE(&P@VAR2 )
MONMSG MSGID(MCH3601) EXEC(CHGVAR VAR(&W@VAR2 ) VALUE('省略2'))
結果
CALL Q231217C1
と CALL Q231217C1 PARM('私は' 'RPGer')
の実行結果は以下の通り。
メッセージモニターだから仕方がないが、「参照された位置のポインターが設定されていない」のノイズがジョブログを見た時に煩わしい。
次は少しモダンな「%PARMS」を使った方法。