Zum Hauptinhalt springen

Documentation Index

Fetch the complete documentation index at: https://docs.abbyy.com/llms.txt

Use this file to discover all available pages before exploring further.

Die folgenden JavaScript-Beispiele veranschaulichen gängige Muster für erweiterte Skriptregeln — das Prüfen, ob ein Feld vorhanden ist, das Vergleichen numerischer Werte, das Anwenden bedingter Validierungen und das Validieren von Tabellendaten. Kopieren Sie sie und passen Sie sie an Ihre eigenen Feldnamen und Geschäftsregeln an.

Prüfen, ob ein Feld vorhanden ist

Prüfen Sie zum Beispiel, ob das Feld MyField gefunden wurde und ausgefüllt ist:
var field = Context.GetField("MyField");

if (!field) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField-Feld nicht gefunden';
} else if (!field.Value) {
  Context.CheckSucceeded = false;
  Context.ErrorMessage = 'MyField-Feld ist leer';
}

Gleitkommazahlen vergleichen

Der direkte Vergleich von Gleitkommazahlen kann zu unvorhersehbaren Ergebnissen führen. Verwenden Sie Methoden des integrierten Math-Objekts, um Zahlen – insbesondere Geldbeträge – zuverlässig zu vergleichen.
// zwei Gleitkommazahlen vergleichen
var 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 = 'The values are different';
}

// zwei Geldwerte vergleichen
var 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 = 'The values are different';
}

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. Wenn MaritalStatus den Wert Married hat, sollten die Felder für den Vor- und Nachnamen des Ehepartners ausgefüllt sein. Diese Skriptregel stellt sicher, dass sowohl SpouseFirstName als auch SpouseLastName ausgefüllt sind, wenn MaritalStatus den Wert Married hat:
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 ein Feld auf dem Dokument vorhanden ist

Regeln können auch Feldwerte befüllen, auch wenn der Wert nicht auf dem Dokument aufgedruckt ist. Wenn beispielsweise mehrere Steuern anfallen, kann die Gesamtsteuer automatisch berechnet werden. In einigen Ländern ist jedoch vorgeschrieben, dass der Gesamtsteuerbetrag auf dem Dokument ausgewiesen ist. Diese Skriptregel prüft, dass bei Belegen aus Deutschland die Gesamtsteuer 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;
    }
}

Daten in besonderen Fällen validieren

Die Überprüfung, dass die Gesamtsteuer der Summe aller Steuern entspricht, kann mit einer vordefinierten Regel (Check Sum) erfolgen. Wenn jedoch in bestimmten Ländern eine der Steuern einen negativen Wert haben kann, lässt sich nur mit einer Skriptregel beiden Fällen gerecht werden — je nach Herkunftsland werden entweder alle Steuern addiert oder eine Rückerstattungssteuer addiert und subtrahiert. Dieses Skript prüft, dass die Summe zweier Steuern der Gesamtsteuer entspricht, außer wenn der Beleg aus Spanien stammt. In diesem Fall kann entweder die Summe oder die Differenz der beiden der Gesamtsteuer entsprechen:
var conditionField = Context.GetField("CountryOfOrigin");
var totalTaxField = Context.GetField("TotalTax");
var tax1Field = Context.GetField("Tax1");
var tax2Field = Context.GetField("Tax2");

if (!conditionField.Value || !totalTaxField.Value || !tax1Field.Value || !tax2Field.Value) {
    Context.ErrorMessage = 'Steuern können nicht geprüft werden';
    Context.CheckSucceeded = false;
} else {
    if (conditionField.Text === "ES") {
        Context.CheckSucceeded = ((Math.round(tax1Field.Value - tax2Field.Value) === Math.round(totalTaxField.Value))
            || (Math.round(tax1Field.Value + tax2Field.Value) === Math.round(totalTaxField.Value)));
    } else {
        Context.CheckSucceeded = (Math.round(tax1Field.Value + tax2Field.Value) === Math.round(totalTaxField.Value));
    }
}

Eine Spaltensumme mit einem externen Feld vergleichen

Skripte können nicht nur auf reguläre Felder zugreifen, sondern auch auf Tabellenwerte. 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 GetChild verwenden, um eine bestimmte Zelle in einer Zeile zu ermitteln. Das folgende Beispiel summiert alle Werte in der Spalte Total Price und vergleicht das Ergebnis mit dem Feld Total:
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 Spaltenzellen mit einem externen Feld und listen Sie fehlerhafte Zeilen auf

Mit Context.GetFields können Sie auf Tabellenspalten verweisen, um jede Zelle in der Spalte abzurufen, was für Schleifen nützlich ist. Das folgende Beispiel vergleicht den Steuersatz jeder Zeile mit dem Gesamtsteuersatz. Stimmen die Werte nicht überein, wird das Skript nicht sofort abgebrochen, sondern sammelt die Zeilennummern mit Abweichungen und meldet sie in der Fehlermeldung:
var taxRateFields = Context.GetFields("MyTable/TaxRate");
var taxRateField = Context.GetField("TaxRate");

if (!taxRateFields || !taxRateField)
    return;

var taxRate = taxRateField.Value ? taxRateField.Value : 0;
var wrongLines = [];
for (var i = 0; i < taxRateFields.length; i++) {
    if (taxRateFields[i].Value != taxRate)
        wrongLines.push(i + 1);
}

if (wrongLines.length > 0) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Falscher Steuersatz in Zeilen: " + wrongLines.join(", ");
}

Vergleichen Sie das Produkt von Werten in einer Zeile mit einem anderen Zeilenwert

Sie können Operationen für verschiedene Spalten in einer Tabelle zeilenweise ausführen, ohne explizite Schleifen zu verwenden — referenzieren Sie jede Spalte dazu mit Context.GetField. Dadurch wird eine wiederkehrende Regel erstellt, die automatisch für jede Zeile ausgeführt wird. Alle so referenzierten Spalten müssen zu derselben Tabelle gehören. Das folgende Beispiel multipliziert für jede Zeile die Stückzahl mit dem Stückpreis und vergleicht das Ergebnis mit dem Gesamtpreis der Position:
var quantityField = Context.GetField("MyTable/Quantity");
var unitPriceField = Context.GetField("MyTable/Unit Price");
var totalField = Context.GetField("MyTable/Total Price");

if (!quantityField || !unitPriceField || !totalField)
    return;

var quantity = quantityField.Value ? quantityField.Value : 0;
var unitPrice = unitPriceField.Value?.Amount ? unitPriceField.Value.Amount : 0;
var total = totalField.Value?.Amount ? totalField.Value.Amount : 0;

var result = quantity * unitPrice;

if (Math.abs(result - total) > 0.01) {
    Context.CheckSucceeded = false;
    Context.ErrorMessage = "Menge * Stückpreis entspricht nicht dem Gesamtbetrag";
}

Automatisierung von Geschäftsregeln

Fügen Sie einem Document-Skill skriptbasierte Regeln hinzu, konfigurieren Sie lesbare und schreibbare Felder und referenzieren Sie Tabellenspalten.

Objektmodell

Vollständige JavaScript-Objektreferenz zur Verwendung in erweiterten Skriptregeln.

Context

Das globale Objekt Context — greifen Sie innerhalb einer Regel auf das Dokument, die Felder und die Skill-Parameter zu.

Field

Das Objekt Field — prüfen und ändern Sie ein Dokumentfeld während der Regelausführung.