CL

111. CLPのパラメータの注意(1)

CLPでパラメータを使うのは

(1) コマンドからのパラメータを受取る場合

(2) RPGやCOBOLなどへパラメータを渡す場合

があるがその両方について解説する。
どちらの場合でも数字を扱う場合が問題になるので
数字パラメータについて説明する。

今回は(1)のコマンドからのパラメータの受け取りの場合である。

A.数字の受取り

数字のコマンド・パラメータ


             PARM       KWD(STRPAGE) TYPE(*DEC) LEN(6 0) DFT(*BEGIN) +  
                           SPCVAL((*BEGIN 1)) +
                          PROMPT(' 開始ページ ')  

  から受取るCLPの変数は

      PGM        PARM(&STRPAGE)
            DCL        VAR(&STRPAGE) TYPE(*DEC) LEN(6 0) VALUE(1)  

として受取ればよい。

ところでここで問題。
変数: &STRPAGE はパック形式の数字だろうか?
それともゾーン形式の数字なのだろうか?
答えはパック形式である。
これは重要なことで

CLPで定義する *DECの数字変数はすべてパック形式として
定義されている。

ことを覚えていて欲しい。
CLPではゾーン形式の変数は定義するこはできないし
  ゾーン形式の数字は扱うことができない。
  よくQ&Aなどでゾーン形式の数字をRPGなどのプログラムに渡すと
おかしくなったなどの質問があるが
RPG/COBOLへの受け渡しも数字ならパック形式でしか
渡すことができない。
これを明確にしておかないとゾーン形式の数字を扱うと
開発中にトラブルになってしまう。

B. 2進数の受取り
                PARM       KWD(DRAWER) TYPE(*INT2) DFT(*AUTO) RANGE(1 +
                          255) SPCVAL((*AUTO -1)) +                 
                          EXPR(*YES) PMTCTL(*PMTRQS) +              
                          PROMPT(' 用紙トレイ ')                    

のようにタイプ] *INT2 つまり 2バイトのバイナリ(2進数)を
   パラメータとして扱う場合がある。
この受取りは

                       PGM        PARM(&DRAWER) 
                       DCL        VAR(&DRAWER) TYPE(*INT) LEN(2 0)

として2進数として定義するよりは

                       PGM        PARM(&DRAWER)
                       DCL        VAR(&DRAWER) TYPE(*CHAR) LEN(2)

として 2バイトの文字変数として定義したほうがよい。
文字変数のほうが別の変数にコピーしやすいし
数字として扱う場合はいつでも %BIN(&DRAWER)として数字として
処理できるからである。
2進数として定義すると別の変数への埋め込みなどは
ほとんど不可能になってしまうので文字変数として定義すべきである。