Tools

33. 日付の妥当性検査

ここで紹介する「日付の妥当性検査 ( DATCHK )」コマンドは CLP 等で入力された日付が
正しいかどうかを、簡単にチェックできるコマンドである。
日付が誤っていれば DATCHK コマンドは CPF9897*ESCAPE として戻すので
MONMSG を使って判断することができる。
DATCHK コマンドは例えば次のようにして簡単に使用することができる。

ソースコード
--------------------------------------------------------------------------
0001.00              PGM                                                  
0002.00              DCL        VAR(&DATE) TYPE(*CHAR) LEN(6)             
0003.00                                                                   
0004.00              CHGVAR     VAR(&DATE) VALUE('110229') /* +           
0005.00                           2011/02/29 を検査  */                   
0006.00              TEST.COM/DATCHK DATE(&DATE)                          
0007.00              MONMSG     MSGID(CPF9800) EXEC(DO)                   
0008.00              SNDPGMMSG  MSG(' 日付のエラー ') MSGTYPE(*DIAG)      
0009.00              RETURN                                               
0010.00              ENDDO                                                
0011.00              SNDPGMMSG  MSG(' 日付は正しい ') MSGTYPE(*DIAG)      
0012.00                                                                   
0013.00              ENDPGM                                               
--------------------------------------------------------------------------
【 解説 】

変数 &DATE に 2011年02月29日(これは誤り) を CHGVAR で入力して
DATCHK コマンドに渡すと、エラーであれば CPF9897 が戻るので
MONMSG CPF9800 を入れておけばエラーを監視することができる。
何も戻らなければ日付は正しいと判定することができる。
このような日付の妥当性検査 DATCHK は、様々な場面で重宝するはずである。
DATCHK コマンドの動作原理は簡単であり OS400 の CVTDAT を実行してみて
エラーがないかどうかを判定しているだけである。
以下に DATCHK コマンドと実行CLP を紹介する。

【 日付の妥当性検査コマンド : DATCHK 】
-----------------------------------------------------------------
0001.00              CMD        PROMPT(' 日付のチェック ')       
0002.00              PARM       KWD(DATE) TYPE(*CHAR) LEN(6) +   
0003.00                           PROMPT(' 日付 (YMD)')          
-----------------------------------------------------------------
【 解説 】

コンパイルは

CRTCMD CMD(MYLIB/DATCHK) PGM(MYLIB/DATCHKCL) SRCFILE(MYSRCLIB/QCMDSRC AUT(*ALL)
【 実行 CLP : DATCHKCL 】
---------------------------------------------------------------------------------
0001.00              PGM        PARM(&INDATE)                                    
0002.00 /*---------------------------------------------------------*/            
0003.00 /*   DATCHKCL :     日付のチェック                         */            
0004.00 /*---------------------------------------------------------*/            
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(132)                   
0006.00              DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(132)                
0007.00              DCL        VAR(&INDATE) TYPE(*CHAR) LEN(6)                  
0008.00              DCL        VAR(&OUTDAT) TYPE(*CHAR) LEN(6)                  
0009.00                                                                          
0010.00              CVTDAT     DATE(&INDATE) TOVAR(&OUTDAT) FROMFMT(*YMD) +     
0011.00                           TOFMT(*DMY) TOSEP(*NONE)                       
0012.00              MONMSG     MSGID(CPF0550 CPF0552 CPF0553 CPF0555 +          
0013.00                           CPF0556 CPF0557) EXEC(DO)                      
0014.00              RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG)                
0015.00              SNDPGMMSG  MSGID(CPF9897) MSGF(QCPFMSG) MSGDTA(&MSG) +      
0016.00                           MSGTYPE(*ESCAPE)                               
0017.00              ENDDO                                                       
0018.00              ENDPGM  
---------------------------------------------------------------------------------
【 解説 】

コンパイルは

CRTCLPGM PGM(MYLIB/DATCHKCL) SRCFILE(MYSRCLIB/QCLSRC) AUT(*ALL)