7.35.2 ENDCHECKについてのコメント/警告
BEGINCHECK/ENDCHECKブロックはネスト可能です。ただし、「内側」ブロックでエラーが検出された場合は、関連付けられたすべての「外側」ブロックでもエラーがトリガーされます。
これは、以下のように表すことができます。
BEGINCHECK
BEGINCHECK
BEGINCHECK
A validation error in this block will "trigger" a
validation error at all levels (marked by <-).
ENDCHECK <-
ENDCHECK <-
ENDCHECK <-
BEGINCHECK/ENDCHECKコマンドのネスト機能は、データ入力用のブラウズ・リストが含まれる画面を処理する場合に特に役立ちます。以下のようなデータ入力画面について考えます。
受注番号 : 99999999
顧客番号 : 999999
納期 : 99/99/99
行
番号 製品 数量 価格
99 9999999 99999 99999.99
99 9999999 99999 99999.99
99 9999999 99999 99999.99
99 9999999 99999 99999.99
99 9999999 99999 99999.99
99 9999999 99999 99999.99
この方法で入力されたデータを処理するRDMLプログラムは、以下のようになります。
GROUP_BY NAME(#ORDERHEAD) FIELDS(#ORDNUM #CUSTNUM #DATEDUE)
DEF_LIST NAME(#ORDERLINE) FIELDS(#ORDLIN #PRODUCT #QUANTITY #PRICE)
SET_MODE TO(*ADD)
INZ_LIST NAMED(#ORDERLINE) NUM_ENTRYS(20)
L1: REQUEST FIELDS(#ORDERHEAD) BROWSELIST(#ORDERLINE)
BEGINCHECK
<< validate order header details >>
SELECTLIST NAMED(#ORDERLINE) GET_ENTRYS(*NOTNULL) <-
BEGINCHECK |
<< validate order line details >> |
IF_ERROR |
UPD_ENTRY IN_LIST(#ORDERLINE) |
ENDIF |
ENDCHECK IF_ERROR(*NEXT) |
|
ENDSELECT ------------------------------------------
ENDCHECK IF_ERROR(*LASTDIS)
<< update database >>
「内側」のBEGINCHECK/ENDCHECKループでは、ユーザーが入力した各ブラウズ・リスト項目が処理されます。また、IF_ERROR(*NEXT)パラメータにより、SELECTLISTループですべてのブラウズ・リスト項目の処理が継続され、エラーの初回検出時にこのループが停止しないことに注意してください。
「外側」のBEGINCHECK/ENDCHECKコマンドでは、IF_ERROR(*LASTDIS)パラメータが指定されているため、妥当性検査エラーが検出されると、REQUESTコマンドが再実行されます。妥当性検査エラーは、以下の場合に「検出」されます。
· 注文頭書きの詳細でエラーが見つかった場合。
または
· 1つ以上の明細行の詳細でエラーが見つかった場合。これは、「内側」の妥当性検査ブロックでのエラーにより「外側」の妥当性検査ブロックでエラーがトリガーされるためです。