RPG

509. フィールドの値が正しい数値であるかどうかを調べるには

あるフィールドの値が正しく数値で保存されているかどうか
検査する方法を紹介する。
_

(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 (=負の数)の型式であるかどうか調べれば十分である。
_