You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

7.17.3 CONDCHECK の使用例

インライン妥当性検査を実行するようファンクションを構築する
妥当性検査サブルーチンを使用するようファンクションを構築する
CONDCHECK コマンドを使用してインライン妥当性検査を実行する
CONDCHECK コマンドを使用してサブルーチンによる妥当性検査を実行する
インライン妥当性検査を実行するようファンクションを構築する
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド (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 で制御が戻されます。
CONDCHECK コマンドを使用してインライン妥当性検査を実行する
この例は、メイン・プログラム・ブロック内で CONDCEHECK コマンドを使用して、一連の条件に適合しているかフィールド値を検査する方法を示しています。ここで、新しい社員の給与を部門の現行給与に加算し、その結果が給与予算内に収まるかどうかを検査します。
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 画面です。
CONDCHECK コマンドを使用してサブルーチンによる妥当性検査を実行する
この例は、サブルーチン内で CONDCHECK コマンドを使用して、一連の条件に適合しているかフィールド値を検査する方法を示しています。
ユーザーが要求された詳細を入力すると、VALIDATE サブルーチンが呼び出されます。このサブルーチンでは、新しい社員の給与をその部門における既存の給与合計に加算しても、給与予算内に収まるかどうかを検査します。この条件に適合しない場合、CONDCHECK コマンドで定義されたメッセージが発行され、DOUNTIL ループが再実行されます。この条件に適合している場合は、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')  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  

  • No labels