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

# Exemple 4. Étape 5.4 : champ Numéro de facture, élément InvoiceNumber

> Capturer la valeur du Numéro de facture à l’aide d’un élément Character String InvoiceNumber, en limitant la zone de recherche avec les relations de prérecherche du langage FlexiLayout.

Sur certains documents, le champ Numéro de facture se trouve à droite du nom du champ, tandis que sur d'autres, il se trouve en dessous (dans les documents 1 et 2, les données du champ sont placées directement sous le nom).

Pour créer un élément InvoiceNumber :

1. Dans l'élément **InvoiceHeader**, créez un élément de type Character String et nommez-le **InvoiceNumber**.

   <Tip>
     Le nom de l'élément ne doit pas nécessairement être identique à celui du bloc correspondant au champ **InvoiceNumber**. Cependant, il est pratique d'utiliser des noms identiques lorsque vous travaillez avec un FlexiLayout.
   </Tip>

2. Cliquez sur l'onglet Character String.

3. Spécifiez l'alphabet :
   -./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

4. Définissez Percentage of non-alphabet characters sur 30 %.

5. Dans le champ Character count, spécifiez l'intervalle flou `{-1, 3, 20, INF}` pour la longueur de la chaîne de caractères, en supposant que les valeurs possibles se situent dans la plage de 3 à 20 caractères. Toute hypothèse en dehors de cet intervalle sera pénalisée.

6. Sur certaines images, la zone de recherche du champ **Numéro de facture** contient l'élément **kwInvoiceDate** déjà détecté. Excluez cet élément de la zone de recherche afin que le programme n'inclue pas ce texte dans ses hypothèses pour le champ **Numéro de facture** :
   * Dans l'onglet **Search Constraints**, cliquez sur le bouton Add... situé à côté du champ Exclude regions of elements.
   * Sélectionnez **kwInvoiceDate** dans la liste des éléments.
   * Cliquez sur **OK**. La chaîne `SearchElements.InvoiceHeader.kwInvoiceDate` apparaît dans le champ Exclude regions of elements.

<Frame>
  <img src="https://mintcdn.com/abbyy/8aWHPAJyzWmTqglX/images/flexi-capture/fls/tutorial4_5_4.png?fit=max&auto=format&n=8aWHPAJyzWmTqglX&q=85&s=f75396d33e7d2b3b095a09fc446d3d3b" alt="Capture d’écran de l’onglet Search Constraints des propriétés de l’élément Character String InvoiceNumber dans ABBYY FlexiLayout Studio, montrant l’élément kwInvoiceDate ajouté au champ Exclude regions of elements sous la forme SearchElements.InvoiceHeader.kwInvoiceDate." width="427" height="454" data-path="images/flexi-capture/fls/tutorial4_5_4.png" />
</Frame>

7. Cliquez sur l’onglet **Advanced**.
8. Dans **relations avancées de pré-recherche**, spécifiez des conditions supplémentaires : si le nom **kwInvoiceNumber** n’est pas trouvé, ne recherchez pas le champ **InvoiceNumber** ; sinon, définissez la zone de recherche comme un tableau de rectangles : un rectangle à droite du nom et un autre sous le nom, avec un léger décalage. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code), cette condition peut s’écrire comme suit :

   ```text theme={null}
   if kwInvoiceNumber.IsNull then Dontfind();
   else
   { WholeWordMOde: true;
   MaxGapInLine: 30dt;
   RectArray DataRegion;
   Let r1= Rect (kwInvoiceNumber.Rect.Right, kwInvoiceNumber.Rect.Top -20dt, kwInvoiceNumber.Rect.Right + 650dt, kwInvoiceNumber.Rect.Bottom + 50dt);
   // Limite la zone de recherche à un rectangle situé à droite du nom du champ InvoiceNumber.
   Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom, kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt);
   // Limite la zone de recherche à un rectangle situé sous le nom du champ InvoiceNumber.
   DataRegion = RectArray (r1);
   DataRegion.Add (r2);
   RestrictSearchArea (DataRegion);
   }
   ```
9. La zone de recherche du champ est limitée à deux rectangles, l’un à droite du nom du champ et l’autre en dessous. Si les données du champ se trouvent à droite du nom du champ, il y a souvent un autre texte sous ce champ (dans les images de test, il s’agit le plus souvent du nom et des données du champ Date). Comme ce texte parasite sera inclus dans la zone de recherche du champ **Numéro de facture**, le programme générera une hypothèse pour ce texte. Pour influer sur la qualité de cette hypothèse, spécifiez des vérifications supplémentaires dans le champ **Advanced post-search relations** : plus le texte situé sous le nom du champ est bas, plus la pénalité est forte. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code), cette condition peut s’écrire comme suit :

   ```text theme={null}
   if not IsNull then
   { FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt;
   }
   // Plus la distance entre le nom et la limite supérieure du champ est grande, plus la pénalité appliquée à l’hypothèse correspondante est importante. Dans ce cas particulier, l’hypothèse de l’élément dont la limite supérieure coïncide avec celle du nom aura la qualité la plus élevée.
   ```
10. Excluez temporairement l’élément **InvoiceFooter** et exécutez la mise en correspondance du FlexiLayout.
11. Spécifiez l’emplacement du bloc **InvoiceNumber** comme une région rectangulaire de l’élément **InvoiceNumber**, agrandie de 5 points verticalement et horizontalement. Pour ce faire, sélectionnez Expression et saisissez l’expression suivante :

    ```text theme={null}
    Rect outputRect;
    outputRect = InvoiceHeader.InvoiceNumber.Rect;
    IsNull = InvoiceHeader.InvoiceNumber.IsNull;
    // Considère la région du bloc comme détectée si l’élément InvoiceNumber a été détecté.
    OutputRegion = outputRect;
    OutputRegion.Inflate (5dt, 5dt);
    ```
