7.14.3 CONDCHECKの使用例

LANSA

7.14.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