12 章 データの妥当性検査機能「オブジェクト指向」ということばが一般的になる 1980 年頃までは、「非手続き的」という言葉がありました。これは、プログラムの動作を手続きロジックで詳細に指示する代わりに、プログラムの主処理を記述する前に宣言的に動作を規定することを意味するものです。例えば、COBOL の報告書作成機能は、報告書のレイアウトや制御切れ、見出し、集計などをデータ部で宣言しておけば、手続き部は GENERATE 文を記述するだけで良いというものです。COBOL の言語仕様にはこのような「非手続き的」処理が少なくありません。
実行文の実際の動作が、そのオペランドの内部状態や型によって規定されると言う意味で、「非手続き的」という概念はそのまま「オブジェクト指向」に引き継がれています。
本章で述べる妥当性検査は、検査条件を事前に宣言しておき、手続き部のロジックではVALIDATE 文で一括して自動的な検査を行うものです。従って、これも COBOL が新たにサポートした「非手続き的」言語機能ということができます。

COBOL で記述される典型的なデータ処理プログラムでは、しばしば入力データの妥当性のチェックに大きなステップ数が費やされます。外部から取りこんだデータを業務データベースに格納する前にデータがクリーンなものであることを検証することが重要であるからです。COBOL 2002 の妥当性検査機能を使用すると、このようなプログラミングの生産性を大きく向上させることができます。

12.1 妥当性検査機能の概要
この機能によってチェックできる妥当性には、次のものがあります。

(1)形式妥当性
基本データ項目の内容が、それに対する PICTURE 句、USAGE 句、SIGN 句の記述に矛盾しないかどうかをチェックします。

(2)内容妥当性
データ項目の内容が、プログラマの定義する特定の値、範囲、字類、英大文字・小文字に合致しているかどうかをチェックします。

(3)関係妥当性
データ項目の内容が、他のデータ項目との関連についての条件を満たすかどうかをチェッ

COPYRIGHT

2001

COBOL コンソーシアム

1

クします。複数の入力値に対する複合条件のチェックが可能です。

内容妥当性と関係妥当性については、COBOL

2002 でデータ記述項に新たに追加された句によって、プログラマが定義できます。
これらのチェックは、手続き部で VALIDATE 文が明示的に実行されたときになされます。
プログラマは VALIDATE 文を使って次のことができます。

(1)各チェック対象項目を指定された送り先へ転記します。これを入力分配と呼びます。
形式妥当性に違反する場合に転記する省略時解釈値を DEFAULT 句で定義しておくこともできます。
(2) チェックの結果判明したエラーの種別に応じたステータス値を、ERROR 句で定義した項目に設定します。これをプログラムで判定することによって、詳細なエラー後の後始末を記述できます。
(3) チェックの結果エラーがあれば、その種別に応じた EC‑VALIDATE 例外が発生します。
従って、適切な USE 文が書かれた宣言手続きを実行させることができます。

12.2 妥当性検査機能のデータ部
内容妥当性と関係妥当性の検査条件を記述するための句が新たに追加されました。

12.2.1 ALLOW 句
ALLOW 句は、すべての検査に優先して許容される値を指定できます。ここに指定した、ひとつまたは複数の定数値があれば、他の検査の結果にかかわらずエラーとしません。

ALLOW[ONLY]

定数 1[ OR 定 数 2 ] …

[ WHEN 条 件 1 ]条件 1 には、ALLOW 句を適用するための前提条件を記述できます。まずこの条件が検査され、この結果が真であるときにだけ ALLOW 句は適用されます。
ONLY は、ここに指定された値だけが許容されることを示します。即ち、指定された定数値以外の値であれば、関係妥当性チェックのエラーと判断されます。

12.2.2 CLASS 句
CLASS 句は、字類の内容妥当性検査の仕様を指定します。この句の指定は、条件式の字類検査と同様です。

COPYRIGHT

2001

COBOL コンソーシアム

2NUMERICALPHABE TIC
ALPHABE TIC-LOWER
CLASS

IS

ALPHABE TIC-UPP ER
BO OLEAN
符号系名 1字類名 1

12.2.3 DEFAULT 句VALIDATE 文の実行によって、データ項目の内容は DESTINATION 句に書かれた送り先へ転記されます。このとき、もしデータ項目の内容が形式妥当性に違反しているか、空白であったら、この送り先へ転記することは無意味になってしまうかもしれません。
DEFAULT 句はこのような場合に代わりに転記する省略時解釈値を指定する。
定数 1
DE FAULT

IS

一意名 1
NO NE

NONE の指定は、データ項目の内容が形式妥当性に違反しているか、空白であったら転記を行わないことを意味します。

12.2.4 DESTINATION 句DESTINATION 句は、VALIDATE 文実行時のデータの転記先を指定します。

DE STINATION IS { 一 意 名 1 }…

12.2.5 ERROR 句ERROR 句は、妥当性検査の結果を自動的にフラグ項目に設定することを指示します。
定数 1
ERROR STATUS IS

定数 2
NO ERROR STATUS IS

COPYRIGHT

2001

FORMAT

一意名 1
ON

一意名 2

COBOL コンソーシアムCO NTE NT

FOR { 一 意 名 3 } …

RE LATION3例えば、次のプログラムは VALIDATE 文による SHORI‑CODE の内容検査に違反すると、「処理コードの内容不正」というメッセージを表示します。
01

ERROR-ME SSAGEPIC N(8 0) VALUE SPACEERROR STATUS IS N“処 理 コ ー ド の 内 容 不 正 ”
ON CO NTE NT SHORI-CODE .

VALIDATE SHORI-CODE .
DISPLAY ERROR-MESSAGE.

12.2.6 INVALID 句
INVALID 句は、関係妥当性の検査条件を指定します。
INVALID [ WHEN 条 件 1 ]この句が書かれたデータ項目に対する VALIDATE 文の実行時に条件 1 が検査され、結果が真であれば関係妥当性違反となります。

12.2.7 VALID/INVALID VALUE 句
妥当性検査機能の VALUE 句は、検査対象データ項目の記述項に従属する 88 レベルに書き、内容妥当性の検査仕様を指定します。
INVALID

VALUE

IS

VALID

VALUESARE

定数 1

THROUGH

定数 2

IN 符 号 系 名 1

THRU[ WHEN 条 件 1 ]WHEN 指定を書くと、内容妥当性検査に先だって条件 1 が検査され、結果が真であるときにだけ内容妥当性検査が行われます。
INVALID VALUE の場合は、定数で指定される値または範囲に適合する場合に内容妥当性違反になり、VALID VALUE の場合は、定数で指定される値または範囲に適合しない場合に内容妥当性違反になります。

COPYRIGHT

2001

COBOL コンソーシアム

4

12.3 VALIDATE 文VALIDATE 文の形式は、次のように簡潔です。
VALIDATE { 一 意 名 1 } …

一意名を複数個書いた場合は、各一意名に対する VALIDATE 文を順番に書いたのと同じ結果になります。
一意名が集団項目である場合、それに従属するすべての項目が妥当性検査の対象になります。 検査 対象の デー タ項目 には、 内部 的に暗 黙の 標識デ ータ 項目が 割り当 てら れ、VALIDATE 文による検査の結果を保持するのに使用されます。これを「内部標識」と呼びます。VALIDATE 文の実行開始時にすべての内部標識はゼロでクリアされます。
VALIDATE 文は以下の 5 段階で実行されます。

(1) 形式妥当性検査
すべての検査対象項目に対して、その内容が PICTURE 句、SIGN 句、USAGE 句の記述に矛盾しないかがチェックされ、違反している項目の内部標識には「形式が不当」の状態が記録されます。

(2) 入力分配
検査対象項目に DESTINATION 句が書かれていれば、その受け側への転記が行われます。

(3) 内容妥当性検査
検査対象項目に CLASS 句が書かれていれば、指定された字類検査が行われ、検査対象項目に INVALID 句 または VALID 句のある 88 項目が従属していれば、指定された値チェックが行われます。ここでの検査の結果違反が検出されると、違反している項目の内部標識には「内容が不当」の状態が記録されます。

(4) 関係妥当性検査
検査対象項目に INVALID 句か ALLOW ONLY 句が書かれていれば、指定された関係妥当性検査が行われます。ここでの検査の結果違反が検出されると、違反している項目の内部標識には「関係が不当」の状態が記録されます。
ONLY の無い ALLOW 句が書かれていれば、指定された許容値に一致する場合、ここまでの段階で設定された内部標識はゼロにリセットされます。

(5) 誤り指摘以上の検査の結果、内部標識がゼロでないものがひとつでもある場合、EC‑VALIDATE 例

COPYRIGHT

2001

COBOL コンソーシアム

5外が発生します。「形式が不当」の内部標識があれば、EC‑VALIDATE‑FORMAT 例外が発生し、「内容が不当」の内部標識があれば、EC‑VALIDATE‑CONTENT 例外が発生し、「関係が不当」の内部標識があれば、EC‑VALIDATE‑RELATION 例外が発生します。
次に、検査対象項目を FOR 指定に書いた ERROR 句のあるデータ項目への転記が行われます。

COPYRIGHT

2001

COBOL コンソーシアム

6