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
Évitez 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
Un élément Group facultatif et son hypothèse nulle sont nécessaires lorsque tout le groupe de champs n’est pas présent sur l’image et qu’il est donc inutile de les rechercher. Vous pouvez accélérer la recherche des éléments en appelant la méthode DontFind() pour l’élément Group.
Ici, « call » signifie écrire du code dans l’une des sections de l’onglet Advanced ou dans les propriétés de 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 contraintes de recherche dans Relations, la vérification IsNull est 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 Properties 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 :
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 FlexiLayout Studio reçoit l’instruction de ne pas rechercher l’élément Group InvoiceRequisiteGroup. Dans ce cas, 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 :
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, FlexiLayout Studio affiche le message d’erreur suivant :
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.
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.