Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

[ Image Removed |../../index.htm#lansa/begincheck_e.htm]
現在地:

...

7.7.2 BEGINCHECK の使用例

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

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

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

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

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

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

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

通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(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
BEGIN_CHECK_EX2
BEGIN_CHECK_EX2
妥当性検査サブルーチンを使用するようファンクションを構築する

通常、サブルーチンによる妥当性検査を実行する場合、妥当性検査コマンド(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
BEGIN_CHECK_EX3
BEGIN_CHECK_EX3
BEGINCHECK/ENDCHECKコマンドを使用してインライン妥当性検査を実行する

この例は、メイン・プログラム・ブロック内で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
BEGIN_CHECK_EX4
BEGIN_CHECK_EX4
BEGINCHECK/ENDCHECKコマンドを使用してサブルーチンによる妥当性検査を実行する

この例は、サブルーチン内で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
BEGIN_CHECK_EX5
BEGIN_CHECK_EX5
ブラウズ・リストから入力されたヘッダー・ファイルと複数の詳細を妥当性検査するようファンクションを構築する

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

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