Versions Compared

Key

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

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

...

7.17.3 CONDCHECK の使用例

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

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

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

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

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

通常、インライン妥当性検査を実行する場合、妥当性検査コマンド (CONDCHECK、DATECHECK、FILECHECK、RANGECHECK、VALUECHECK など) を使用するファンクションを以下のように構築します。

Code Block
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) パラメータが指定されるためです。

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

通常、サブルーチンによる妥当性検査を実行する場合、妥当性検査コマンド (CONDCHECK、DATECHECK、FILECHECK、RANGECHECK、VALUECHECKなど) を使用するファンクションを以下のように構築します。

Code Block

...

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 で制御が戻されます。

Anchor
COND_CHECK_EX3
COND_CHECK_EX3
CONDCHECK コマンドを使用してインライン妥当性検査を実行する

この例は、メイン・プログラム・ブロック内で CONDCEHECK コマンドを使用して、一連の条件に適合しているかフィールド値を検査する方法を示しています。ここで、新しい社員の給与を部門の現行給与に加算し、その結果が給与予算内に収まるかどうかを検査します。

Code Block

...

DEFINE     FIELD(#NEWSALARY)

...

 REFFLD(#SALARY)

...

 LABEL('

...

New Salary')

...


DEFINE     FIELD(#TOTSALARY)

...

 REFFLD(#SALARY)

...

 DEFAULT(0)

...


DEFINE     FIELD(#BUDGET)

...

 REFFLD(#SALARY)

...

 LABEL('Budget')

...


DEF_

...

LIST   NAME(#EMPBROWSE)

...

 FIELDS(#EMPNO #NEWSALARY)

BEGIN_LOOP
REQUEST    FIELDS(#DEPTMENT #BUDGET #EMPNO #NEWSALARY) BROWSELIST(#EMPBROWSE)
CHANGE     FIELD(#TOTSALARY) TO(*DEFAULT)

SELECT     FIELDS(#SALARY) FROM_FILE(PSLMST1)

...

 WITH_KEY(#DEPTMENT)

...


CHANGE     FIELD(#TOTSALARY)

...

 TO('

...

#TOTSALARY + #SALARY')
ENDSELECT 

BEGINCHECK
CONDCHECK  FIELD(#NEWSALARY)

...

 COND('(

...

#NEWSALARY + #TOTSALARY) <= #BUDGET') MSGTXT('New salary causes Department budget to be exceeded')
ENDCHECK  

ADD_ENTRY  TO_LIST(#EMPBROWSE)
END_LOOP

...

新しい社員の給与をその部門における既存の給与合計に加算した結果が給与予算を超過する場合は、CONDCHECK コマンドで定義されたメッセージが発行され、プログラム制御が、直前に表示されていた画面に戻されます。この例では、直前に表示されていた画面は REQUEST 画面です。

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

この例は、サブルーチン内で CONDCHECK コマンドを使用して、一連の条件に適合しているかフィールド値を検査する方法を示しています。

ユーザーが要求された詳細を入力すると、VALIDATE サブルーチンが呼び出されます。このサブルーチンでは、新しい社員の給与をその部門における既存の給与合計に加算しても、給与予算内に収まるかどうかを検査します。この条件に適合しない場合、CONDCHECK コマンドで定義されたメッセージが発行され、DOUNTIL ループが再実行されます。この条件に適合している場合は、DOUNTIL ループが終了し、検証済みの入力データの処理が実行されます。

Code Block

...

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')

...


DEFINE     FIELD(#TOTSALARY)

...

 REFFLD(#SALARY)

...

 DEFAULT(0)

...


DEFINE     FIELD(#BUDGET)

...

 REFFLD(#SALARY)

...

 LABEL('Budget')
DEF_

...

LIST   NAME(#EMPBROWSE)

...

 FIELDS(#EMPNO #NEWSALARY)

BEGIN_LOOP
DOUNTIL    COND(*NOERRORS)

...


REQUEST    FIELDS(#DEPTMENT #BUDGET #EMPNO #NEWSALARY) 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)

...


CONDCHECK  FIELD(#NEWSALARY)

...

 COND('(

...

#NEWSALARY + #TOTSALARY) <= #BUDGET') MSGTXT('New salary causes Department budget to be exceeded')
ENDCHECK   IF_ERROR(*NEXT)

...



ENDROUTINE