テーブル検証ツール
概要と主要な概念
テーブル検証ツールを使用すると、特定のテーブルのデータに関する仮定を列挙してテストし、それらのテーブルに有効なデータが含まれていることを確認することができます。テーブル検証ツールの使用方法の詳細については、入力データの検証のトピックを参照してください。
検証アルゴリズム
独自の制約関数や失敗時のロジックの記述が必要なケースもあります。テーブル検証ツールでこれらのコンポーネントがどのように使われるかを理解しておくと役立ちます。テーブル検証ツールはデータの検証時に以下のアルゴリズムを使用します。
このツールは、ユーザーインターフェイスに表示される際、すべてのテーブルのすべての範囲を、まずテーブル順、次に範囲順でループします。このようにして、各範囲を訪問します。
ツールは、ある範囲を訪問するとその範囲に接続された各ルールに関連するコンテキストを作成します。コンテキストには、ルールに対するデフォルトの[エラーメッセージ]のコピーが格納されます。次に、ツールは範囲の各行を上から下へスキャンします。行内のセルは左から右へスキャンされます。
セルのスキャン時に、ツールは接続された各ルールの[制約]の関数を呼び出します。ルールは、[ルール]タブに表示されている順にテストされます。各ルールに対し、ツールはセルの値とルールに関連付けられたコンテキストを制約関数に渡します。関数がゼロ以外を返した場合、その値はルールを通過したことになります。
制約関数がゼロを返した場合、ツールはルールの失敗時コールバックを呼び出します。このコールバックにより、ユーザーは値の修復やエラーメッセージの更新を試すことができます。失敗時コールバックが0を返した場合、エラーメッセージが記録されます。
以下の擬似コードに、使用されるアルゴリズムの概要を示します。
for each table:
for each range:
for each rule:
create a context for the rule
for each row in the range:
for each column in the row:
value := table[row][col]
for each rule:
context := context associated with this rule
result := constraint(value, context)
if result = 0:
result := onFail(value, context)
if result = 0:
log an error
for each rule:
delete the context
このアルゴリズムで重要な部分はコンテキストです。コンテキストはシンプルデータタイプであり、処理フロートークンに似ています。コンテキストには複数の目的があります。
- コンテキストはラベルを格納できます。これにより、制約関数の呼び出しの間にデータを格納することができます。たとえば、列が並べ替えられているかどうかをチェックするルールは、コンテキストを使用して以前の値を格納します。列の合計をチェックするルールは、コンテキストを使用して現在の合計を格納します。
- コンテキストは、現在のテーブル、行、列など、アルゴリズムに関する多くの変数に対する読み取り専用アクセスを提供します。
- コンテキストは、ルールのエラーメッセージへのアクセスを提供するため、オプションで、ルールごとではなく値ごとに記録されるメッセージをカスタマイズすることができます。
- コンテキストはテーブルの現在の値へのアクセスを提供するため、失敗時コールバックで無効な値を修復することもできます。
[テーブル範囲]タブ
[テーブル範囲]タブには、次のプロパティがあります。
テーブルリスト
テーブルリストでは、テーブル検証ツールのテーブル参照のリストを編集できます。リスト内の項目を選択すると、そのプロパティがリストの右に表示されます。
テーブルエリア
テーブルエリアは、[テーブル範囲]タブの右上部分にあります。テーブルエリアには次のプロパティがあります。
- 名前 - テーブル参照の名前を編集します。テーブルが無効な場合、この名前がエラーメッセージに表示されます。
- テーブル - テーブルへの参照を編集します。このノードが評価され、テーブルへの参照が取得されます。通常はポインターですが、グローバルテーブルの名前、またはテーブルを返すコードを指定することもできます。
[範囲]エリア
[範囲]エリアは、[テーブル範囲]タブの右下部分にあります。[範囲]エリアには次のプロパティがあります。
- 範囲リスト - 範囲リストでは、選択したテーブル内の範囲セットを編集できます。
- 名前 - 現在選択されている範囲の名前を編集します。範囲の名前は記録されたエラーメッセージに表示されます。
- 範囲のタイプ - 範囲のタイプを編集します。実行できる値は次のとおりです。
- 列 - [値の範囲]によって指定された列内のすべての値を含む範囲です。ターゲットテーブルに行がない場合は、この範囲を空にすることができます。
- 行 - [値の範囲]によって指定された行内のすべての値を含む範囲です。
- 列ヘッダー - すべての列ヘッダーを含む範囲です。
- 行ヘッダー - すべての行ヘッダーを含む範囲です。ターゲットテーブルに行がない場合は、この範囲を空にすることができます。
- すべての値 - 行ヘッダーと列ヘッダーを除く、テーブル本体のすべてのセルを含む範囲です。
- カスタム - カスタム範囲はユーザーによって指定されます。この場合、[値の範囲]は、開始行、開始列、終了行、終了列の4つの値の配列を返す必要があります。行がない場合、この範囲は空となります。
- 値の範囲 - 現在の[範囲のタイプ]に値の範囲が必要な場合、値の範囲を編集します。
- ルール - 検証の一部としてこの範囲によってチェックされるべき一連のルールを編集します。
[ルール]タブ
[ルール]タブには次のプロパティがあります。
ルールリスト
ルールリストを使用し、このテーブル検証ツールで使用可能な一連のルールを編集できます。検証中、このリストで指定された順序でルールがチェックされます。
名前
[名前]プロパティでは、ルールの名前を編集できます。ルールの名前は記録されたエラーメッセージに表示されます。
制約
[制約]プロパティでは、値のテストに使用する関数を定義します。このフィールドのコードを編集することで関数を定義できます。この関数は、値がテストに合格した場合は1を、失敗の場合は0を返すことになります。
範囲が空の場合は失敗
このチェックボックスをオンにすると、このルールに接続された範囲が空の場合にエラーが記録されます。このチェックボックスをオフにできるのは、空にできる範囲のタイプ(列、行ヘッダー、およびカスタム)に接続されている場合、およびソーステーブルが0行で有効な場合(一致する行がないクエリなど)のみとなります。
エラーメッセージ
エラーメッセージプロパティでは、ルールのデフォルトのエラーメッセージを編集します。値がルールに一致しない場合、このメッセージがエラーログに表示されます。
失敗時
[失敗時]プロパティでは、コールバック関数を定義します。この関数はオプションです。この関数を使用すると、無効な値の修復やエラーメッセージの更新を行うことができます。この関数は1または0を返します。0が返された場合、エラーが記録されます。1が返された場合、その値は受け入れ可能であるとみなされ、エラーは記録されません。
[記録されたエラー]タブ
[記録されたエラー]タブには次のプロパティがあります。
[エラー]テーブル
検証ボタンをクリックすると、検証中に発生したすべてのエラーのリストが[エラー]テーブルに表示されます。指定のエラーに有効なテーブル、行、列がある場合、そのエラーをダブルクリックしてテーブルビューを開き、無効なセルを選択できます。