あるフィールドの値が正しく数値で保存されているかどうか
検査する方法を紹介する。
_
(1) ゾーン10進数の場合
2990.00 D OFFSET S 10I 0 2991.00 D BYTE S 10I 0 2992.00 D KETA S 10I 0 2993.00 D VALUE S 256A : 3013.00 POS = %CHECK('1234567890': VALUE); 3014.00 IF POS <= BYTE; 3015.00 MSG = ' フィールド ' + %TRIMR(FLD) + 3016.00 ' の数値データが不正です。 '; : 3020.00 ENDIF;
[解説]
VALUE には BYTE数分の値が入っているが
これがすべて数値であるかどうかを %CHECK で検査する。
3013.00 POS = %CHECK('1234567890': VALUE);
を実行すると 1~0以外の文字が最初に見つかったときの位置が POSに
入るのだがその位置がバイト数より小さいのであれば VALUEの中に
数字以外が含まれていることになる。
従ってこの場合はエラーである。
(2) PACK 10進数の場合
3032.00 IF FLD1 = X'1F' OR FLD1 = X'2F' OR FLD1 = X'3F' OR FLD1 = X'4F' OR 3033.00 FLD1 = X'5F' OR FLD1 = X'6F' OR FLD1 = X'7F' OR FLD1 = X'8F' OR 3034.00 FLD1 = X'9F' OR FLD1 = X'0F' OR FLD1 = X'1D' OR FLD1 = X'2D' OR 3035.00 FLD1 = X'3D' OR FLD1 = X'4D' OR FLD1 = X'5D' OR FLD1 = X'6D' OR 3036.00 FLD1 = X'7D' OR FLD1 = X'8D' OR FLD1 = X'9D' OR FLD1 = X'0D'; 3037.00 ELSE; 3038.00 MSG = ' フィールド ' + %TRIMR(FLD) + 3039.00 ' の数値データが不正です。 '; : 3043.00 ENDIF;
[解説]
PACK型式の場合は最後の桁だけを調べればよい。
9F (=正の数) または 9D (=負の数)の型式であるかどうか調べれば十分である。
_