> ## 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.

# 追加の FlexiLayout を作成するための ABBYY FlexiLayout Studio の特長

> ABBYY FlexiLayout Studio を使用して請求書用の追加 FlexiLayout を構築できます。RecordOfFCDataset などの関数でデータ セットにクエリを実行し、XML パラメーター ファイルを使用できます。

ABBYY FlexiLayout Studio には、請求書プロジェクト向けの追加の FlexiLayout を開発するための特長がいくつかあります。

* 請求書プロジェクトのメイン FlexiLayout の適用時に検出されたフィールドの領域を基準に、要素の位置を指定できます。
* ベンダーおよび事業部門の識別子を、Document Definition のデータ セットへのリクエストで使用できます。
* FlexiLayout のキーワードのリストやその他のパラメーターを XML ファイルにエクスポートできるため、FlexiLayout や Document Definition を編集しなくてもそれらを編集できます。

<div id="create-an-additional-flexilayout">
  ## 追加の FlexiLayout を作成する
</div>

<Steps>
  <Step title="FlexiCapture でバッチを開く">
    FlexiCapture で、認識済みの請求書を含むバッチを開きます。
  </Step>

  <Step title="FlexiLayout Studio プロジェクトを作成する">
    ABBYY FlexiLayout Studio で新しいプロジェクトを作成します。メイン メニューで、**Tools → Export Batch to FlexiLayout Studio → Create New FlexiLayout Studio Project...** を選択します。
  </Step>
</Steps>

<Note>
  このコマンドは、お使いのコンピューターに保存されている FlexiCapture プロジェクトでのみ使用できます。Distributed バージョンの FlexiCapture を使用していて、プロジェクトがサーバーに保存されている場合は、まず **Project** メニューの **Export Project...** をクリックして、プロジェクトをコンピューターにダウンロードします。
</Note>

<Note>
  ABBYY FlexiLayout Studio プロジェクトの接尾辞は、プロジェクト作成時点の Document Definition のバージョンを示します。
</Note>

作成した ABBYY FlexiLayout Studio プロジェクトには、FlexiCapture のバッチに含まれるすべてのドキュメントに加え、認識時に検出された field region が **reference layout** の形で含まれています。

| Tree               | Node                     | Description                                                                                                                                                                                                                                                                          |
| ------------------ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **SearchElements** | **CommonBlockRegions**   | このノードには、Document Definition のすべての field に対応する要素が含まれています。FlexiCapture で各ドキュメントに FlexiLayouts が適用された際に検出された blocks のすべての region の座標が、ABBYY FlexiLayout Studio プロジェクトに保存されます。既定では、これらの座標を持つ region は、Document Definition の field と同じ名前の要素に割り当てられます。これにより、要素の相対位置を指定したり、新しい要素を作成したりできます。 |
| **SearchElements** | **CustomSearchElements** | このノードにはサンプル要素が含まれています。FlexiLayout の適用時に干渉しないよう、既定では無効になっています。<br /><br />**DataSetRequestSample** — Document Definition に保存されているベンダーと事業部門の データ セット への request の例です。この データ セット には、ベンダーと事業部門の識別子が含まれています。                                                                              |

<div id="add-a-field-to-an-additional-flexilayout">
  ## 追加の FlexiLayout にfieldを追加する
</div>

追加の FlexiLayout にfieldを追加するには、そのfield用のブロックを作成し、その検索要素を指定します。

Document Definition 内のfieldには一意の名前が必要です。つまり、次のことを意味します。

* fieldの検索ロジックを記述するには、一意の名前を持つブロックを作成します。
* すでに Document Definition に存在するfieldの検索ロジックを変更するには、同じ名前のブロックを作成します。

<div id="add-pages-to-an-additional-flexilayout">
  ## 追加のFlexiLayoutにページを追加する
</div>

新しい画像で追加のFlexiLayoutに加えた変更をテストする場合は、FlexiCapture の Batches を ABBYY FlexiLayout Studio の既存の請求書プロジェクトにエクスポートできます。Batches をエクスポートするには、**Tools → Export Batch to FlexiLayout Studio → Add to Existing FlexiLayout Studio Project...** をクリックします。

* FlexiCapture の Batches は、**Tools → Export Batch to FlexiLayout Studio → Create New FlexiLayout Studio Project...** を選択して作成した ABBYY FlexiLayout Studio プロジェクトにのみエクスポートできます。
* FlexiCapture の batch を ABBYY FlexiLayout Studio にエクスポートすると、その batch 用の新しい batch が ABBYY FlexiLayout Studio に作成されます。
* 新しい Document Definition に、ABBYY FlexiLayout Studio プロジェクトで使用している Document Definition より多くの fields がある場合、エクスポートログには追加された field ごとに警告が記録されます。
* プログラムが追加された fields もエクスポートするようにするには、追加された field ごとに、**SearchElements** ツリーの **CommonBlockRegions** ノードに同じ名前のブロックを追加します。

<div id="make-requests-to-data-sets-from-the-document-definition">
  ## Document Definition からデータ セットにリクエストを送信する
</div>

サンプルリクエストは **DataSetRequestSample** 要素にあります。この要素はデフォルトで無効になっています。

| 型                                                   | 説明                            |
| --------------------------------------------------- | ----------------------------- |
| **NamedValue**                                      | 名前付きの値。                       |
| *コンストラクター*                                          |                               |
| `NamedValue( String, String )`                      |                               |
| *メソッド*                                              |                               |
| `String Name()`                                     | 名前付きの値の名前を返します。               |
| `String Value()`                                    | 名前付きの値の値を返します。                |
| **NamedValueArray**                                 | 名前付きの値の配列。                    |
| *コンストラクター*                                          |                               |
| `NamedValueArray()`                                 |                               |
| `NamedValueArray( NamedValue namedValue )`          |                               |
| *メソッド*                                              |                               |
| `Int Count()`                                       | 配列内の要素の総数を返します。               |
| `NamedValue GetAt( Int index )`                     | 指定した index の要素を返します。          |
| `Void Add( NamedValue namedValue )`                 | 配列に名前付きの値を追加します。              |
| `Void Add( NamedValueArray namedValueArray )`       | 名前付きの値の配列に、別の名前付きの値の配列を追加します。 |
| `Void InsertAt( Int index, NamedValue namedValue )` | 指定した位置 index に名前付きの値を挿入します。   |
| `Void DeleteAll()`                                  | 配列内のすべての要素を削除します。             |
| `Void DeleteAt( Int index )`                        | 指定した位置 index の要素を削除します。       |
| `Int FindByName( String name )`                     | name で指定した名前の値の位置を返します。       |

<div id="functions">
  ### 関数
</div>

構文:

* ABBYY FlexiLayout Studio で FlexiLayout を操作する際、データ セットにアクセスするには、Document Definition へのパスとデータ セット名を使用します。
* コンパイル済みの FlexiLayout を FlexiCapture の Document Definition に追加した後は、データ セットへのアクセス時にその名前のみが使用されます。
* **connectionString** の形式:

  ```
  "dbtype=FCDataset;fcTemplate=path_to_Document_Definition;datasetName=name_of_Data_Set;"
  ```

  **注:** パスの各部分は二重バックスラッシュ (`\\`) で区切ってください。
* **searchFields** — 値を取得する列名の配列。
* **searchCriteria** — **Column-Entry** ペアの配列。空の場合はすべての値を返します。
  * リクエストに 1 つの field に対する複数の値が含まれる場合は、**OR** 演算子を使用します。
  * リクエストに、それぞれが 1 つの field にのみ対応する複数の値が含まれる場合は、**AND** 演算子を使用します。
  * リクエストに 1 つの field に対する複数の値と、複数の fields に対する値が含まれる場合は、1 つの field に対する複数の値を区別するために **OR** 演算子を使用し、複数の fields の値を結合するために **AND** 演算子を使用します。

| Definition                                                                                                                                                                                                                            | Description                                                                                                                                                       |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Logic TestAccessToFCDataSet( String connectionString )`                                                                                                                                                                              | データ セットへの接続をテストします。                                                                                                                                               |
| `Logic TestFCDataSetSearchCriteria( String connectionString, StringArray searchFields, NamedValueArray searchCriteria )`                                                                                                              | データ セットの検索条件をテストします。                                                                                                                                              |
| `StringArray FieldNamesOfFCDataset( String connectionString )`                                                                                                                                                                        | データ セット内のすべての field のリストを、インデックス番号の昇順で返します。                                                                                                                       |
| `StringArray FieldNamesOfFCDataset( String connectionString, StringArray searchFields )`                                                                                                                                              | 指定したデータ セットのデータ セット field のリストを、インデックス番号の昇順で返します。複合列がある場合は、RecordOfFCDataset 関数と組み合わせて使用する必要があります。                                                                |
| `Int RecordCountOfFCDataset( String connectionString, StringArray searchFields, NamedValueArray searchCriteria )`                                                                                                                     | 検索条件で指定されたデータ セット内のエントリ数を返します。RecordOfFCDataset 関数を使用して返される可能性があるエントリ数を確認するために使用します。                                                                              |
| `Void PrepareRecordsetOfFCDataset( String connectionString, StringArray searchFields, NamedValueArray searchCriteria, Int maxRecordsCount = DefaultMaxRecordsCount )`                                                                 | データ セットへのクエリに使用するデータを準備します。これは、RecordOfFCDataset 関数を呼び出す前に、新しい検索条件の set ごとに実行する必要があります。                                                                           |
| `StringArray RecordOfFCDataset( String connectionString, StringArray searchFields, NamedValueArray searchCriteria, Int rowIndex )`                                                                                                    | データ セットへのクエリ結果のうち、*rowIndex* 番のエントリから値の配列を返します。値の数は、searchFields で渡された field の数と等しくなります (複合列の場合も含みます) 。                                                           |
| `Quality ValidateByFCDataSet( String word, String connectionString, Int fieldIndex, NamedValueArray searchCriteria, Int maxErrors, Rational maxErrorsPart, Logic ignoreSpaces = true, Int maxRecordsCount = DefaultMaxRecordsCount )` | 文字列 *word* の品質を返します。field のインデックス番号を受け取ります。インデックス番号は、FieldNamesOfFCDataset 関数の出力に indexing して取得できます。                                                              |
| `Void SearchTextFromFCDataSet( String connectionString, Int fieldIndex, NamedValueArray searchCriteria, Int maxRecordsCount = DefaultMaxRecordsCount )`                                                                               | Static Text 関数の単語に対する検索条件を指定するために使用します。この関数が呼び出されると、既存の検索条件は新しい条件に置き換えられます。field のインデックス番号を受け取ります。インデックス番号は、FieldNamesOfFCDataset 関数の出力に indexing して取得できます。       |
| `Void RegularExpressionFromFCDataSet( String connectionString, Int fieldIndex, NamedValueArray searchCriteria, Int maxRecordsCount = DefaultMaxRecordsCount )`                                                                        | CharString 関数に対して、正規表現を使用した検索条件を指定するために使用します。この関数が呼び出されると、既存の検索条件は新しい条件に置き換えられます。field のインデックス番号を受け取ります。インデックス番号は、FieldNamesOfFCDataset 関数の出力に indexing して取得できます。 |

<div id="search-for-rows-from-a-column-in-an-external-database-on-an-image">
  ### 画像上の外部データベースで、列を指定して行を検索する
</div>

<Steps>
  <Step title="列の一覧を取得する">
    FieldNamesOfFCDataset を使用して、インデックス番号の昇順に並んだ列の一覧を取得します。
  </Step>

  <Step title="列のインデックスを特定する">
    検索するデータが含まれる列のインデックス番号を特定します。
  </Step>

  <Step title="フィルターを作成する">
    データ セットからデータを絞り込むための条件の配列を作成します。
  </Step>

  <Step title="検索を実行する">
    列のインデックス番号とフィルター条件を SearchTextFromFCDataSet に渡します (正規表現を使用する必要がある場合は RegularExpressionFromFCDataSet) 。
  </Step>
</Steps>

このコードは、認識済みバッチが FlexiCapture からエクスポートされる際に自動生成されます。

<div id="search-an-image-for-entries-from-multiple-columns">
  ### 複数の列のエントリを画像内で検索する
</div>

検索パラメーターは **SearchTextFromFCDataSet** 関数を呼び出すたびに置き換えられるため、この関数を繰り返し呼び出しても効果はありません。回避策として、外部データベースから文字列を取得し、それらを **SearchText** 関数に渡します。**SearchText** 関数は、各文字列を既存の検索パラメーターに置き換えるのではなく追加します。

<Steps>
  <Step title="列を一覧化する">
    検索対象のデータが含まれる列名の配列を作成します。
  </Step>

  <Step title="フィルターを作成する">
    データ セット内のデータを絞り込むためのフィルター条件の配列を作成します。
  </Step>

  <Step title="エントリ数を数える">
    **RecordCountOfFCDataset** 関数を使用して、返されるエントリ数を確認します。
  </Step>

  <Step title="クエリを準備する">
    **PrepareRecordsetOfFCDataset** 関数を使用してクエリデータを準備します。
  </Step>

  <Step title="各レコードを読み取る">
    すべてのレコードを順に処理し、**RecordOfFCDataset** メソッドを使用して各レコードの配列を取得します。
  </Step>

  <Step title="値を SearchText に渡す">
    配列内の各要素の値を **SearchText** 関数に渡します。
  </Step>
</Steps>

<div id="additional-considerations-for-complex-columns">
  ### 複合列に関する追加の考慮事項
</div>

* **FieldNamesOfFCDataset** 関数は、複合列の名前が複数回含まれる array を返します。出現回数は、エンコードされた外部データベース内の列インスタンス数と同じです。

  *例*: `{VendorId, VATID, Name, Name, Name, City}`。この場合、外部データベースには、データ セット 内の 1 つの複合列 **Name** に対応する列が 3 つあります。
* **SearchCriteria** に複合列に対応する field の条件が含まれている場合 (上記の例のように) 、その条件はそれらすべての列インスタンスに対してチェックされます。
* **searchFields** に複合列に対応する field の条件が含まれている場合 (上記の例のように) 、結果には各列インスタンスの値の array が含まれます。

  たとえば、`{VendorId, VATID, Name, Name, Name, City}` に対して次のように要求すると:

  ```
  searchFields = { VATID, Name, City}, 次を受け取ります
  {VATID_value, Name_valueInColumn1, Name_valueInColumn2, Name_valueInColumn3, City_value}
  ```
* **searchFields** array を **FieldNamesOfFCDataset** 関数に渡すことで、返される columns の List を取得できます。

<div id="make-a-request-to-an-xml-file-that-contains-flexilayout-settings">
  ## FlexiLayout 設定を含む XML ファイルへのリクエストを行う
</div>

FlexiLayout 設定を含む XML ファイルに対しては、ABBYY FlexiLayout Studio の Documentation で説明されている 2 つの標準関数を使用してリクエストを行うことができます。

```
StringArray ReadFromXML(String filename, String xPathQuery)
String ReadSingleStringFromXML(String filename, String xPathQuery)
```

ABBYY FlexiLayout Studio で FlexiLayout の作業時にこのファイルを使用するには、このファイルをプロジェクト フォルダーまたはそのサブフォルダーに配置します。ファイルのパスは、ABBYY FlexiLayout Studio のプロジェクト ファイルからの相対パスです。

コンパイル済みの FlexiLayout を FlexiCapture の Document Definition にロードし、additional FlexiLayout として使用する場合、XML ファイルは **Templates** フォルダーに配置され、編集できます。FlexiLayout が適用されると、プログラムがこのファイルへのアクセスを自動的に管理します。
