Lors de la création d’un élément Group, la case Optional element est décochée par défaut, c’est-à-dire que l’élément est obligatoire. Lors de la mise en correspondance FlexiLayout, une hypothèse non nulle est générée pour un élément Group obligatoire, même si des hypothèses nulles sont générées pour tous ses sous-éléments. Pour vérifier les propriétés des sous-éléments d’une telle hypothèse, appelez leur code dans leurs sections Advanced. Si l’élément Group est facultatif, une hypothèse nulle peut être générée pour celui-ci (s’il n’existe aucune hypothèse non nulle dont la qualité est supérieure à celle d’une hypothèse nulle).
Il n’est pas recommandé de cocher la case Optional element pour les éléments Group. En effet, si l’élément Group a la propriété Optional element et qu’il n’est pas détecté (sa qualité est inférieure à celle d’une hypothèse nulle, ou si la fonction Dontfind() est appelée pour lui), tout appel à l’un de ses sous-éléments provoquera des erreurs, car dans un groupe avec une hypothèse nulle, les hypothèses des sous-éléments ne sont pas générées. Pour éviter cette erreur, vous devez d’abord vérifier l’élément Group. Si la vérification IsNull renvoie True, vous ne devez accéder à aucun des sous-éléments.
Alors, pourquoi avons-nous besoin d’un élément Group facultatif et de son hypothèse nulle ? Cela est nécessaire lorsque tout le groupe de champs n’est pas présent dans l’image. Dans ce cas, il est inutile de les rechercher. De plus, la recherche des éléments peut être accélérée en appelant la méthode DontFind() pour l’élément Group.
Par « appel », nous entendons l’écriture de code dans l’une des sections de l’onglet Advanced ou dans les propriétés du bloc de la fenêtre Expression. Si les propriétés d’un élément Group sont appelées lors de la définition des search constraints dans Relations, la vérification IsNull est alors automatique. Vous pouvez le constater en cliquant sur Code dans l’onglet Advanced.
Pour illustrer cela, nous avons créé le projet GroupSample.fsp (dossier %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group).
Dans la boîte de dialogue Properties de l’élément Group InvoiceRequisiteGroup, nous avons coché la case Optional element. Dans l’onglet Advanced, dans la section relations avancées de pré-recherche, nous avons écrit le code suivant :
if FormID.IsNull then Dontfind();
Nous vérifions ensuite la présence de l’élément qui identifie le type de document. En utilisant l’élément FormID, créé avant l’élément Group InvoiceRequisiteGroup, nous recherchons le texte statique ayant une valeur connue (“ID2015”). Si la valeur de l’identifiant du document correspond à la valeur spécifiée dans la section Search text, une hypothèse non nulle est générée pour l’élément FormID. Sinon, le texte statique FormID n’est pas détecté et nous indiquons au programme de ne pas rechercher l’élément Group InvoiceRequisiteGroup, c’est-à-dire que nous créons une hypothèse nulle pour l’élément Group facultatif InvoiceRequisiteGroup.
Dans le projet, il existe un élément TotalSumHeader utilisé pour rechercher le nom du champ de total. Le code suivant est saisi pour cet élément dans la section relations avancées de pré-recherche :
Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;
Ce code signifie que la recherche du nom sera exécutée sous le champ de date décrit par l’élément InvoiceDateHeader, qui est lui-même un sous-élément de l’élément Group InvoiceRequisiteGroup.
Exécutons la procédure de mise en correspondance FlexiLayout sur les deux pages du lot. Pour la page 1, la procédure a réussi, mais lors de la tentative d’application de FlexiLayout à la page 2, le programme affiche le message d’erreur suivant : “Page 2: Error in element “SearchElements.TotalSumHeader”, Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup”.
Cela se produit parce que, sur la page 2, la valeur de l’identifiant du document est ID 2589. Comme cette valeur est différente de celle spécifiée dans les propriétés de l’élément FormID, la fonction Dontfind() pour l’élément Group InvoiceRequisiteGroup a généré une hypothèse nulle. Dans le code, nous avons donc appelé une hypothèse inexistante.
Le code correct doit se présenter ainsi.
if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then
{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
Si vous commentez le code dans la section relations avancées de pré-recherche et activez l’indicateur à côté de la search constraint similaire de l’élément TotalSumHeader dans la section Relations, alors un clic sur Code dans l’onglet Advanced montrera que le code compilé contient déjà la vérification IsNull.