次に先に説明した、
(2) RPGやCOBOLなどへパラメータを渡す場合
について解説する。
CLPでの数字の変数はパック形式であると説明したように
ゾーン10進数はパラメータとして使わないようにする。
ゾーン10進数を使いたい場合は文字変数として定義しておいてから
パック数字変数に移すことができるのだろうか?
0001.00 PGM 0002.00 DCL VAR(&FLD3) TYPE(*CHAR) LEN(3) VALUE(X'F1F2F3') 0003.00 DCL VAR(&DEC30) TYPE(*DEC) LEN(3 0) 0004.00 0005.00 CHGVAR VAR(&DEC30) VALUE(&FLD3) 0006.00 ENDPGM
文字フィールド &FLD3 にはゾーン10進数形式で 123 という数字が入っている。
これを
CHGVAR VAR(&DEC30) VALUE(&FLD3)
でパック形式の数字変数: DEC03 に移すとどうなるのだろう?
デバッグで &DEC03 の変数値を調べてみると
&DEC03 = 123
という値が入っている。
しかし安心してはいけない。今度は
0002.00 DCL VAR(&FLD3) TYPE(*CHAR) LEN(3) VALUE(X'F1F2D3')
というように ゾーン10進数形式 -123 を代入してみると
値を受け入れ側のタイプに変換することができない
というエラーが発生してゾーン10進数 -123を代入することができなかった。
DCL VAR(&NINUS) TYPE(*CHAR) LEN(3) VALUE(X'F1F2D3') IF COND(&FLD3 *EQ &MINUS) THEN(DO) CHGVAR VAR(&DEC03) VALUE(-123) ENDDO ELSE CMD(DO) CHGVAR VAR(&DEC30) VALUE(&FLD3) ENDDO
というような苦肉の策もないわけではない。
いずれにせよ負の値(マイナス値)の可能性があるゾーン10進数を
パック形式の数字変数に代入するのはかなりやっかいであると
理解しておいて欲しい。