> ## 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 3. Étape 25 : détecter les champs TotalQuantity et TotalAmount à l’aide des éléments TotalQuantity et TotalAmount

> Récupérez les valeurs de quantité totale et de montant total à l’aide des éléments Character String TotalQuantity et TotalAmount dans un groupe grTotal facultatif.

L’analyse des images de test montre que les champs quantité totale et montant total apparaissent uniquement ensemble avec le nom `Footer.kwTotal` et sur la même ligne.

Utilisez des éléments de type [Character String](/fr/flexi-capture/fls/template/character-chain) pour détecter les champs quantité totale et montant total. Pour définir les contraintes de recherche communes aux deux, créez un élément [Group](/fr/flexi-capture/fls/template/elements-compound) nommé **grTotal**.

<div id="create-the-grtotal-group-element">
  ## Créer l’élément Group grTotal
</div>

<Steps>
  <Step title="Créer l’élément Group">
    Dans l’élément **Footer**, créez un élément [Group](/fr/flexi-capture/fls/template/elements-compound) et nommez-le **grTotal**.
  </Step>

  <Step title="Rendre le groupe facultatif">
    Sélectionnez **Optional element** afin d’arrêter la recherche de sous-éléments si le nom est absent. Pour plus d’informations, consultez [La propriété Optional d’un élément Group](/fr/flexi-capture/fls/tips-tricks/date11).
  </Step>

  <Step title="Ajouter la contrainte de recherche">
    Cliquez sur l’onglet **Advanced**. Les champs **quantité totale** et **montant total** apparaissent uniquement avec le nom `Footer.kwTotal`. Définissez donc la [contrainte de recherche supplémentaire](/fr/flexi-capture/fls/template/advanced-constraints) suivante dans le champ **relations avancées de pré-recherche** : si l’élément `Footer.kwTotal` n’est pas détecté, ne recherchez pas l’objet. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code) :

    ```text theme={null}
    If Footer.kwTotal.IsNull Then DontFind;
    ```
  </Step>
</Steps>

<div id="create-the-totalquantity-element">
  ## Créer l’élément TotalQuantity
</div>

Le champ Quantité totale se situe à l’intersection de la ligne Total et de la colonne Quantité. Vous avez déjà défini la première contrainte au niveau de l’élément [Group](/fr/flexi-capture/fls/template/elements-compound). Pour définir la seconde, utilisez comme élément de référence le nom de colonne détecté précédemment.

<Steps>
  <Step title="Créer l’élément Character String">
    Dans l’élément **grTotal**, créez un élément de type [Character String](/fr/flexi-capture/fls/template/character-chain) et nommez-le **TotalQuantity**.
  </Step>

  <Step title="Définir le nombre de caractères">
    Cliquez sur l’onglet **Character String**. Dans le champ **Nombre de caractères**, spécifiez cet intervalle flou : `{-1, 1, 10, INF}`. Il permet d’estimer la longueur de la chaîne de caractères ; supposez que les valeurs sont comprises entre 1 et 10. Toute hypothèse en dehors de cette plage est pénalisée.

    Conservez les valeurs par défaut des autres propriétés de l’élément.
  </Step>

  <Step title="Définir les contraintes de position">
    Cliquez sur l’onglet **Relations**. Le champ **Quantité totale** se situe toujours au même niveau que les mots-clés du nom `Footer.kwTotal`, ou légèrement plus bas. Définissez donc les contraintes de recherche suivantes :

    * **Au-dessus** de l’élément `Footer.kwTotal`, **Décalage** = -200, **Limite de référence** = **Bottom**
    * **En dessous** de l’élément `Footer.kwTotal`, **Décalage** = -20, **Limite de référence** = **Top**

    <Tip>
      Lorsque vous choisissez les valeurs de décalage, analysez les propriétés géométriques (taille et limites) des objets voisins détectés lors de la pré-reconnaissance. Sinon, déterminez ces valeurs par tâtonnement.
    </Tip>
  </Step>

  <Step title="Ajouter la contrainte de colonne">
    Cliquez sur l’onglet **Advanced**. Le champ **Quantité totale** est facultatif, mais lorsqu’il est présent, il apparaît avec la colonne **Quantité**, sous son nom. Définissez cette [contrainte de recherche supplémentaire](/fr/flexi-capture/fls/template/advanced-constraints) dans le champ **relations avancées de pré-recherche** : recherchez l’objet uniquement si l’élément `TableHeader.kwQuantity` a été détecté, et pas à plus de 50 points à gauche ou à droite des limites correspondantes du nom de la colonne. Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code) :

    ```text theme={null}
    If Not (TableHeader.kwQuantity.IsNull) Then
    {
    LeftOf: TableHeader.kwQuantity.Right, -50 * dot;
    RightOf: TableHeader.kwQuantity.Left, -50 * dot;
    }
    Else DontFind;
    ```
  </Step>

  <Step title="Vérifier la correspondance">
    Associez le FlexiLayout aux images de test et vérifiez que FlexiLayout Studio détecte l’élément dans chaque image où il est présent.
  </Step>

  <Step title="Définir l’élément source du bloc">
    Pour décrire l’emplacement du bloc **TotalQuantity**, sélectionnez **élément source**, cliquez sur <img src="https://mintcdn.com/abbyy/fmgRWFNHKYN2MLSg/images/flexi-capture/fls/Browse_Button.gif?s=3673db30dda4a3293aec716853588b55" alt="Bouton Parcourir" style={{display:"inline-block",verticalAlign:"middle",margin:0}} width="21" height="20" data-path="images/flexi-capture/fls/Browse_Button.gif" />, puis sélectionnez l’élément **TotalQuantity** comme élément source.
  </Step>
</Steps>

<div id="create-the-totalamount-element">
  ## Créer l’élément TotalAmount
</div>

Le champ montant total se trouve à l’intersection de la ligne Total (le pied du tableau) et de la colonne Total. Vous avez déjà défini la première contrainte au niveau de l’élément [Group](/fr/flexi-capture/fls/template/elements-compound). Pour définir la seconde contrainte, utilisez les noms de colonnes précédemment détectés comme éléments de référence.

<Steps>
  <Step title="Créer l’élément Character String">
    Dans l’élément **grTotal**, créez un élément de type [Character String](/fr/flexi-capture/fls/template/character-chain) et nommez-le **TotalAmount**.
  </Step>

  <Step title="Définir le nombre de caractères">
    Cliquez sur l’onglet **Character String**. Dans le champ **nombre de caractères**, spécifiez cet intervalle flou : `[-1, 1, 20, 2147483647]`. Cela permet d’estimer la longueur de la chaîne de caractères ; supposez que les valeurs sont comprises entre 1 et 20. Toute hypothèse en dehors de cette plage est pénalisée.

    Conservez les valeurs par défaut des autres propriétés de l’élément.
  </Step>

  <Step title="Définir les contraintes de position">
    Cliquez sur l’onglet **Relations**. Le champ **montant total** se trouve toujours au même niveau que les mots-clés `Footer.kwTotal` ; définissez donc les contraintes de recherche suivantes :

    * **Au-dessus** de l’élément `Footer.kwTotal`, **décalage** = -20, **limite de référence** = **Bottom**
    * **En dessous** de l’élément `Footer.kwTotal`, **décalage** = -20, **limite de référence** = **Top**
  </Step>

  <Step title="Ajouter la contrainte de colonne">
    Cliquez sur l’onglet **Advanced**. Le champ **montant total** apparaît immédiatement sous le nom de la colonne **Total** (éventuellement avec un léger décalage), entre les colonnes **prix unitaire** et **Sales**. Dans le champ **relations avancées de pré-recherche**, définissez une [contrainte de recherche supplémentaire](/fr/flexi-capture/fls/template/advanced-constraints) couvrant deux cas :

    * Si `TableHeader.kwTotal` a été détecté, recherchez l’objet à 70 dots au maximum à droite de sa limite droite et à 50 dots au maximum à gauche de sa limite gauche.
    * Sinon, si `TableHeader.kwUnitPrice` et `TableHeader.kwSales` ont été détectés, recherchez l’objet à 40 dots au maximum à droite de la limite gauche de `TableHeader.kwSales` et à droite de la limite droite de `TableHeader.kwUnitPrice`. Si aucun de ces cas ne s’applique, ne recherchez pas l’objet.

    Dans le [langage FlexiLayout](/fr/flexi-capture/fls/code/general-code) :

    ```text theme={null}
    If Not (TableHeader.kwTotal.IsNull) Then
    {
    LeftOf: TableHeader.kwTotal.Right, -70 * dot;
    RightOf: TableHeader.kwTotal.Left, -50 * dot;
    }
    Else
    If Not (TableHeader.kwUnitPrice.IsNull) and Not (TableHeader.kwSales.IsNull) Then
    {
    LeftOf: TableHeader.kwSales.Left, -40 * dot;
    RightOf: TableHeader.kwUnitPrice, 0 * dot;
    }
    Else DontFind;
    ```

    <Tip>
      Lors du choix des valeurs de décalage, analysez les propriétés géométriques (taille et limites) des objets voisins détectés lors de la pré-reconnaissance. À défaut, déterminez ces valeurs par essais et erreurs.
    </Tip>
  </Step>

  <Step title="Vérifier l’association">
    Associez le FlexiLayout aux images de test et vérifiez que FlexiLayout Studio détecte l’élément sur chaque image où il apparaît.
  </Step>

  <Step title="Définir l’élément source du bloc">
    Pour décrire l’emplacement du bloc **TotalAmount**, sélectionnez **élément source**, cliquez sur <img src="https://mintcdn.com/abbyy/fmgRWFNHKYN2MLSg/images/flexi-capture/fls/Browse_Button.gif?s=3673db30dda4a3293aec716853588b55" alt="bouton Parcourir" style={{display:"inline-block",verticalAlign:"middle",margin:0}} width="21" height="20" data-path="images/flexi-capture/fls/Browse_Button.gif" />, puis sélectionnez l’élément **TotalAmount** comme élément source.
  </Step>
</Steps>
