7.7.3 CALLCHECKの使用例
妥当性検査サブルーチンを使用するようファンクションを構築する
CALLCHECKコマンドを使用してインライン妥当性検査を実行する
CALLCHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(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で制御が戻されます。
CALLCHECKコマンドを使用してインライン妥当性検査を実行する
この例は、妥当性検査プログラムとして機能するRDMLファンクションが含まれるプログラム・ブロック内でCALLCHECKコマンドを使用する方法を示しています。
要求された詳細をユーザーが入力すると、WORKDAY RDMLプログラムが呼び出され、開始日が作業日に該当するかどうかが検査されます。WORKDAYプログラムが否定的な応答を戻した場合、定義されているメッセージが発行され、直前に表示されていた画面(この例ではRequest画面)にプログラム制御が戻されます。
DEF_LIST NAME(#EMPBROWSE) FIELDS(#EMPNO #STARTDTE)
BEGIN_LOOP
REQUEST FIELDS(#EMPNO #STARTDTE) BROWSELIST(#EMPBROWSE)
BEGINCHECK
CALLCHECK FIELD(#STARTDTE) BY_CALLING(WORKDAY) PROG_TYPE(FUN) MSGTXT('指定された日付は作業日ではありません。')
ENDCHECK
ADD_ENTRY TO_LIST(#EMPBROWSE)
END_LOOP
WORKDAYファンクションは、以下のように定義されます。
FUNCTION OPTIONS(*DIRECT *LIGHTUSAGE *MLOPTIMISE *NUM_FIELD_VALIDATE)
DEFINE FIELD(#TESTDATEC) TYPE(*CHAR) LENGTH(6)
DEFINE FIELD(#TESTDATEN) LENGTH(6) DECIMALS(0) REFFLD(#DATE) EDIT_CODE(4) DEFAULT(0) TO_OVERLAY(#TESTDATEC)
DEFINE FIELD(#DAYOFWEEK) TYPE(*CHAR) LENGTH(3)
CHANGE FIELD(#TESTDATEN) TO(#VALFLD$NV)
USE BUILTIN(CONVERTDATE) WITH_ARGS(#TESTDATEC B R) TO_GET(#DAYOFWEEK)
CASE OF_FIELD(#DAYOFWEEK)
WHEN VALUE_IS('= MON' '= TUE' '= WED' '= THU' '= FRI')
CHANGE FIELD(#VALFLD$RT) TO('''1''')
OTHERWISE
CHANGE FIELD(#VALFLD$RT) TO('''0''')
ENDCASE
RETURN
複雑なロジックの妥当性検査ファンクションの作成に関する詳細については、FUNCTIONコマンドのパラメータに関するセクションの*ALP_FIELD_VALIDATEおよび*NUM_FIELD_VALIDATEに関する技術ノートを参照してください。
CALLCHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
この例は、妥当性検査プログラムとして機能するRDMLファンクションが含まれるサブルーチン内でCALLCHECKコマンドを使用する方法を示しています。
ユーザーが要求された入力コードを入力すると、VALIDATEサブルーチンが呼び出されます。このサブルーチンは、ANUMBER RDMLプログラムを呼び出して、入力コードが正しい形式であるかどうかを検査します。ANUMBERプログラムが否定的な応答を返した場合、CALLCHECKコマンドで定義されているメッセージが発行され、DOUNTILループが再実行されます。ANUMBERプログラムが肯定的な応答を返した場合、DOUNTILループが終了し、検証済みの入力の処理が実行されます。
DEFINE FIELD(#ERRORCNT) REFFLD(#STD_NUM)
DEF_COND NAME(*NOERRORS) COND('#ERRORCNT = 0')
DEFINE FIELD(#INPUT) TYPE(*CHAR) LENGTH(7)
DEF_LIST NAME(#EMPBROWSE) FIELDS(#INPUT)
BEGIN_LOOP
DOUNTIL COND(*NOERRORS)
REQUEST FIELDS(#INPUT) 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)
CALLCHECK FIELD(#INPUT) BY_CALLING(ANUMBER) PROG_TYPE(FUN) MSGTXT('The input code format must be Annnnnn.')
ENDCHECK IF_ERROR(*NEXT)
ENDROUTINE
ANUMBERプログラムは、以下のように定義されます。
FUNCTION OPTIONS(*DIRECT *LIGHTUSAGE *MLOPTIMISE *ALP_FIELD_VALIDATE)
DEFINE FIELD(#INPUT) TYPE(*CHAR) LENGTH(7)
DEFINE FIELD(#INPUTA1) TYPE(*CHAR) LENGTH(1) TO_OVERLAY(#INPUT)
DEFINE FIELD(#INPUTA6) TYPE(*CHAR) LENGTH(6) TO_OVERLAY(#INPUT 2)
DEFINE FIELD(#DECIMAL) TYPE(*DEC) LENGTH(1) DECIMALS(1)
DEFINE FIELD(#RTN_CODE) TYPE(*CHAR) LENGTH(1)
CHANGE FIELD(#INPUT) TO(#VALFLD$AV)
USE BUILTIN(CHECKNUMERIC) WITH_ARGS(#INPUTA6 6 0) TO_GET(#STD_NUM #DECIMAL #RTN_CODE)
IF COND('(#INPUTA1 = A) and (#RTN_CODE = Y)')
CHANGE FIELD(#VALFLD$RT) TO('''1''')
ELSE
CHANGE FIELD(#VALFLD$RT) TO('''0''')
ENDIF
RETURN
複雑なロジックの妥当性検査ファンクションの作成に関する詳細については、FUNCTIONコマンドのパラメータに関するセクションの*ALP_FIELD_VALIDATEおよび*NUM_FIELD_VALIDATEに関する技術ノートを参照してください。