7.45.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 行 No 製品 数量 価格 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つ以上の明細行の詳細でエラーが見つかった場合。これは、「内側」の妥当性検査ブロックでのエラーにより「外側」の妥当性検査ブロックでエラーがトリガーされるためです。