Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn die Update-Funktion bei einem Objekt aufgerufen wird, wird das Objekt erneut in die Engine eingebracht, um basierend auf den neuen Daten und dem neuen Zustand erneut evaluiert zu werden. Das Objekt kann vom Typ TypedXmlDocument oder .NET-Klasse oder DataConnection oder TypedDataTable sein.
Sie können auch die Update-Funktion verwenden, um die Leistung des Engines zu verbessern und, wie in diesem Thema beschrieben, Endlosschleifenszenarien zu verhindern.
In der Regel verwenden Sie Assert , um ein neues Objekt im Arbeitsspeicher des Regelmoduls zu platzieren und ein bereits vorhandenes Objekt im Arbeitsspeicher zu aktualisieren. Wenn Sie ein neues Objekt bestätigen, werden Bedingungen in allen Regeln ausgewertet. Wenn Sie ein vorhandenes Objekt aktualisieren, werden nur Bedingungen, die die aktualisierte Tatsache verwenden, neu ausgewertet, und Aktionen werden der Tagesordnung hinzugefügt, wenn diese Bedingungen auf "true" ausgewertet werden.
Verwendung der Update-Funktion für .NET-Daten
Nehmen Sie die beiden Regeln, die als Beispiel dienen. Angenommen, objekte ItemA und ItemB sind bereits im Arbeitsspeicher vorhanden. Regel 1 wertet die ID-Eigenschaft für ItemA aus, legt die ID-Eigenschaft auf ItemB fest und setzt dann ItemB nach der Änderung erneut ein. Wenn ItemB erneut überprüft wird, wird es als neues Objekt behandelt, und das Modul wertet alle Regeln neu aus, die ObjektelementB in den Prädikaten oder Aktionen verwenden. Dadurch wird sichergestellt, dass Regel 2 anhand des neuen Werts von ItemB.Id neu ausgewertet wird, wie in Regel 1 festgelegt. Regel 2 ist möglicherweise fehlgeschlagen, wenn sie zum ersten Mal ausgewertet wurde, wird aber bei der zweiten Auswertung als wahr ausgewertet.
Regel 1
IF ItemA.Id == 1
THEN ItemB.Id = 2
Assert(ItemB)
Regel 2
IF ItemB.Id == 2
THEN ItemB.Value = 100
Diese Fähigkeit zur Wiederherstellung von Objekten im Arbeitsgedächtnis ermöglicht dem Benutzer die explizite Kontrolle über das Verhalten in Vorwärtskettenszenarien. Ein Nebeneffekt der Neubewertung in diesem Beispiel ist jedoch, dass Regel 1 auch neu ausgewertet wird. Da ItemA.Id nicht geändert wurde, wertet Regel 1 erneut " true " aus, und die Assert(ItemB) -Aktion wird erneut ausgelöst. In der Folge erstellt die Regel eine Endlosschleife.
Hinweis
Die standardmäßige maximale Schleifenanzahl der Neuauswertung von Regeln ist 2^32. Bei bestimmten Regeln kann die Richtlinienausführung lange dauern. Sie können die Anzahl verringern, indem Sie die Maximale Ausführungsschleifentiefe-Eigenschaft der Richtlinienversion anpassen.
Sie müssen in der Lage sein, Objekte neu zu erstellen, ohne endlose Schleifen zu erstellen, und die Update-Funktion stellt diese Funktion bereit. Wie eine erneute Bestätigung führt die Update-FunktionZurückziehen und Assert der zugeordneten Objektinstanzen aus, die von Regelaktionen geändert wurden, doch es gibt zwei wesentliche Unterschiede.
Aktionen auf der Tagesordnung für Regeln, bei denen der Instanztyp nur in den Aktionen (nicht den Prädikaten) verwendet wird, bleiben auf der Tagesordnung.
Regeln, die nur den Instanztyp in den Aktionen verwenden, werden nicht erneut ausgewertet.
Daher werden Regeln, die die Instanztypen entweder nur in den Prädikaten oder sowohl in den Prädikaten als auch in den Aktionen verwenden, erneut ausgewertet, und ihre Aktionen werden der Agenda entsprechend hinzugefügt.
Durch Das Ändern des vorherigen Beispiels zur Verwendung der Update-Funktion wird sichergestellt, dass nur Regel 2 neu ausgewertet wird, da ItemB in der Bedingung von Regel 2 verwendet wird. Regel 1 wird nicht neu ausgewertet, da ItemB nur in den Aktionen von Regel 1 verwendet wird, wodurch das Schleifenszenario eliminiert wird.
Regel 1
IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)
Regel 2
IF ItemB.Id == 2
THEN ItemB.Value = 100
Es ist jedoch weiterhin möglich, Schleifenszenarien zu erstellen. Betrachten Sie beispielsweise die folgende Regel.
Regel 1
IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)
Da ItemA im Prädikat verwendet wird, wird es erneut ausgewertet, wenn "Update" für ItemA aufgerufen wird. Wenn der Wert von ItemA.Id an anderer Stelle nicht geändert wird, wird Regel 1 weiterhin auf "true" ausgewertet, sodass "Update" erneut auf A aufgerufen wird. Der Regel-Designer muss sicherstellen, dass Schleifenszenarien wie diese nicht erstellt werden.
Der entsprechende Ansatz unterscheidet sich je nach Art der Regeln. Es folgt ein einfacher Mechanismus zum Beheben des Problems im vorherigen Beispiel.
Die Update-Funktion kann im Business Rule Composer mit einem Verweis auf die Klasse verwendet werden, wie bei den Funktionen "Assert", "Zurückziehen" oder "RetractByType ".
Regel 1
IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)
Durch Hinzufügen der Überprüfung auf ItemA.Value wird verhindert, dass Regel 1 erneut auf wahr ausgewertet wird, nachdem die Aktionen von Regel 1 zum ersten Mal ausgeführt wurden.
Verwenden der Update-Funktion für XML-Fakten
Nehmen Sie die beiden Regeln als Beispiel. Angenommen, dass … Regel 1 wertet die Gesamtanzahl der Artikel in einer Bestellnachricht aus, und Regel2 legt den Status auf "Genehmigung erforderlich" fest, wenn die Gesamtanzahl größer als oder gleich 10 ist.
Regel 1
IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)
Regel 2
IF ProcessPO.Order:/Order/Items/TotalCount >= 10
THEN ProcessPO.Order:/Order/Status = "Needs approval"
Wenn Sie die folgende Bestellnachricht (BN) als Eingabe an diese Richtlinie übergeben, stellen Sie fest, dass der Status nicht auf "Genehmigung erforderlich" festgelegt ist, obwohl die Gesamtzahl der Artikel 14 beträgt. Es liegt daran, dass die Regel2 nur am Anfang ausgewertet wird, wenn der Wert des Felds " TotalCount " 0 ist, und die Regel nicht jedes Mal ausgewertet wird, wenn die gesamt verfügbare Anzahl aktualisiert wird. Damit die Bedingungen bei jeder Aktualisierung des TotalCount neu ausgewertet werden, müssen Sie die Update-Funktion für den übergeordneten Knoten (Items) des geänderten Knotens (TotalCount) aufrufen. Wenn Sie die Regel1 wie unten dargestellt ändern und sie ein weiteres Mal testen, sollte der Wert des Felds "Status" auf "Genehmigung erforderlich" festgelegt sein.
<ns0:Order xmlns:ns0="http://ProcessPO.Order">
<Items>
<Item>
<Id>ITM1</Id>
<Count>2</Count>
</Item>
<Item>
<Id>ITM2</Id>
<Count>5</Count>
</Item>
<Item>
<Id>ITM3</Id>
<Count>7</Count>
</Item>
<TotalCount>0</TotalCount>
</Items>
<Status>No approval needed</Status>
</ns0:Order>
Die geänderte Regel 1 lautet wie folgt:
Regel 1
IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count) AND
Update(ProcessPO.Order:/Order/Items)
Verwenden der Update-Funktion für Datenbankdaten
GetypteDatentabelle
Wenn Update für eine TypedDataTable aufgerufen wird, wird Update von der Engine für alle zugeordneten TypedDataRows aufgerufen. Update kann auch für einzelne TypedDataRows aufgerufen werden.
DataConnection
Das Aktualisieren einer DataConnection wird nicht unterstützt. Verwenden Sie stattdessen "Assert" .