インライン妥当性検査を実行するようファンクションを構築する
妥当性検査サブルーチンを使用するようファンクションを構築する
VALUECHECKコマンドを使用してインライン妥当性検査を実行する
VALUECHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
インライン妥当性検査を実行するようファンクションを構築する
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(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で制御が戻されます。
VALUECHECKコマンドを使用してインライン妥当性検査を実行する
この例は、メイン・プログラム・ブロック内でVALUECHECKコマンドを使用して、部門コードが一連の値のいずれかであることを検査する方法を示しています。
DEF_LIST NAME(#EMPBROWSE) FIELDS(#EMPNO #DEPTMENT) BEGIN_LOOP REQUEST FIELDS(#EMPNO #DEPTMENT) BROWSELIST(#EMPBROWSE) BEGINCHECK VALUECHECK FIELD(#DEPTMENT) WITH_LIST(ADM AUD FLT GAC) MSGTXT('The department code entered is not valid') ENDCHECK ADD_ENTRY TO_LIST(#EMPBROWSE) END_LOOP
#DEPTMENTの値が、'WITH_LIST'パラメータで指定された値リストに含まれていない場合、VALUECHECKコマンドで定義されたメッセージが発行され、直前に表示されていた画面にプログラム制御が戻されます。この例では、直前に表示されていた画面はREQUEST画面です。
VALUECHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
この例は、サブルーチン内でVALUECHECKコマンドを使用して、部門コードが一連の値に含まれていることを検査する方法を示しています。
ユーザーが要求された詳細を入力すると、VALIDATEサブルーチンが呼び出されます。このサブルーチンでは、#DEPTMENTの値が、'WITH_LIST'パラメータで指定された一連の値に含まれているかどうかが検査されます。含まれていない場合、VALUECHECKコマンドで定義されたメッセージが発行され、DOUNTILループが再実行されます。入力された#DEPTMENT値が指定の一連の値に含まれている場合、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 #DEPTMENT) BEGIN_LOOP DOUNTIL COND(*NOERRORS) REQUEST FIELDS(#EMPNO #DEPTMENT) 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) VALUECHECK FIELD(#DEPTMENT) WITH_LIST(ADM AUD FLT GAC) MSGTXT('The department code entered is not valid') ENDCHECK IF_ERROR(*NEXT) ENDROUTINE