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).
Pourquoi les appels à un élément Group facultatif non détecté échouent
Il n’est pas recommandé de cocher la case Optional element pour les éléments Group.
En effet, si l’élément Group est marqué comme Optional element et n’est pas détecté (si 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 entraînera des erreurs. Cela s’explique par le fait que, 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, n’accédez à aucun de ses sous-éléments.
Quand un élément Group facultatif est utile
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.
Le projet d’exemple GroupSample.fsp
Ce point est illustré dans le projet GroupSample.fsp (dossier %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group).
Dans la boîte de dialogue Propriétés de l’élément Group InvoiceRequisiteGroup, la case Optional element est cochée. Dans l’onglet Advanced, la section relations avancées de pré-recherche contient le code suivant :
if FormID.IsNull then Dontfind();
Ce code vérifie la présence de l’élément qui identifie le type de document. L’élément FormID, créé avant l’élément Group InvoiceRequisiteGroup, recherche le texte statique ayant une valeur connue (“ID2015”).
Si la valeur de l’identifiant dans le document correspond à celle spécifiée dans la section Texte de recherche, 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 le programme reçoit l’instruction de ne pas rechercher l’élément Group InvoiceRequisiteGroup ; autrement dit, une hypothèse nulle est créée pour l’élément Group facultatif InvoiceRequisiteGroup.
Le projet contient un élément TotalSumHeader utilisé pour rechercher le nom du champ du total. Le code suivant est saisi pour l’é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 s’effectuera sous le champ de date décrit par l’élément InvoiceDateHeader, lui-même sous-élément de l’élément Group InvoiceRequisiteGroup.
Reproduire et corriger l’erreur d’hypothèse non définie
Exécutez la procédure de mise en correspondance FlexiLayout sur les deux pages du batch. Pour la page 1, la procédure s’exécute correctement, mais lorsque le FlexiLayout est appliqué à 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’ID du document est 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() a généré une hypothèse nulle pour l’élément Group InvoiceRequisiteGroup. Par conséquent, le code a tenté d’accéder à une hypothèse inexistante.
Le code correct doit se présenter comme suit.
if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then
{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
Si vous mettez en commentaire le code dans la section relations avancées de pré-recherche et cochez la case à côté de la contrainte de recherche similaire de l’élément TotalSumHeader dans la section Relations, un clic sur Code dans l’onglet Advanced montre que le code compilé contient déjà la vérification IsNull.