Page History
[ |../../index.htm#lansa/begincheck_e.htm]
現在地:
...
7.7.2 BEGINCHECK の使用例
妥当性検査サブルーチンを使用するようファンクションを構築する
BEGINCHECK/ENDCHECKコマンドを使用してインライン妥当性検査を実行する
BEGINCHECK/ENDCHECKコマンドを使用してサブルーチンによる妥当性検査を実行する
ブラウズ・リストから入力されたヘッダー・ファイルと複数の詳細を妥当性検査するようファンクションを構築する
ブラウズ・リストから入力されたヘッダー・フィールドと複数の詳細を妥当性検査する例
| Anchor | ||||
|---|---|---|---|---|
|
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(CONDCHECK、DATECHECK、FILECHECK、RANGECHECK、VALUECHECKなど)を使用するファンクションを以下のように構築します。 BEGIN_LOOP REQUEST << INPUT >> BEGINCHECK * << USE CHECK COMMANDS TO VALIDATE INPUT HERE >> ENDCHECK * << PROCESS THE VALIDATED INPUT HERE >> END
BEGIN_LOOP
REQUEST << INPUT >>
BEGINCHECK
* << USE CHECK COMMANDS TO VALIDATE INPUT HERE >>
ENDCHECK
* << PROCESS THE VALIDATED INPUT HERE >>
END_LOOP
BEGINCHECK_LOOP
BEGINCHECK/ENDCHECKコマンド・ブロック内の妥当性検査コマンドが妥当性検査エラーを検出すると、REQUESTコマンドに制御が戻されます。これは、ENDCHECKコマンドでデフォルトのIF_ERROR(*LASTDIS)パラメータが指定されるためです。
| Anchor | ||||
|---|---|---|---|---|
|
通常、サブルーチンによる妥当性検査を実行する場合、妥当性検査コマンド(CONDCHECK、DATECHECK、FILECHECK、RANGECHECK、VALUECHECKなど)を使用するファンクションを以下のように構築します。 DEFINE FIELD
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 ENDROUTINE
BEGINCHECK/ENDCHECKコマンド・ブロック内の妥当性検査コマンドが妥当性検査エラーを検出すると、メイン・ファンクション・ループに#ERRORCNT > 0で制御が戻されます。
| Anchor | ||||
|---|---|---|---|---|
|
この例は、メイン・プログラム・ブロック内でBEGINCHECK/ENDCHECKコマンド(および他の妥当性検査コマンド)を使用して、入力された一連の詳細を検証する方法を示しています。 DEFINE FIELD
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画面です。 いずれかの入力値により、妥当性検査コマンドがエラーを検出すると、そのコマンドで定義されたメッセージが発行され、直前に表示されていた画面にプログラム制御が戻ります。この例では、直前に表示されていた画面はREQUEST画面です。
| Anchor | ||||
|---|---|---|---|---|
|
この例は、サブルーチン内でBEGINCHECK/ENDCHECKコマンドを使用して、処理のために受け入れる前に、入力された新しい従業員の詳細が一連の妥当性検査に適合していることをチェックする方法を示しています。
ユーザーが要求された詳細を入力すると、VALIDATEサブルーチンが呼び出されます。VALIDATEサブルーチンは、すべての値がさまざまな妥当性検査に適合しているかどうかを検査します。適合していない場合、エラーを検出したコマンドで定義されているメッセージが発行され、#ERRORCNTに1が加算されて、DOUNTILループが再実行されます。エラー数が0の場合、DOUNTILループが終了し、検証済みの入力データの処理が実行されます。 DEFINE FIELD
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
| Anchor | ||||
|---|---|---|---|---|
|
1つまたは複数のフィールドについて複数の値を妥当性検査することが必要な場合もあります。例えば、複数のヘッダー・フィールドと一連の詳細フィールドの複数項目を入力するよう要求する画面がこれに該当します。通常、このタイプの妥当性検査を実行する必要のあるファンクションは、以下のように構築します。 FUNCTION OPTIONS
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
| Anchor | ||||
|---|---|---|---|---|
|
この例は、ブラウズ・リストから入力された複数のヘッダー・フィールドと一連の詳細フィールド値で構成される画面を妥当性検査する方法を示しています。 DEFINE FIELD
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