7.7.3 CALLCHECKの使用例

LANSA

7.7.3 CALLCHECKの使用例


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

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

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

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

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

通常、インライン妥当性検査を実行する場合、妥当性検査コマンド(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で制御が戻されます。

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

この例は、妥当性検査プログラムとして機能する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(*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に関する技術ノートを参照してください。

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

この例は、妥当性検査プログラムとして機能するRDMLファンクションが含まれるサブルーチン内でCALLCHECKコマンドを使用する方法を示しています。

ユーザーが要求された入力コードを入力すると、VALIDATEサブルーチンが呼び出されます。このサブルーチンは、ANUMBER RDMLプログラムを呼び出して、入力コードが正しい形式であるかどうかを検査します。ANUMBERプログラムが否定的な応答を返した場合、CALLCHECKコマンドで定義されているメッセージが発行され、DOUNTILループが再実行されます。ANUMBERプログラムが肯定的な応答を返した場合、DOUNTILループが終了し、検証済みの入力の処理が実行されます。

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(*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に関する技術ノートを参照してください。