Zum Hauptinhalt springen
Beim Erstellen eines Gruppenelements ist das Kontrollkästchen Optional element standardmäßig deaktiviert, d. h. das Element ist erforderlich. Beim Abgleich des FlexiLayouts 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).

Warum Aufrufe eines nicht erkannten optionalen Gruppenelements fehlschlagen

Es wird nicht empfohlen, für Gruppenelemente das Feld Optional element zu aktivieren. Der Grund dafür ist: Wenn das Gruppenelement als Optional element markiert ist und nicht erkannt wird (seine Quality ist niedriger als die Quality einer Nullhypothese oder für es wird die Funktion Dontfind() aufgerufen), führen Aufrufe seiner Subelemente zu Fehlern. Das liegt daran, dass 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 IsNull-Prüfung True zurückgibt, greifen Sie auf keines der Subelemente zu.

Wann ein optionales Gruppenelement nützlich ist

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 Beziehung aufgerufen werden, erfolgt die Prüfung IsNull automatisch. Sie können dies sehen, wenn Sie auf der Registerkarte Advanced auf Code klicken.

Das Beispielprojekt GroupSample.fsp

Dies wird im Projekt GroupSample.fsp veranschaulicht (Ordner %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Optional Group). Im Dialogfeld „Eigenschaften“ des Gruppenelements InvoiceRequisiteGroup ist das Kontrollkästchen Optional element aktiviert. Auf der Registerkarte Advanced enthält der Abschnitt Advanced pre-search relations den folgenden Code:
if FormID.IsNull then Dontfind();
Dieser Code prüft, ob das Element vorhanden ist, das den Dokumenttyp bestimmt. Das Element FormID, das vor dem Gruppenelement InvoiceRequisiteGroup erstellt wurde, sucht 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 das Programm wird angewiesen, nicht nach dem Gruppenelement InvoiceRequisiteGroup zu suchen; das heißt, für das optionale Gruppenelement InvoiceRequisiteGroup wird eine Nullhypothese erstellt. Das Projekt enthält ein Element TotalSumHeader, das verwendet wird, um nach der Bezeichnung des Summenfelds zu suchen. Der folgende Code wird für das Element im Abschnitt Advanced pre-search relations eingegeben:
Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;
Dieser Code bedeutet, dass die Suche nach dem Namen unterhalb des Datumsfelds ausgeführt wird, das durch das Element InvoiceDateHeader definiert ist, das wiederum ein Subelement des Gruppenelements InvoiceRequisiteGroup ist.

Den Fehler mit der undefinierten Hypothese reproduzieren und beheben

Führen Sie den Abgleich des FlexiLayouts für beide Seiten im Batch aus. Für Seite 1 wird das Verfahren erfolgreich ausgeführt, doch wenn das FlexiLayout auf Seite 2 angewendet wird, zeigt das Programm folgende Fehlermeldung an: "Seite 2: Fehler in Element "SearchElements.TotalSumHeader", Abschnitt „Advanced generator parameters“: Versuch, auf eine undefinierte Hypothese zuzugreifen: SearchElements.InvoiceRequisiteGroup". Das passiert, weil auf Seite 2 der Wert des Dokument-Bezeichners 2589 ist. Da dieser Wert von dem in den Eigenschaften des Elements FormID angegebenen Wert abweicht, hat die Funktion Dontfind() eine Nullhypothese für das Gruppenelement InvoiceRequisiteGroup erzeugt. Dadurch hat der Code auf eine nicht vorhandene Hypothese zugegriffen. Der korrekte Code muss wie folgt 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 Kontrollkästchen neben der ähnlichen Suchbedingung des Elements TotalSumHeader im Abschnitt Beziehungen aktivieren, zeigt ein Klick auf Code auf der Registerkarte Advanced, dass der kompilierte Code die Prüfung IsNull bereits enthält.