7.7.2 BEGINCHECK の使用例

インライン妥当性検査を実行するようファンクションを構築する

妥当性検査サブルーチンを使用するようファンクションを構築する

BEGINCHECK/ENDCHECKコマンドを使用してインライン妥当性検査を実行する

BEGINCHECK/ENDCHECKコマンドを使用してサブルーチンによる妥当性検査を実行する

ブラウズ・リストから入力されたヘッダー・ファイルと複数の詳細を妥当性検査するようファンクションを構築する

ブラウズ・リストから入力されたヘッダー・フィールドと複数の詳細を妥当性検査する例

インライン妥当性検査を実行するようファンクションを構築する

通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(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で制御が戻されます。

BEGINCHECK/ENDCHECKコマンドを使用してインライン妥当性検査を実行する

この例は、メイン・プログラム・ブロック内でBEGINCHECK/ENDCHECKコマンド(および他の妥当性検査コマンド)を使用して、入力された一連の詳細を検証する方法を示しています。

DEFINE     FIELD(#NEWSALARY) REFFLD(#SALARY) LABEL('New Salary') DESC('New Salary for Employee')
DEFINE     FIELD(#TOTSALARY) REFFLD(#SALARY) DESC('Total Salary for Department') DEFAULT(0)
DEFINE     FIELD(#BUDGET) REFFLD(#SALARY) LABEL('Budget') DESC('Budget for Department Salaries')
GROUP_BY   NAME(#XG_DTAILS) FIELDS(#DEPTMENT #EMPNO #SURNAME #GIVENAME #NEWSALARY #STARTDTE)
DEF_LIST   NAME(#EMPBROWSE) FIELDS(#XG_DTAILS)
           
BEGIN_LOOP 
REQUEST    FIELDS(#XG_DTAILS #BUDGET) BROWSELIST(#EMPBROWSE)
CHANGE     FIELD(#TOTSALARY) TO(*DEFAULT)
SELECT     FIELDS(#SALARY) FROM_FILE(PSLMST1) WITH_KEY(#DEPTMENT)
CHANGE     FIELD(#TOTSALARY) TO('#TOTSALARY + #SALARY')
ENDSELECT  
           
BEGINCHECK 
CALLCHECK  FIELD(#STARTDTE) BY_CALLING(WORKDAY) PROG_TYPE(FUN) MSGTXT('The supplied date is not a working day.')
CONDCHECK  FIELD(#NEWSALARY) COND('(#NEWSALARY + #TOTSALARY) <= #BUDGET') MSGTXT('New salary causes Department budget to be exceeded')
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')
FILECHECK  FIELD(#EMPNO) USING_FILE(PSLMST) FOUND(*ERROR) NOT_FOUND(*NEXT) MSGTXT('Employee number supplied already exists')
RANGECHECK FIELD(#EMPNO) RANGE((A0000 A9999)) MSGTXT('Employee number has to be in the range A0000 - A9999')
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
 

いずれかの入力値により、妥当性検査コマンドがエラーを検出すると、そのコマンドで定義されたメッセージが発行され、直前に表示されていた画面にプログラム制御が戻ります。この例では、直前に表示されていた画面はREQUEST画面です。

BEGINCHECK/ENDCHECKコマンドを使用してサブルーチンによる妥当性検査を実行する

この例は、サブルーチン内でBEGINCHECK/ENDCHECKコマンドを使用して、処理のために受け入れる前に、入力された新しい従業員の詳細が一連の妥当性検査に適合していることをチェックする方法を示しています。

ユーザーが要求された詳細を入力すると、VALIDATEサブルーチンが呼び出されます。VALIDATEサブルーチンは、すべての値がさまざまな妥当性検査に適合しているかどうかを検査します。適合していない場合、エラーを検出したコマンドで定義されているメッセージが発行され、#ERRORCNTに1が加算されて、DOUNTILループが再実行されます。エラー数が0の場合、DOUNTILループが終了し、検証済みの入力データの処理が実行されます。

DEFINE     FIELD(#ERRORCNT) TYPE(*DEC) LENGTH(3) DECIMALS(0) DEFAULT(0)
DEF_COND   NAME(*NOERRORS) COND('#ERRORCNT = 0')
DEFINE     FIELD(#NEWSALARY) REFFLD(#SALARY) LABEL('New Salary') DESC('New Salary for Employee')
DEFINE     FIELD(#TOTSALARY) REFFLD(#SALARY) DESC('Total Salary for Department') DEFAULT(0)
DEFINE     FIELD(#BUDGET) REFFLD(#SALARY) LABEL('Budget') DESC('Budget for Department Salaries')
GROUP_BY   NAME(#XG_DTAILS) FIELDS(#DEPTMENT #EMPNO #SURNAME #GIVENAME #NEWSALARY #STARTDTE)
DEF_LIST   NAME(#EMPBROWSE) FIELDS(#XG_DTAILS)
           
BEGIN_LOOP 
DOUNTIL    COND(*NOERRORS)
REQUEST    FIELDS(#XG_DTAILS #BUDGET) BROWSELIST(#EMPBROWSE)
EXECUTE    SUBROUTINE(VALIDATE)
ENDUNTIL   
ADD_ENTRY  TO_LIST(#EMPBROWSE)
END_LOOP   
           
SUBROUTINE NAME(VALIDATE)
CHANGE     FIELD(#ERRORCNT) TO(0)
CHANGE     FIELD(#TOTSALARY) TO(*DEFAULT)
SELECT     FIELDS(#SALARY) FROM_FILE(PSLMST1) WITH_KEY(#DEPTMENT)
CHANGE     FIELD(#TOTSALARY) TO('#TOTSALARY + #SALARY')
ENDSELECT  
           
BEGINCHECK KEEP_COUNT(#ERRORCNT)
CALLCHECK  FIELD(#STARTDTE) BY_CALLING(WORKDAY) PROG_TYPE(FUN) MSGTXT('The supplied date is not a working day.')
CONDCHECK  FIELD(#NEWSALARY) COND('(#NEWSALARY + #TOTSALARY) <= #BUDGET') MSGTXT('New salary causes Department budget to be exceeded')
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')
FILECHECK  FIELD(#EMPNO) USING_FILE(PSLMST) FOUND(*ERROR) NOT_FOUND(*NEXT) MSGTXT('Employee number supplied already exists')
RANGECHECK FIELD(#EMPNO) RANGE((A0000 A9999)) MSGTXT('Employee number has to be in the range A0000 - A9999')
VALUECHECK FIELD(#DEPTMENT) WITH_LIST(ADM AUD FLT GAC) MSGTXT('The department code entered is not valid')
ENDCHECK   IF_ERROR(*NEXT)
           
ENDROUTINE 
 

ブラウズ・リストから入力されたヘッダー・ファイルと複数の詳細を妥当性検査するようファンクションを構築する

1つまたは複数のフィールドについて複数の値を妥当性検査することが必要な場合もあります。例えば、複数のヘッダー・フィールドと一連の詳細フィールドの複数項目を入力するよう要求する画面がこれに該当します。通常、このタイプの妥当性検査を実行する必要のあるファンクションは、以下のように構築します。

FUNCTION   OPTIONS(*DIRECT)
DEFINE     FIELD(#ERRORCNT) REFFLD(#STD_NUM)
DEF_COND   NAME(*NOERRORS) COND('#ERRORCNT = 0')
GROUP_BY   NAME(#HEADER) FIELDS(.... <FIELDS ON HEADER> ........)
DEF_LIST   NAME(#DETAILS) FIELDS(. <FIELDS IN DETAILS> .......)
           
BEGIN_LOOP 
CHANGE     FIELD(#HEADER #DETAILS) TO(*NULL)
INZ_LIST   NAMED(#DETAILS) NUM_ENTRYS(100) WITH_MODE(*ADD)
DOUNTIL    COND(*NOERRORS)
REQUEST    FIELDS(#HEADER) BROWSELIST(#DETAILS)
EXECUTE    SUBROUTINE(VALIDATE)
ENDUNTIL   
END_LOOP   
           
SUBROUTINE NAME(VALIDATE)
CHANGE     FIELD(#ERRORCNT) TO(0)
BEGINCHECK KEEP_COUNT(#ERRORCNT)
* <<                                             >>
* <<        VALIDATE HEADER FIELDS HERE          >>
* <<                                             >>
SELECTLIST NAMED(#DETAILS) GET_ENTRYS(*NOTNULL)
BEGINCHECK KEEP_COUNT(#ERRORCNT)
* <<                                             >>
* <<        VALIDATE DETAIL FIELDS HERE          >>
* <<                                             >>
ENDCHECK   IF_ERROR(*NEXT)
UPD_ENTRY  IN_LIST(#DETAILS) WITH_MODE(*ADD)
ENDSELECT  
ENDCHECK   IF_ERROR(*NEXT)
ENDROUTINE 
 

ブラウズ・リストから入力されたヘッダー・フィールドと複数の詳細を妥当性検査する例

この例は、ブラウズ・リストから入力された複数のヘッダー・フィールドと一連の詳細フィールド値で構成される画面を妥当性検査する方法を示しています。

DEFINE     FIELD(#ERRORCNT) REFFLD(#STD_NUM)
DEF_COND   NAME(*NOERRORS) COND('#ERRORCNT = 0')
GROUP_BY   NAME(#HEADER) FIELDS(#EMPNO #SURNAME #GIVENAME)
DEF_LIST   NAME(#DETAILS) FIELDS(#SKILCODE #DATEACQ)
           
MESSAGE    MSGTXT('Input Employee details, Press Enter.')
BEGIN_LOOP 
CHANGE     FIELD(#HEADER #DETAILS) TO(*NULL)
INZ_LIST   NAMED(#DETAILS) NUM_ENTRYS(100) WITH_MODE(*ADD)
DOUNTIL    COND(*NOERRORS)
REQUEST    FIELDS(#HEADER) BROWSELIST(#DETAILS)
EXECUTE    SUBROUTINE(VALIDATE)
ENDUNTIL   
MESSAGE    MSGTXT('Employee details have been accepted. Input next Employee')
END_LOOP   
SUBROUTINE NAME(VALIDATE)
CHANGE     FIELD(#ERRORCNT) TO(0)
           
BEGINCHECK KEEP_COUNT(#ERRORCNT)
RANGECHECK FIELD(#EMPNO) RANGE((A0001 A0090))
VALUECHECK FIELD(#SURNAME) WITH_LIST(*BLANKS) IN_LIST(*ERROR) NOT_INLIST(*NEXT)
VALUECHECK FIELD(#GIVENAME) WITH_LIST(*BLANKS) IN_LIST(*ERROR) NOT_INLIST(*NEXT)
           
SELECTLIST NAMED(#DETAILS) GET_ENTRYS(*NOTNULL)
BEGINCHECK KEEP_COUNT(#ERRORCNT)
FILECHECK  FIELD(#SKILCODE) USING_FILE(SKLTAB) USING_KEY(#SKILCODE)
DATECHECK  FIELD(#DATEACQ)
ENDCHECK   IF_ERROR(*NEXT)
UPD_ENTRY  IN_LIST(#DETAILS) WITH_MODE(*ADD)
ENDSELECT  
           
ENDCHECK   IF_ERROR(*NEXT)
ENDROUTINE