7.43.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コマンドが再実行されます。妥当性検査エラーは、以下の場合に「検出」されます。

または