7.10.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 に関する技術ノートを参照してください。