7.90.3 ON_ERROR の使用例

以下は、ON_ERRORコマンドの例です。

以下のRDML「入力および妥当性検査」プログラムについて考えます。

REQUEST    FIELDS(#A #B #C #D #E)
 
BEGINCHECK
FILECHECK  FIELD(#A) USING_FILE(ACHECK)
FILECHECK  FIELD(#B) USING_FILE(BCHECK)
FILECHECK  FIELD(#C) USING_FILE(CCHECK)
FILECHECK  FIELD(#D) USING_FILE(DCHECK)
FILECHECK  FIELD(#E) USING_FILE(ECHECK)
ENDCHECK
 

この妥当性検査ブロックは、前の検査に失敗した場合でも以降の検査がすべて実行されるため、あまり効率的とは言えません。例えば、#Aがエラーになった場合、#B、#C、#D、および#Eの検査は無駄になります。これは、ユーザーがフィールド#Aを修正したときに、これらのフィールドの検査を再度実行する必要があるからです。

ON_ERRORコマンドを使用すると、以下のように一連の「早期終了」を指定することで、上記の例ような妥当性検査ブロックの効率を高めることができます。

L10: REQUEST    FIELDS(#A #B #C #D #E)
 
     BEGINCHECK
     FILECHECK  FIELD(#A) USING_FILE(ACHECK)
     ON_ERROR   GOTO(L10)
     FILECHECK  FIELD(#B) USING_FILE(BCHECK)
     ON_ERROR   GOTO(L10)
     FILECHECK  FIELD(#C) USING_FILE(CCHECK)
     ON_ERROR   GOTO(L10)
     FILECHECK  FIELD(#D) USING_FILE(DCHECK)
     ON_ERROR   GOTO(L10)
     FILECHECK  FIELD(#E) USING_FILE(ECHECK)
     ENDCHECK
 

すなわち、検査に失敗すると、制御がREQUESTコマンドに戻され、修正を促すためにエラーの詳細が表示されます。当然ながら、この手法には、特定のフィールドがエラーになった場合に、その最初のエラーが修正されない限り、以降のすべてのフィールドが検査されないという欠点もあります。