前回の「 CLで引数を省略する方法1(レガシー 」に続いて、今回はCLで引数を省略するモダンな方法「%PARMS」組み込み関数を使う方法。
V7R4 新機能 に掲載されているので、まぁそろそろ使えるユーザーさんもチラホラ出てきています。特に Power8 が終焉に向けているので、V7R5 が浸透しやすい状況ではあります。
レガシーな方法は、QCPFMSG.MCH3601(参照された位置のポインターが設定されていない )
をモニターするのですが、ジョブログも残るし、こちらの方がソースコードの見た目もかなりスマートであること、ILE-RPG の
%PARMS (パラメーター数の戻り) ともコーディングに一貫性があり良いのではないでしょうか?皆さん、未来の若者のためにリファクタリングしましょ!
実装イメージ
渡された引数の数は、%PARMS
関数を通して知ることが出来るため、内部変数に省略値を設定後、渡された引数の値で置換する。
省略の可能性がある引数は、プログラム内のワーク変数を用意する必要があるのは前回と同じ。後続の処理はこちらを使用して処理を続ける。
コードサンプル抜粋
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
/*省略値を設定*/
CHGVAR VAR(&W@VAR1 ) VALUE('省略1')
CHGVAR VAR(&W@VAR2 ) VALUE('省略2')
↓↓↓↓↓↓↓↓ 関数で渡された引数の数を知ることが出来る ↓↓↓↓↓↓↓↓
/*引数1が渡されている時に変数にセット*/
IF (%PARMS *GE 1) THEN(DO)
CHGVAR VAR(&W@VAR1 ) VALUE(&P@VAR1 )
ENDDO
/*引数2が渡されている時に変数にセット*/
IF (%PARMS *GE 2) THEN(DO)
CHGVAR VAR(&W@VAR2 ) VALUE(&P@VAR2 )
ENDDO
結果
CALL Q231218C1
と CALL Q231218C1 PARM('私は' 'RPGer')
の実行結果は以下の通り。
ノイズになるメッセージも出力されないし、コードの可読性も良いので、これからは積極的に使いたいですな。