Beim Erstellen eines Gruppenelements ist das Kontrollkästchen Optional element standardmäßig deaktiviert, d. h. das Element ist erforderlich. Beim FlexiLayout-Matching wird für ein erforderliches Gruppenelement eine Nicht-Null-Hypothese erzeugt, selbst wenn für alle seine Subelemente Nullhypothesen erzeugt werden. Um die Eigenschaften der Subelemente einer solchen Hypothese zu prüfen, rufen Sie den Code in deren Advanced-Abschnitten auf. Wenn das Gruppenelement optional ist, kann dafür eine Nullhypothese erzeugt werden (wenn es keine Nicht-Null-Hypothesen mit einer höheren Quality als der Quality einer Nullhypothese gibt).
Es wird nicht empfohlen, das Kontrollkästchen Optional element für Gruppenelemente zu aktivieren. Der Grund ist, dass jeder Aufruf eines Subelements Fehler verursacht, wenn das Gruppenelement Optional element ist und nicht erkannt wird (seine Quality ist niedriger als die Quality einer Nullhypothese oder die Funktion Dontfind() wird dafür aufgerufen), weil in einer Gruppe mit einer Nullhypothese keine Hypothesen für Subelemente gebildet werden. Um diesen Fehler zu vermeiden, müssen Sie zuerst das Gruppenelement prüfen. Wenn die Prüfung IsNull den Wert True zurückgibt, dürfen Sie keines der Subelemente ansprechen.
Warum brauchen wir dann ein optionales Gruppenelement und seine Nullhypothese? Es wird benötigt, wenn die gesamte Gruppe von Feldern im Bild nicht vorhanden ist. Dann ist es sinnlos, nach ihnen zu suchen. Außerdem lässt sich die Suche nach den Elementen beschleunigen, indem für das Gruppenelement die Methode DontFind() aufgerufen wird.
Mit „aufrufen“ meinen wir das Schreiben von Code in einem der Abschnitte auf der Registerkarte Advanced oder in den Blockeigenschaften im Fenster Expression. Wenn die Eigenschaften eines Gruppenelements beim Festlegen der Suchbedingungen in Relations aufgerufen werden, erfolgt die Prüfung IsNull automatisch. Sie können dies sehen, wenn Sie auf der Registerkarte Advanced auf Code klicken.
Um dies zu veranschaulichen, haben wir das Projekt GroupSample.fsp erstellt (Ordner %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group).
Im Dialogfeld Properties des Gruppenelements InvoiceRequisiteGroup haben wir das Kontrollkästchen Optional element aktiviert. Auf der Registerkarte Advanced haben wir im Abschnitt Advanced pre-search relations den folgenden Code geschrieben:
if FormID.IsNull then Dontfind();
Als Nächstes prüfen wir, ob das Element vorhanden ist, das den Dokumenttyp identifiziert. Mithilfe des Elements FormID, das vor dem Gruppenelement InvoiceRequisiteGroup erstellt wurde, suchen wir nach dem statischen Text mit einem bekannten Wert („ID2015“). Wenn der Wert des Bezeichners im Dokument mit dem im Abschnitt Search text angegebenen Wert übereinstimmt, wird für das Element FormID eine Nicht-Null-Hypothese erzeugt. Andernfalls wird der statische Text FormID nicht erkannt, und wir weisen das Programm an, nicht nach dem Gruppenelement InvoiceRequisiteGroup zu suchen, d. h. wir haben eine Nullhypothese für das optionale Gruppenelement InvoiceRequisiteGroup erstellt.
Im Projekt gibt es ein Element TotalSumHeader, das verwendet wird, um nach der Bezeichnung des Summenfelds zu suchen. Für das Element ist im Abschnitt Advanced pre-search relations der folgende Code eingegeben:
Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;
Dieser Code bedeutet, dass die Suche nach der Bezeichnung unterhalb des Datumsfelds ausgeführt wird, das durch das Element InvoiceDateHeader beschrieben wird, welches wiederum ein Subelement des Gruppenelements InvoiceRequisiteGroup ist.
Führen wir das FlexiLayout-Matching-Verfahren für beide Seiten im Batch aus. Für Seite 1 war das Verfahren erfolgreich, aber beim Versuch, das FlexiLayout auf Seite 2 anzuwenden, zeigt das Programm die folgende Fehlermeldung an: „Seite 2: Fehler in Element “SearchElements.TotalSumHeader”, Abschnitt Advanced generator parameters: Versuch, auf eine undefinierte Hypothese zuzugreifen: SearchElements.InvoiceRequisiteGroup”.
Das geschieht, weil auf Seite 2 der Wert des Dokumentbezeichners ID 2589 ist. Da dieser Wert von dem in den Eigenschaften des Elements FormID angegebenen Wert abweicht, erzeugte die Funktion Dontfind() für das Gruppenelement InvoiceRequisiteGroup eine Nullhypothese. Im Code haben wir also eine nicht vorhandene Hypothese aufgerufen.
Der korrekte Code muss so aussehen.
if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then
{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}
Wenn Sie den Code im Abschnitt Advanced pre-search relations auskommentieren und das Flag neben der entsprechenden Suchbedingung des Elements TotalSumHeader im Abschnitt Relations aktivieren, zeigt ein Klick auf Code auf der Registerkarte Advanced, dass der kompilierte Code bereits die Prüfung IsNull enthält.