Der direkte Vergleich von Gleitkommazahlen kann zu unvorhersehbaren Ergebnissen führen. Wir empfehlen, Methoden des integrierten Math-Objekts zu verwenden, um Zahlen – insbesondere Geldbeträge – korrekt zu vergleichen.
// zwei Gleitkommazahlen vergleichenvar floatField1 = Context.GetField("Number Field 1");var floatField2 = Context.GetField("Number Field 2");var floatVal1 = floatField1.Value;var floatVal2 = floatField2.Value;if (Math.round(floatVal1) === Math.round(floatVal2)) { return;} else { Context.CheckSucceeded = false; Context.ErrorMessage = 'Die Werte sind unterschiedlich';}// zwei Geldwerte vergleichenvar moneyField1 = Context.GetField("Money Field 1");var moneyField2 = Context.GetField("Money Field 2");var value1 = moneyField1.Value.Amount;var value2 = moneyField2.Value.Amount;if (Math.abs(value1 - value2) <= 0.0001) { return;} else { Context.CheckSucceeded = false; Context.ErrorMessage = 'Die Werte sind unterschiedlich';}
Je nach anderem Feld einen nicht leeren Wert verlangen
Ein optionales Feld kann erforderlich werden, wenn der Wert eines anderen Felds dies nötig macht. Beispiel: Steht beim Familienstand „verheiratet“, sollte der Name des Ehepartners angegeben werden. Oder: Ergibt die aus dem Geburtsdatum berechnete Altersangabe, dass die Person minderjährig ist, ist die Unterschrift des Vormunds erforderlich.Diese Skriptregel stellt sicher, dass bei Dokumenten, in denen das Feld Familienstand den Wert „Married“ hat, sowohl Vor- als auch Nachname des Ehepartners ausgefüllt sind:
function checkFieldValuePresence(field) { if (!field.Value) { Context.ErrorMessage = 'Wert des Felds ' + field.Name + ' darf nicht leer sein'; return false; } return true;}var conditionField = Context.GetField("MaritalStatus");if (conditionField === null) { Context.CheckSucceeded = false; Context.ErrorMessage = 'Feld MaritalStatus nicht gefunden';} else if (checkFieldValuePresence(conditionField)) { var lastName = Context.GetField("SpouseLastName"); var firstName = Context.GetField("SpouseFirstName"); if (conditionField.Text === "Married") { if (lastName === null || firstName === null) { Context.CheckSucceeded = false; Context.ErrorMessage = 'Feld für Ehepartnername nicht gefunden'; } else if (!checkFieldValuePresence(lastName) || !checkFieldValuePresence(firstName)) { Context.CheckSucceeded = false; } }} else { // Familienstand nicht ausgefüllt, Prüfung fehlgeschlagen Context.CheckSucceeded = false;}
Prüfen, ob das Feld auf dem Dokument gefunden wurde
Regeln können verwendet werden, um Feldwerte zu befüllen, auch wenn der Wert nicht tatsächlich auf dem Dokument aufgedruckt ist. Wenn beispielsweise mehrere Steuern anfallen, kann die gesamte Steuer automatisch berechnet werden. In einigen Ländern ist jedoch vorgeschrieben, dass der gesamte Steuerbetrag auf dem Dokument ausgewiesen ist.Diese Skriptregel prüft, dass bei Belegen aus Deutschland die gesamte Steuer nicht nur berechnet wird, sondern auch im Bild vorhanden ist. Für andere Länder ist keine zusätzliche Prüfung erforderlich, da das Flag Erforderliches Feld für das Feld „Gesamtsteuer“ aktiviert ist:
function checkFieldRegion(field) { if (!field || !field.HasRegion) { Context.ErrorMessage = 'Das Feld (' + field.Name + ') ist nicht im Dokumentbild vorhanden'; return false; } return true;}var conditionField = Context.GetField("CountryOfOrigin");if (!conditionField.Value) { Context.ErrorMessage = 'Herkunftsland unbekannt, Steuern können nicht geprüft werden'; Context.CheckSucceeded = false;} else { var totalTaxField = Context.GetField("TotalTax"); if (conditionField.Text === "DE" && !checkFieldRegion(totalTaxField)) { Context.CheckSucceeded = false; }}
Die Überprüfung, dass die gesamte Steuer der Summe aller Steuern entspricht, kann mit einer vordefinierten Regel (Check Sum) erfolgen. Wenn jedoch in manchen Ländern eine der Steuern einen negativen Wert haben kann, lässt sich nur mit einer Skriptregel beiden Fällen gerecht werden. Abhängig vom Herkunftsland des Dokuments werden entweder alle Steuern addiert oder eine Rückerstattungssteuer mit negativem Vorzeichen entsprechend berücksichtigt (addiert bzw. subtrahiert).Dieses Beispielskript prüft, dass die Summe zweier Steuern der gesamten Steuer entspricht – außer wenn der Beleg aus Spanien stammt. In diesem Fall kann entweder die Summe oder die Differenz der beiden der gesamten Steuer entsprechen:
Summen von Tabellenspalten mit Werten außerhalb der Tabelle vergleichen
Skripte können nicht nur auf reguläre Felder zugreifen, sondern auch auf Werte innerhalb von Tabellen. Um Regelprüfungen zu beschleunigen, empfehlen wir, Tabellen als Variablen zu speichern und anschließend diese Variablen statt der ursprünglichen Tabellen zu verwenden. Wenn eine Variable eine gesamte Tabelle enthält, können Sie die Eigenschaft Instances nutzen, um auf die Zeilen der Tabelle zuzugreifen, und anschließend die Methode Field GetChild verwenden, um den Wert einer bestimmten Zelle in einer Zeile zu ermitteln.Das folgende Beispielskript summiert alle Werte in der Spalte Total Price und vergleicht das Ergebnis mit dem Wert des Feldes Gesamtbetrag:
var totalField = Context.GetField("Total");var tableField = Context.GetField("MyTable");if (!totalField) { Context.CheckSucceeded = false; Context.ErrorMessage = "Feld Total wurde nicht gefunden"; return;}if (!tableField) { Context.CheckSucceeded = false; Context.ErrorMessage = "Feld MyTable wurde nicht gefunden"; return;}var sum = 0;for (var i = 0; i < tableField.Instances.length; i++) { var tableTotalField = tableField.Instances[i].GetChild("MyTable/Total Price"); sum += tableTotalField.Value.Amount;}if (Math.abs(sum - totalField.Value.Amount) > 0.02) { Context.CheckSucceeded = false; Context.ErrorMessage = "Die Summe von Total Price in der Tabelle stimmt nicht mit dem Gesamtbetrag überein";}
Vergleichen Sie einzelne Werte aus Spaltenzellen mit Werten außerhalb von Tabellen und zeigen Sie die Nummern der fehlerhaften Zeilen an
Auf Tabellenspalten kann auch mit der Methode Field GetFields zugegriffen werden. Diese Methode ermöglicht es, eine Liste aller Zellen einer Tabelle abzurufen, was beim Einrichten von Schleifen nützlich sein kann.Das folgende Beispielskript vergleicht die Steuersätze der einzelnen Positionen mit dem übergeordneten Steuersatz. Stimmen die Werte nicht überein, wird das Skript nicht abgebrochen. Stattdessen wird die Nummer der Zeile, in der die Abweichung aufgetreten ist, an eine spezielle Variable übergeben, die die Regel verwenden kann, um die gesamte Spalte zu prüfen. Die Fehlermeldung im Beispielskript listet die Nummern aller Zeilen auf, die Fehler enthalten:
Vergleichen Sie das Produkt mehrerer Felder in einer Zeile mit dem Wert eines anderen Felds in derselben Zeile
Sie können verschiedene Operationen mit unterschiedlichen Spalten in einer Tabelle der Reihe nach (zeilenweise) ausführen, ohne Schleifen zu verwenden. Dazu müssen Sie jede Spalte über die Methode Field GetField referenzieren. Dies ist eine wiederkehrende Regel, die automatisch für jede Zeile der Tabelle ausgeführt wird. Alle so referenzierten Spalten müssen aus derselben Tabelle stammen.Das folgende Beispielskript multipliziert die Stückzahl mit dem Stückpreis für jede Zeile und vergleicht den resultierenden Wert mit dem Gesamtpreis für die Position: