Page History
[ |../../index.htm#lansa/condcheck_e.htm]
現在地:
...
7.17.3 CONDCHECK の使用例
妥当性検査サブルーチンを使用するようファンクションを構築する
CONDCHECK コマンドを使用してインライン妥当性検査を実行する
CONDCHECK コマンドを使用してサブルーチンによる妥当性検査を実行する
| Anchor | ||||
|---|---|---|---|---|
|
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド (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 | ||||
|---|---|---|---|---|
|
通常、サブルーチンによる妥当性検査を実行する場合、妥当性検査コマンド (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 | ||||
|---|---|---|---|---|
|
この例は、メイン・プログラム・ブロック内で 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 | ||||
|---|---|---|---|---|
|
この例は、サブルーチン内で 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 |