Page History
[ |../../index.htm#lansa/callcheck_e.htm]
現在地:
...
7.10.3 CALLCHECK の使用例
妥当性検査サブルーチンを使用するようファンクションを構築する
CALLCHECK コマンドを使用してインライン妥当性検査を実行する
CALLCHECK コマンドを使用してサブルーチンによる妥当性検査を実行する
| Anchor | ||||
|---|---|---|---|---|
|
通常、インライン妥当性検査を実行する場合、妥当性検査コマンド (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
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など) を使用するファンクションを以下のように構築します。 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/ENDCHECK コマンド・ブロック内の妥当性検査コマンドが妥当性検査エラーを検出すると、メイン・ファンクション・ループに #ERRORCNT > 0 で制御が戻されます。
| Anchor | ||||
|---|---|---|---|---|
|
この例は、妥当性検査プログラムとして機能する RDML ファンクションが含まれるプログラム・ブロック内でCALLCHECK コマンドを使用する方法を示しています。
要求された詳細をユーザーが入力すると、WORKDAY RDML プログラムが呼び出され、開始日が作業日に該当するかどうかが検査されます。WORKDAY プログラムが否定的な応答を戻した場合、定義されているメッセージが発行され、直前に表示されていた画面 (この例では Request 画面) にプログラム制御が戻されます。
DEF_
...
LIST NAME(#EMPBROWSE)
...
FIELDS(#EMPNO #STARTDTE)
BEGIN_LOOP
REQUEST FIELDS(#EMPNO #STARTDTE) BROWSELIST(#EMPBROWSE)
BEGINCHECK
CALLCHECK FIELD(#STARTDTE) BY_CALLING(WORKDAY)
...
PROG_TYPE(FUN)
...
MSGTXT('指定された日付は作業日ではありません。')
...
ENDCHECK
ADD_ENTRY TO_LIST(#EMPBROWSE)
END_LOOP
...
WORKDAY ファンクションは、以下のように定義されます。 FUNCTION OPTIONS
FUNCTION OPTIONS(*
...
DIRECT *
...
LIGHTUSAGE *
...
MLOPTIMISE *NUM_FIELD_VALIDATE)
...
DEFINE FIELD(#TESTDATEC)
...
TYPE(*CHAR)
...
LENGTH(6)
...
DEFINE FIELD(#TESTDATEN)
...
LENGTH(6)
...
DECIMALS(0)
...
REFFLD(#DATE)
...
EDIT_CODE(4)
...
DEFAULT(0)
...
TO_OVERLAY(#TESTDATEC)
...
DEFINE FIELD(#DAYOFWEEK)
...
TYPE(*CHAR)
...
LENGTH(3)
...
CHANGE FIELD(#TESTDATEN)
...
TO(#VALFLD$NV)
...
USE BUILTIN(CONVERTDATE)
...
WITH_ARGS(
...
#TESTDATEC B R) TO_GET(#DAYOFWEEK)
...
CASE OF_FIELD(#DAYOFWEEK)
...
WHEN VALUE_IS('=
...
MON'
...
'=
...
TUE'
...
'=
...
WED'
...
'=
...
THU'
...
'=
...
FRI')
...
CHANGE FIELD(#VALFLD$RT)
...
TO('''1''')
...
OTHERWISE
CHANGE FIELD(#VALFLD$RT)
...
TO('''0''')
...
ENDCASE
RETURN
複雑なロジックの妥当性検査ファンクションの作成に関する詳細については、FUNCTION コマンドのパラメータに関するセクションの *ALP_FIELD_VALIDATE および *NUM_FIELD_VALIDATE に関する技術ノートを参照してください。
| Anchor | ||||
|---|---|---|---|---|
|
この例は、妥当性検査プログラムとして機能するRDMLファンクションが含まれるサブルーチン内でCALLCHECK コマンドを使用する方法を示しています。
ユーザーが要求された入力コードを入力すると、VALIDATE サブルーチンが呼び出されます。このサブルーチンは、ANUMBER RDML プログラムを呼び出して、入力コードが正しい形式であるかどうかを検査します。ANUMBER プログラムが否定的な応答を返した場合、CALLCHECK コマンドで定義されているメッセージが発行され、DOUNTIL ループが再実行されます。ANUMBER ループが再実行されます。
ANUMBER プログラムが肯定的な応答を返した場合、DOUNTIL ループが終了し、検証済みの入力の処理が実行されます。 DEFINE FIELD
DEFINE FIELD(#ERRORCNT)
...
REFFLD(#STD_NUM)
DEF_
...
COND NAME(*NOERRORS)
...
COND('
...
#ERRORCNT =
...
0')
...
DEFINE FIELD(#INPUT)
...
TYPE(*CHAR)
...
LENGTH(7)
DEF_
...
LIST NAME(#EMPBROWSE)
...
FIELDS(#INPUT)
...
BEGIN_LOOP
DOUNTIL COND(*NOERRORS)
...
REQUEST FIELDS(#INPUT)
...
BROWSELIST(#EMPBROWSE)
...
EXECUTE SUBROUTINE(VALIDATE)
...
ENDUNTIL
ADD_ENTRY TO_LIST(#EMPBROWSE)
...
END_LOOP
SUBROUTINE NAME(VALIDATE)
CHANGE FIELD(#ERRORCNT) TO(0)
BEGINCHECK KEEP_COUNT(#ERRORCNT)
...
CALLCHECK FIELD(#INPUT)
...
BY_CALLING(ANUMBER)
...
PROG_TYPE(FUN)
...
MSGTXT('
...
The input code format must be Annnnnn.')
...
ENDCHECK IF_ERROR(*NEXT)
...
ENDROUTINE
ANUMBER プログラムは、以下のように定義されます。 FUNCTION OPTIONS
FUNCTION OPTIONS(*
...
DIRECT *
...
LIGHTUSAGE *
...
MLOPTIMISE *ALP_FIELD_VALIDATE)
...
DEFINE FIELD(#INPUT)
...
TYPE(*CHAR)
...
LENGTH(7)
...
DEFINE FIELD(#INPUTA1)
...
TYPE(*CHAR)
...
LENGTH(1)
...
TO_OVERLAY(#INPUT)
...
DEFINE FIELD(#INPUTA6)
...
TYPE(*CHAR)
...
LENGTH(6)
...
TO_OVERLAY(
...
#INPUT 2)
DEFINE FIELD(#DECIMAL)
...
TYPE(*DEC)
...
LENGTH(1)
...
DECIMALS(1)
...
DEFINE FIELD(#RTN_CODE)
...
TYPE(*CHAR)
...
LENGTH(1)
...
CHANGE FIELD(#INPUT)
...
TO(#VALFLD$AV)
...
USE BUILTIN(CHECKNUMERIC)
...
WITH_ARGS(
...
#INPUTA6 6 0) TO_GET(#STD_
...
NUM #DECIMAL #RTN_CODE)
...
IF COND('(
...
#INPUTA1 =
...
A) and (#RTN_
...
CODE =
...
Y)')
...
CHANGE FIELD(#VALFLD$RT)
...
TO('''1''')
...
ELSE
CHANGE FIELD(#VALFLD$RT)
...
TO('''0''')
...
ENDIF
RETURN
複雑なロジックの妥当性検査ファンクションの作成に関する詳細については、FUNCTION コマンドのパラメータに関するセクションの *ALP_FIELD_VALIDATE および *NUM_FIELD_VALIDATE に関する技術ノートを参照してください。
[ |../../index.htm#lansa/callcheck_e.htm]