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

# Fonctionnalités spéciales d’ABBYY FlexiLayout Studio pour créer des FlexiLayouts supplémentaires

> Créez des FlexiLayouts de factures supplémentaires avec ABBYY FlexiLayout Studio : interrogez des jeux de données avec des fonctions comme RecordOfFCDataset et utilisez des fichiers de paramètres XML.

ABBYY FlexiLayout Studio offre plusieurs fonctionnalités spéciales pour développer des FlexiLayouts supplémentaires pour les projets de factures :

* Vous pouvez définir l’emplacement des éléments par rapport aux régions des champs détectés lors de l’application du FlexiLayout principal du projet de factures.
* Les identifiants des fournisseurs et des unités commerciales peuvent être utilisés dans les requêtes adressées au jeu de données de la Document Definition.
* Les listes de mots-clés et les autres paramètres d’un FlexiLayout peuvent être exportés vers un fichier XML, ce qui permet de les modifier sans avoir à modifier le FlexiLayout ni la Document Definition.

<div id="create-an-additional-flexilayout">
  ## Créer un FlexiLayout supplémentaire
</div>

<Steps>
  <Step title="Ouvrir un lot dans FlexiCapture">
    Ouvrez un lot contenant des factures reconnues dans FlexiCapture.
  </Step>

  <Step title="Créer un projet FlexiLayout Studio">
    Créez un nouveau projet dans ABBYY FlexiLayout Studio. Dans le menu principal, sélectionnez **Tools → Export Batch to FlexiLayout Studio → Create New FlexiLayout Studio Project...**.
  </Step>
</Steps>

<Note>
  Cette commande n’est disponible que pour les projets FlexiCapture stockés sur votre ordinateur. Si vous utilisez la version Distributed de FlexiCapture et que le projet est stocké sur le serveur, téléchargez-le d’abord sur votre ordinateur en cliquant sur **Export Project...** dans le menu **Project**.
</Note>

<Note>
  Le suffixe du projet ABBYY FlexiLayout Studio indique la version de la Document Definition au moment de la création du projet.
</Note>

Le projet ABBYY FlexiLayout Studio que vous venez de créer contient tous les documents du lot FlexiCapture, ainsi que les régions de champ détectées lors de la reconnaissance, sous la forme d’une **Disposition de référence**.

| Arborescence       | Nœud                     | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| ------------------ | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **SearchElements** | **CommonBlockRegions**   | Ce nœud contient des éléments correspondant à tous les champs de la Document Definition. Les coordonnées de toutes les régions de blocs détectées lors de l’application des FlexiLayouts à chaque document dans FlexiCapture sont enregistrées dans le projet ABBYY FlexiLayout Studio. Par défaut, les régions ayant ces coordonnées sont attribuées à des éléments portant le même nom que les champs de la Document Definition. Cela permet de les utiliser pour définir la position relative des éléments et créer de nouveaux éléments. |
| **SearchElements** | **CustomSearchElements** | Ce nœud contient des exemples d’éléments. Ils sont désactivés par défaut afin d’éviter toute interférence lors de l’application du FlexiLayout.<br /><br />**DataSetRequestSample** — Exemple de requête vers le jeu de données des fournisseurs et des unités commerciales stocké dans la Document Definition. Ce jeu de données inclut les identifiants des fournisseurs et des unités commerciales.                                                                                                                                       |

<div id="add-a-field-to-an-additional-flexilayout">
  ## Ajouter un champ à un FlexiLayout supplémentaire
</div>

Pour ajouter un champ à un FlexiLayout supplémentaire, créez un bloc pour ce champ et définissez son élément de recherche.

Les champs de la Document Definition doivent avoir des noms uniques. Cela signifie que :

* Pour décrire la logique de recherche d’un champ, créez un bloc avec un nom unique.
* Pour modifier la logique de recherche d’un champ qui existe déjà dans la Document Definition, créez un bloc portant le même nom.

<div id="add-pages-to-an-additional-flexilayout">
  ## Ajouter des pages à un FlexiLayout supplémentaire
</div>

Si vous souhaitez tester sur de nouvelles images les modifications apportées à un FlexiLayout supplémentaire, vous pouvez exporter vos lots FlexiCapture vers un projet de factures existant dans ABBYY FlexiLayout Studio. Pour exporter vos lots, cliquez sur **Outils → Export Batch to FlexiLayout Studio → Ajouter au projet FlexiLayout Studio existant...**.

* Vous pouvez exporter des lots FlexiCapture uniquement vers des projets ABBYY FlexiLayout Studio créés en sélectionnant **Outils → Export Batch to FlexiLayout Studio → Create New FlexiLayout Studio Project...**.
* Lorsque vous exportez un lot FlexiCapture vers ABBYY FlexiLayout Studio, un nouveau lot correspondant à ce lot est créé dans ABBYY FlexiLayout Studio.
* Si la nouvelle Document Definition comporte plus de champs que la Document Definition utilisée pour le projet ABBYY FlexiLayout Studio, le journal d’exportation contient un avertissement pour chaque champ supplémentaire.
* Pour que le programme exporte les champs supplémentaires, ajoutez, pour chaque champ supplémentaire, un bloc portant le même nom dans le nœud **CommonBlockRegions** de l’arborescence **SearchElements**.

<div id="make-requests-to-data-sets-from-the-document-definition">
  ## Effectuer des requêtes sur les jeux de données à partir de la Document Definition
</div>

Vous trouverez un exemple de requête dans l’élément **DataSetRequestSample**. Cet élément est désactivé par défaut.

| Type                                                | Description                                                                 |
| --------------------------------------------------- | --------------------------------------------------------------------------- |
| **NamedValue**                                      | Une valeur nommée.                                                          |
| *Constructeur*                                      |                                                                             |
| `NamedValue( String, String )`                      |                                                                             |
| *Méthodes*                                          |                                                                             |
| `String Name()`                                     | Renvoie le nom d’une valeur nommée.                                         |
| `String Value()`                                    | Renvoie la valeur d’une valeur nommée.                                      |
| **NamedValueArray**                                 | Un tableau de valeurs nommées.                                              |
| *Constructeurs*                                     |                                                                             |
| `NamedValueArray()`                                 |                                                                             |
| `NamedValueArray( NamedValue namedValue )`          |                                                                             |
| *Méthodes*                                          |                                                                             |
| `Int Count()`                                       | Renvoie le nombre total d’éléments du tableau.                              |
| `NamedValue GetAt( Int index )`                     | Renvoie l’élément correspondant à l’indice spécifié.                        |
| `Void Add( NamedValue namedValue )`                 | Ajoute une valeur nommée au tableau.                                        |
| `Void Add( NamedValueArray namedValueArray )`       | Ajoute un tableau de valeurs nommées à un autre tableau de valeurs nommées. |
| `Void InsertAt( Int index, NamedValue namedValue )` | Insère la valeur nommée à l’indice spécifié.                                |
| `Void DeleteAll()`                                  | Supprime tous les éléments du tableau.                                      |
| `Void DeleteAt( Int index )`                        | Supprime l’élément à l’indice spécifié.                                     |
| `Int FindByName( String name )`                     | Renvoie la position de la valeur nommée name.                               |

<div id="functions">
  ### Fonctions
</div>

Syntaxe :

* Le chemin vers la Document Definition et le nom du jeu de données sont utilisés pour accéder au jeu de données lorsque vous travaillez avec un FlexiLayout dans ABBYY FlexiLayout Studio.
* Une fois un FlexiLayout compilé ajouté à une Document Definition dans FlexiCapture, seul son nom est utilisé pour accéder au jeu de données.
* Format de **connectionString** :

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

  **Remarque :** Séparez les parties du chemin par des doubles barres obliques inverses (`\\`).
* **searchFields** — Tableau des noms des colonnes dont les valeurs doivent être récupérées.
* **searchCriteria** — Tableau de paires **Column-Entry** ; renvoie toutes les valeurs s’il est vide.
  * Si une requête contient plusieurs valeurs pour un même champ, utilisez l’opérateur **OR**.
  * Si une requête contient plusieurs valeurs, chacune correspondant à un seul champ, utilisez l’opérateur **AND**.
  * Si une requête contient plusieurs valeurs pour un même champ et des valeurs pour plusieurs champs, utilisez l’opérateur **OR** pour distinguer les valeurs multiples d’un même champ et l’opérateur **AND** pour combiner les valeurs de différents champs.

| Définition                                                                                                                                                                                                                            | Description                                                                                                                                                                                                                                                                                                                                                                |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `Logic TestAccessToFCDataSet( String connectionString )`                                                                                                                                                                              | Teste la connexion au jeu de données.                                                                                                                                                                                                                                                                                                                                      |
| `Logic TestFCDataSetSearchCriteria( String connectionString, StringArray searchFields, NamedValueArray searchCriteria )`                                                                                                              | Teste les conditions de recherche du jeu de données.                                                                                                                                                                                                                                                                                                                       |
| `StringArray FieldNamesOfFCDataset( String connectionString )`                                                                                                                                                                        | Renvoie une liste de tous les champs du jeu de données, triés par ordre croissant de leur indice.                                                                                                                                                                                                                                                                          |
| `StringArray FieldNamesOfFCDataset( String connectionString, StringArray searchFields )`                                                                                                                                              | Renvoie une liste des champs du jeu de données spécifié, par ordre croissant de leur indice. Doit être utilisée avec la fonction RecordOfFCDataset lorsqu’il existe des colonnes complexes.                                                                                                                                                                                |
| `Int RecordCountOfFCDataset( String connectionString, StringArray searchFields, NamedValueArray searchCriteria )`                                                                                                                     | Renvoie le nombre d’entrées du jeu de données spécifiées dans les conditions de recherche. Permet de déterminer combien d’entrées peuvent être renvoyées à l’aide de la fonction RecordOfFCDataset.                                                                                                                                                                        |
| `Void PrepareRecordsetOfFCDataset( String connectionString, StringArray searchFields, NamedValueArray searchCriteria, Int maxRecordsCount = DefaultMaxRecordsCount )`                                                                 | Prépare les données pour une requête sur le jeu de données. Cette opération doit être effectuée pour chaque nouvel ensemble de conditions de recherche avant d’appeler la fonction RecordOfFCDataset.                                                                                                                                                                      |
| `StringArray RecordOfFCDataset( String connectionString, StringArray searchFields, NamedValueArray searchCriteria, Int rowIndex )`                                                                                                    | Renvoie un tableau de valeurs de l’entrée portant le numéro *rowIndex* parmi les résultats renvoyés par une requête sur le jeu de données. Le nombre de valeurs est égal au nombre de champs passés dans searchFields (y compris dans le cas de colonnes complexes).                                                                                                       |
| `Quality ValidateByFCDataSet( String word, String connectionString, Int fieldIndex, NamedValueArray searchCriteria, Int maxErrors, Rational maxErrorsPart, Logic ignoreSpaces = true, Int maxRecordsCount = DefaultMaxRecordsCount )` | Renvoie la qualité de la chaîne *word*. Accepte les numéros d’indice des champs. Vous pouvez obtenir ces numéros d’indice en indexant la sortie de la fonction FieldNamesOfFCDataset.                                                                                                                                                                                      |
| `Void SearchTextFromFCDataSet( String connectionString, Int fieldIndex, NamedValueArray searchCriteria, Int maxRecordsCount = DefaultMaxRecordsCount )`                                                                               | Utilisé pour spécifier des conditions de recherche de mots pour la fonction Static Text. Lorsque cette fonction est appelée, les conditions de recherche existantes sont remplacées par de nouvelles. Accepte les numéros d’indice de champ. Vous pouvez obtenir ces numéros d’indice en indexant la sortie de la fonction FieldNamesOfFCDataset.                          |
| `Void RegularExpressionFromFCDataSet( String connectionString, Int fieldIndex, NamedValueArray searchCriteria, Int maxRecordsCount = DefaultMaxRecordsCount )`                                                                        | Utilisé pour spécifier des conditions de recherche à l’aide d’expressions régulières pour la fonction CharString. Lorsque cette fonction est appelée, les conditions de recherche existantes sont remplacées par de nouvelles. Accepte les numéros d’indice de champ. Vous pouvez obtenir ces numéros d’indice en indexant la sortie de la fonction FieldNamesOfFCDataset. |

<div id="search-for-rows-from-a-column-in-an-external-database-on-an-image">
  ### Rechercher des lignes à partir d’une colonne dans une base de données externe sur une image
</div>

<Steps>
  <Step title="Lister les colonnes">
    Utilisez FieldNamesOfFCDataset pour obtenir une liste des colonnes triées par ordre croissant de leur indice.
  </Step>

  <Step title="Trouver l’indice de la colonne">
    Déterminez le numéro d’indice de la colonne dans laquelle vous devez rechercher des données.
  </Step>

  <Step title="Créer le filtre">
    Créez un array de conditions pour filtrer les données du jeu de données.
  </Step>

  <Step title="Exécuter la recherche">
    Transmettez à SearchTextFromFCDataSet les numéros d’indice de la colonne et les conditions de filtre (ou à RegularExpressionFromFCDataSet si vous devez utiliser des expressions régulières).
  </Step>
</Steps>

Ce code est généré automatiquement lorsqu’un lot reconnu est exporté depuis FlexiCapture.

<div id="search-an-image-for-entries-from-multiple-columns">
  ### Rechercher dans une image des entrées issues de plusieurs colonnes
</div>

Comme les paramètres de recherche sont remplacés chaque fois que vous appelez la fonction **SearchTextFromFCDataSet**, l’appeler plusieurs fois n’a aucun effet. Pour contourner ce problème, récupérez des string depuis une base de données externe et transmettez-les à la fonction **SearchText**, qui ajoute chaque string aux paramètres de recherche existants au lieu de les remplacer.

<Steps>
  <Step title="Lister les colonnes">
    Créez un tableau des noms des colonnes dans lesquelles vous devez trouver des données.
  </Step>

  <Step title="Créer le filtre">
    Créez un tableau de conditions de filtre pour filtrer les données du jeu de données.
  </Step>

  <Step title="Compter les entrées">
    Déterminez le nombre d’entrées renvoyées à l’aide de la fonction **RecordCountOfFCDataset**.
  </Step>

  <Step title="Préparer la requête">
    Préparez les données de la requête à l’aide de la fonction **PrepareRecordsetOfFCDataset**.
  </Step>

  <Step title="Lire chaque record">
    Parcourez tous les records et récupérez le tableau de chaque record à l’aide de la méthode **RecordOfFCDataset**.
  </Step>

  <Step title="Transmettre les valeurs à SearchText">
    Transmettez la valeur de chaque élément du tableau à la fonction **SearchText**.
  </Step>
</Steps>

<div id="additional-considerations-for-complex-columns">
  ### Considérations supplémentaires concernant les colonnes complexes
</div>

* La fonction **FieldNamesOfFCDataset** renvoie un tableau contenant plusieurs occurrences du nom de la colonne complexe. Le nombre d'occurrences est identique au nombre d'instances de colonnes dans une base de données externe encodée.

  *Exemple* : `{VendorId, VATID, Name, Name, Name, City}`. Dans ce cas, la base de données externe contient trois colonnes pour l'unique colonne complexe **Name** dans le jeu de données.
* Si **SearchCriteria** contient une condition pour un champ correspondant à une colonne complexe (comme dans l'exemple ci-dessus), cette condition est utilisée pour vérifier toutes les instances de cette colonne.
* Si **searchFields** contient une condition pour un champ correspondant à une colonne complexe (comme dans l'exemple ci-dessus), le résultat contient le tableau des valeurs de chaque instance de colonne.

  Par exemple, si vous demandez les éléments suivants pour `{VendorId, VATID, Name, Name, Name, City}` :

  ```
  searchFields = { VATID, Name, City}, vous recevrez
  {VATID_value, Name_valueInColumn1, Name_valueInColumn2, Name_valueInColumn3, City_value}
  ```
* Vous pouvez obtenir la liste des colonnes renvoyées en passant le tableau **searchFields** à la fonction **FieldNamesOfFCDataset**.

<div id="make-a-request-to-an-xml-file-that-contains-flexilayout-settings">
  ## Effectuer une requête sur un fichier XML contenant des paramètres FlexiLayout
</div>

Vous pouvez effectuer des requêtes sur un fichier XML contenant des paramètres FlexiLayout à l’aide de deux fonctions standard décrites dans la documentation d’ABBYY FlexiLayout Studio :

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

Pour utiliser ce fichier lorsque vous travaillez sur un FlexiLayout dans ABBYY FlexiLayout Studio, placez-le dans le dossier du projet ou dans l’un de ses sous-dossiers. Le chemin d’accès à ce fichier est relatif au fichier de projet ABBYY FlexiLayout Studio.

Si vous chargez un FlexiLayout compilé dans une Document Definition de FlexiCapture et l’utilisez comme FlexiLayout supplémentaire, le fichier XML est placé dans le dossier **Templates** et vous pouvez le modifier. Lorsque le FlexiLayout est appliqué, le programme gère automatiquement l’accès à ce fichier.
