LoginSignup
2
1

CLで引数を省略する方法1(レガシー

Last updated at Posted at 2023-12-16

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 Q231217C1CALL Q231217C1 PARM('私は' 'RPGer') の実行結果は以下の通り。

2023-12-05_195917.png

メッセージモニターだから仕方がないが、「参照された位置のポインターが設定されていない」のノイズがジョブログを見た時に煩わしい。

次は少しモダンな「%PARMS」を使った方法。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1