> ## Documentation Index
> Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# グループ要素の Optional プロパティ

> FlexiLayout Studio でグループ要素を Optional としてマークすべきタイミング、ヌル仮説の動作、およびサブ要素の呼び出しで最初に IsNull チェックが必要な理由を確認してください。

グループ要素を作成すると、**オプション要素** ボックスは既定でオフになっており、つまりその要素は必須になります。FlexiLayout のマッチングでは、すべてのサブ要素に対してヌル仮説が生成された場合でも、必須のグループ要素には非ヌル仮説が生成されます。

このような仮説のサブ要素のプロパティを確認するには、それらの **Advanced** セクションでコードを呼び出します。グループ要素がオプションの場合は、その要素に対してヌル仮説を生成できます (ヌル仮説の品質を上回る品質の非ヌル仮説が存在しない場合) 。

<div id="why-calls-to-an-undetected-optional-group-fail">
  ## 検出されなかったオプションのグループに対する呼び出しが失敗する理由
</div>

グループ要素に対して **オプション要素** ボックスを選択しないでください。

その理由は、グループ要素が **オプション要素** としてマークされ、しかも検出されなかった場合 (その quality がヌル仮説の quality より低い場合、またはその要素に対して `Dontfind()` 関数が呼び出された場合) 、そのサブ要素のいずれかを呼び出すとエラーが発生するためです。これは、ヌル仮説を持つグループではサブ要素の仮説が生成されないためです。

このエラーを回避するには、まずグループ要素を確認する必要があります。`IsNull` チェックが `True` を返した場合は、どのサブ要素にもアクセスしないでください。

<div id="when-an-optional-group-element-is-useful">
  ## オプションの グループ要素が役立つ場合
</div>

オプションの グループ要素とそのヌル仮説は、画像上に field グループ全体が存在せず、それらを検索しても意味がない場合に必要です。グループ要素に対して `DontFind()` メソッドを呼び出すことで、要素の検索を高速化できます。

<Note>
  ここで「呼び出す」とは、**Advanced** タブ内のいずれかのセクション、または **Expression** ウィンドウのブロック プロパティにコードを記述することを意味します。**リレーション** で検索条件を設定する際に グループ要素のプロパティを参照する場合は、`IsNull` チェックが自動的に行われます。これは、**Advanced** タブで **Code** をクリックすると確認できます。
</Note>

<div id="the-groupsamplefsp-sample-project">
  ## GroupSample.fsp sample プロジェクト
</div>

これは、`GroupSample.fsp` sample プロジェクト (フォルダー `%public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group`) で示されています。

グループ要素 **InvoiceRequisiteGroup** の **Properties** ダイアログで、**オプション要素** ボックスが選択されています。

**Advanced** タブの **Advanced pre-search relations** セクションには、次のコードがあります。

```text theme={null}
if FormID.IsNull then Dontfind();
```

このコードは、文書タイプを識別する要素が存在するかどうかを確認します。グループ要素 **InvoiceRequisiteGroup** の前に作成された **FormID** 要素は、既知の値 ("ID2015") を持つ静的テキストを検索します。

文書上の識別子の値が **Search text** セクションで指定された値と一致すると、**FormID** 要素に対して非ヌル仮説が生成されます。一方、一致しない場合は、静的テキスト **FormID** は検出されず、FlexiLayout Studio はグループ要素 **InvoiceRequisiteGroup** を探さないよう指示されます。その場合、オプションのグループ要素 **InvoiceRequisiteGroup** に対してヌル仮説が作成されます。

プロジェクトには、合計金額fieldの名前を検索するために使用される要素 **TotalSumHeader** が含まれています。

この要素に対して、**Advanced pre-search relations** セクションに次のコードを入力します。

```text theme={null}
Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;
```

このコードは、名前の検索が **InvoiceDateHeader** 要素で示された日付フィールドの下で実行されることを意味します。さらに、この要素は グループ要素 **InvoiceRequisiteGroup** のサブ要素です。

<div id="reproduce-and-fix-the-undefined-hypothesis-error">
  ## 未定義の仮説エラーを再現して修正する
</div>

バッチ内の両方のページで FlexiLayout のマッチング手順を実行します。ページ 1 では手順は正常に完了しますが、FlexiLayout をページ 2 に適用すると、FlexiLayout Studio に次のエラーメッセージが表示されます。

```text theme={null}
"Page 2: Error in element "SearchElements.TotalSumHeader", Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup"
```

これは、ページ 2 ではドキュメントの識別子の値が ID 2589 であるために発生します。この値は **FormID** 要素のプロパティで指定された値と異なるため、`Dontfind()` 関数によってグループ要素 **InvoiceRequisiteGroup** に対するヌル仮説が生成されました。その結果、コードは存在しない仮説を呼び出してしまいました。

正しいコードは次のようになります。

```text theme={null}
if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then
{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
```

<Note>
  **Advanced pre-search relations** セクションのコードをコメントアウトし、**リレーション** セクションで **TotalSumHeader** 要素の類似する search constraint の横にあるチェックボックスをオンにした状態で、**Advanced** タブの **Code** をクリックすると、コンパイル済みコードにはすでに `IsNull` チェックが含まれていることがわかります。
</Note>
