メインコンテンツへスキップ
グループ要素を作成すると、Optional element ボックスは既定でオフになっており、つまりその要素は必須になります。FlexiLayout のマッチングでは、すべてのサブ要素に対してヌル仮説が生成された場合でも、必須のグループ要素には非ヌル仮説が生成されます。このような仮説のサブ要素のプロパティを確認するには、それらの Advanced セクションでコードを呼び出します。グループ要素がオプションの場合は、その要素に対してヌル仮説を生成できます (ヌル仮説の品質を上回る品質の非ヌル仮説が存在しない場合) 。 グループ要素で Optional element ボックスを選択することは推奨されません。これは、グループ要素が Optional element で、かつ検出されなかった場合 (品質がヌル仮説の品質より低い場合、またはその要素に対して関数 Dontfind() が呼び出された場合) 、そのサブ要素を呼び出すとエラーになるためです。ヌル仮説を持つグループでは、サブ要素の仮説が生成されないからです。このエラーを避けるには、まずグループ要素を確認する必要があります。IsNull チェックが True を返した場合は、どのサブ要素にもアクセスしてはいけません。 では、なぜオプションのグループ要素とそのヌル仮説が必要なのでしょうか。これは、画像上に field グループ全体が存在しない場合に必要です。その場合、それらを検索しても意味がありません。また、グループ要素に対して DontFind() メソッドを呼び出すことで、要素の検索を高速化できます。
ここでいう「呼び出す」とは、Advanced タブ内のいずれかのセクション、または Expression ウィンドウのブロックプロパティでコードを記述することを意味します。グループ要素のプロパティを、Relations で検索条件を設定する際に呼び出す場合は、IsNull チェックは自動的に行われます。これは、Advanced タブで Code をクリックすると確認できます。
これを説明するために、プロジェクト GroupSample.fsp (フォルダー %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group) を作成しました。 グループ要素 InvoiceRequisiteGroup の Properties ダイアログで、Optional element ボックスを選択しました。Advanced タブの Advanced pre-search relations セクションには、次のコードを記述しました。 if FormID.IsNull then Dontfind(); 次に、文書タイプを識別する要素が存在するかどうかを確認します。グループ要素 InvoiceRequisiteGroup より前に作成した要素 FormID を使って、既知の値 (“ID2015”) を持つ static text を検索します。文書上の identifier の値が Search text セクションで指定した値と一致すると、要素 FormID に対して非ヌル仮説が生成されます。一方、一致しない場合は static text FormID は検出されず、プログラムにグループ要素 InvoiceRequisiteGroup を検索しないよう指示します。つまり、オプションのグループ要素 InvoiceRequisiteGroup に対してヌル仮説を作成したことになります。 このプロジェクトには、合計金額 field の名前を探すために使用される要素 TotalSumHeader があります。この要素の Advanced pre-search relations セクションには、次のコードが入力されています。 Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot; このコードは、名前の検索が、要素 InvoiceDateHeader で表される日付フィールドの下側で実行されることを意味します。なお、この要素はグループ要素 InvoiceRequisiteGroup のサブ要素です。 バッチ内の両方のページに対して FlexiLayout のマッチング手順を実行してみましょう。1 ページ目では手順は正常に完了しましたが、2 ページ目に FlexiLayout を適用しようとすると、プログラムは次のエラー通知を表示します。“Page 2: Error in element “SearchElements.TotalSumHeader”, Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup” これは、2 ページ目では文書の identifier の値が ID 2589 だからです。この値は要素 FormID のプロパティで指定された値と異なるため、グループ要素 InvoiceRequisiteGroup に対して関数 Dontfind() がヌル仮説を生成しました。そのため、コード内で存在しない仮説を呼び出してしまったのです。 正しいコードは次のようになります。 if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then { Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
Advanced pre-search relations セクション内のコードをコメントアウトし、Relations セクションで要素 TotalSumHeader の同様の検索条件の横にあるフラグをアクティブ化すると、Advanced タブで Code をクリックしたときに、コンパイル済みコードにすでに IsNull チェックが含まれていることがわかります。