7.16.3 DATECHECKの使用例
妥当性検査サブルーチンを使用するようファンクションを構築する
DATECHECKコマンドを使用してインライン妥当性検査を実行する
DATECHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(CONDCHECK、DATECHECK、FILECHECK、RANGECHECK、VALUECHECKなど)を使用するファンクションを以下のように構築します。
BEGIN_LOOP
REQUEST << INPUT >>
BEGINCHECK
<< USE CHECK COMMANDS TO VALIDATE INPUT HERE >>
ENDCHECK
<< PROCESS THE VALIDATED INPUT HERE >>
END_LOOP
BEGINCHECK/ENDCHECKコマンド・ブロック内の妥当性検査コマンドが妥当性検査エラーを検出すると、REQUESTコマンドに制御が戻されます。これは、ENDCHECKコマンドでデフォルトのIF_ERROR(*LASTDIS)パラメータが指定されるためです。
妥当性検査サブルーチンを使用するようファンクションを構築する
通常、サブルーチンによる妥当性検査を実行する場合、妥当性検査コマンド(CONDCHECK、DATECHECK、FILECHECK、RANGECHECK、VALUECHECKなど)を使用するファンクションを以下のように構築します。
DEFINE FIELD(#ERRORCNT) REFFLD(#STD_NUM)
DEF_COND NAME(*NOERRORS) COND('#ERRORCNT = 0')
BEGIN_LOOP
DOUNTIL COND(*NOERRORS)
REQUEST << INPUT >>
EXECUTE SUBROUTINE(VALIDATE)
ENDUNTIL
* << PROCESS THE VALIDATED INPUT HERE >>
END_LOOP
SUBROUTINE NAME(VALIDATE)
CHANGE FIELD(#ERRORCNT) TO(0)
BEGINCHECK KEEP_COUNT(#ERRORCNT)
* << USE CHECK COMMANDS TO VALIDATE INPUT HERE >>
ENDCHECK IF_ERROR(*NEXT)
ENDROUTINE
BEGINCHECK/ENDCHECKコマンド・ブロック内の妥当性検査コマンドが妥当性検査エラーを検出すると、メイン・ファンクション・ループに#ERRORCNT > 0で制御が戻されます。
DATECHECKコマンドを使用してインライン妥当性検査を実行する
この例は、メイン・プログラム・ブロック内でDATECHECKコマンドを使用して、日付フィールドの妥当性を検査する方法を示しています。
DEF_LIST NAME(#EMPBROWSE) FIELDS(#EMPNO #GIVENAME #SURNAME)
BEGIN_LOOP
REQUEST FIELDS(#EMPNO #STARTDTE) BROWSELIST(#EMPBROWSE)
BEGINCHECK
DATECHECK FIELD(#STARTDTE) IN_FORMAT(*DDMMYY) BEFORE(30) AFTER(0) MSGTXT('Start date is not in the right format or not in the last month')
ENDCHECK
ADD_ENTRY TO_LIST(#EMPBROWSE)
END_LOOP
#STARTDTEがDDMMYYの形式でなく、現在日の前後30日以内の日付でない場合、DATECHECKコマンドで定義されたメッセージが発行され、プログラム制御が、直前に表示されていた画面に戻されます。この例では、直前に表示されていた画面はREQUEST画面です。
DATECHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
この例は、サブルーチン内でDATECHECKコマンドを使用して、日付フィールドの妥当性を検査する方法を示しています。
ユーザーが要求された詳細を入力すると、VALIDATEサブルーチンが呼び出されます。このサブルーチンでは、#STARTDTEがDD/MM/YYの形式かどうか、また現在日より30日前の日付から現在日までの期間にあるかどうかが検査されます。この条件に適合しない場合、DATECHECKコマンドで定義されたメッセージが発行され、DOUNTILループが再実行されます。#STARTDTEの形式と値が正しい場合は、DOUNTILループが終了し、検証済みの入力データが処理されます。
DEFINE FIELD(#ERRORCNT) TYPE(*DEC) LENGTH(3) DECIMALS(0) DEFAULT(0)
DEF_COND NAME(*NOERRORS) COND('#ERRORCNT = 0')
DEF_LIST NAME(#EMPBROWSE) FIELDS(#EMPNO #STARTDTE)
BEGIN_LOOP
DOUNTIL COND(*NOERRORS)
REQUEST FIELDS(#EMPNO #STARTDTE) BROWSELIST(#EMPBROWSE)
EXECUTE SUBROUTINE(VALIDATE)
ENDUNTIL
ADD_ENTRY TO_LIST(#EMPBROWSE)
END_LOOP
SUBROUTINE NAME(VALIDATE)
CHANGE FIELD(#ERRORCNT) TO(0)
BEGINCHECK KEEP_COUNT(#ERRORCNT)
DATECHECK FIELD(#STARTDTE) IN_FORMAT(*DDMMYY) BEFORE(30) AFTER(0) MSGTXT('Start date is not in the right format or not in the last month')
ENDCHECK IF_ERROR(*NEXT)
ENDROUTINE