Delen via


Besturingsfuncties toevoegen in acties om de uitvoering van regels te optimaliseren met Behulp van Microsoft Rules Composer (preview)

Van toepassing op: Azure Logic Apps (Standard)

Belangrijk

Deze mogelijkheid is in preview en is onderworpen aan de aanvullende gebruiksvoorwaarden voor Microsoft Azure Previews.

In deze handleiding wordt beschreven hoe u de uitvoering van regels optimaliseert door besturingsfuncties toe te voegen aan acties in uw regels met behulp van Microsoft Rules Composer. Besturingsfuncties helpen uw toepassing of regelset om de feiten in het werkgeheugen van de regelengine te beheren. Deze functies omvatten de functies Assert, Clear, Halt, Retract, RetractByType, Reassert en Update voor het .NET-object en TypedXmlDocument-entiteiten die u als feiten kunt gebruiken. Het bestaan van feiten in het werkgeheugen bepaalt de voorwaarden die de engine evalueert en de acties die worden uitgevoerd.

Vereisten

  • Download en installeer de Microsoft Rules Composer.

  • Het XML-bestand met de regelset waaraan u wilt werken.

    Als u feiten wilt toevoegen, geeft u de waarden op in de XML-documenten die u aanwijst vanuit het venster RuleSet Explorer. U kunt ook een maker van feiten gebruiken om uw regelengine op te geven met een matrix die .NET-objecten als feiten bevat. Zie Makers en retrievers bouwen voor meer informatie.

De functie Assert

Als u objectexemplaren wilt toevoegen aan het werkgeheugen van de regelengine, gebruikt u de functie Assert in de Microsoft Rules Composer. De engine verwerkt elk objectexemplaren op basis van de voorwaarden en acties die zijn geschreven op basis van het type van het exemplaar met behulp van de actiefasen voor overeenkomstconflicten.

De volgende tabel bevat een overzicht van het gedrag van de functie Assert voor de ondersteunde asserte entiteiten en instantietypen, inclusief het aantal resulterende exemplaren dat in de engine is gemaakt voor elke asserteerde entiteit en het type dat op elk exemplaar voor identificatie wordt toegepast.

Entity Aantal exemplaren dat is assertie Type instantie
.NET-object 1 (het object zelf) Volledig gekwalificeerde .NET-klasse
TypedXmlDocument 1-N TypedXmlDocument(s): Op basis van de selectorbindingen die zijn gemaakt en documentinhoud DocumentType.Selector

Een .NET-object bevestigen

De regelengine ondersteunt standaard .NET scalaire typen en objecten voor referentietypen. Asserted .NET object processing is de eenvoudigste van de verwerkingstypen.

In Microsoft Rules Composer kunt u een .NET-object vanuit een regel bevestigen.

  1. Laad in Microsoft Rules Composer het XML-bestand met het regelarchief waaraan u wilt werken.

  2. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  3. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Assert toe als een actie.

  4. Selecteer .NET-klassen in het venster Feitenverkenner.

  5. Sleep op het tabblad .NET-klassen de constructormethode voor het object dat u wilt gebruiken in de actie Assert .

    Met De Microsoft Rules Composer wordt de constructormethode omgezet in een CreateObject-aanroep in de regeldefinitie.

    Notitie

    Hoewel de regelengine een functie CreateObject heeft, wordt de functie niet weergegeven als een afzonderlijke functie in de Microsoft Rules Composer.

Elk object wordt als een afzonderlijk objectexemplaren in het werkgeheugen geplaatst, wat betekent dat elk predicaat dat verwijst naar het type van het object, zoals IF Object.Property = 1, het exemplaar analyseert. Het exemplaar is ook beschikbaar voor regelacties die verwijzen naar het type, op basis van de resultaten van de regelvoorwaarden.

Stel dat u de volgende regels hebt:

Regel 1

IF A.Value = 1
THEN A.Status = "good"

Regel 2

IF B.Value = 1
THEN A.Status = "good"

In regel 1 hebben alleen de A-exemplaren met de waarde 1 de eigenschap Status bijgewerkt. In regel 2 wordt de status van alle A-exemplaren echter bijgewerkt als de voorwaarde waar is. Als er meerdere B-exemplaren bestaan, worden de A-exemplaren bijgewerkt telkens wanneer de voorwaarde waar is voor een B-exemplaar .

Een Entiteit TypedXmlDocument bevestigen

In de Microsoft Rules Composer kunt u een Entiteit TypedXmlDocument binnen een regel bevestigen.

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Assert toe als een actie.

  3. Selecteer XML-schema's in het venster Feitenverkenner.

  4. Sleep op het tabblad XML-schema's het knooppunt dat u wilt gebruiken in de actie Assert .

XML-documenten zijn in feite tekst, maar de veldwaarden kunnen elk type zijn, dat is gebaseerd op het opgegeven type toen de regel werd gemaakt. Velden zijn XPath-expressies, dus ze kunnen een knooppuntset retourneren, wat betekent dat het eerste item in de set wordt gebruikt als de waarde.

Wanneer een Entiteit TypedXmlDocument als feit wordt asserted, worden met de regelengine onderliggende exemplaren van TypedXmlDocument gemaakt op basis van de selectors die in de regel zijn gedefinieerd. U kunt selectors beschouwen als een manier om de knooppunten in een XML-document te isoleren en velden als het identificeren van specifieke items in de selector. De regelengine groeperen alle velden in één selector als een object.

Selectors zijn ook XPath-expressies. Wanneer u in Feitenverkenner een knooppunt selecteert op het tabblad XML-schema's, vult Microsoft Rules Composer automatisch de eigenschap XPath Selector in voor alle knooppunten en de eigenschap XPath Field voor een knooppunt dat geen onderliggende knooppunten bevat. U kunt ook uw eigen XPath-expressies invoeren voor XPath Selector en XPath Field , indien nodig. Als de selector overeenkomt met meerdere delen in het XML-document, worden meerdere objecten van dit type in of ingetrokken uit het werkgeheugen van de regelengine.

U kunt meerdere selectors in hetzelfde document gebruiken. Op die manier kunt u verschillende delen van het document bekijken, bijvoorbeeld dat de ene sectie de bestelling is en een andere sectie het verzendadres bevat. Houd er echter rekening mee dat de gemaakte objecten worden gedefinieerd door de XPath-tekenreeks die ze heeft gemaakt. Als u een andere XPath-expressie gebruikt, is het resultaat een unieke TypedXmlDocument-entiteit , zelfs als de expressie wordt omgezet in hetzelfde knooppunt.

Stel dat u de volgende XML hebt:

<root>
    <order customer="Joe">
        <item name="router" quantity="10" cost="550" />
        <item name="switch" quantity="3" cost="300" />
    </order>
    <order customer="Jane">
        <item name="switch" quantity="1" cost="300" />
        <item name="cable" quantity="23" cost="9.99" />
    </order>
</root>

Als u de selector /root/order of volgorde gebruikt, worden de volgende objecten toegevoegd aan het werkgeheugen van de engine:

Object 1

<order customer="Joe">
    <item name="router" quantity="10" cost="550" />
    <item name="switch" quantity="3" cost="300" />
</order>

Object 2

<order customer="Jane">
    <item name="switch" quantity="1" cost="300" />
    <item name="cable" quantity="23" cost="9.99" />
</order>

Binnen elke selector verwijzen XPaths naar de afzonderlijke velden. Als u dus de selector /root/order/item, order/item of item gebruikt, worden de volgende objecten toegevoegd aan het werkgeheugen van de engine met twee items voor Joe en de twee items voor Jane:

<root>
    <order customer="Joe">
    </order>
    <order customer="Jane">
    </order>
</root>

Elk object heeft toegang tot drie velden: @name, @quantity en @cost. U kunt verwijzen naar de bovenliggende velden omdat het object een verwijzing naar het oorspronkelijke document is, bijvoorbeeld .. /@customer.

Achter de schermen kan de regelengine een waarde van een tekstveld converteren naar een van de ondersteunde typen via de functie XmlConvert . U kunt deze optie opgeven door het type in te stellen in Microsoft Rules Composer. Als een conversie niet mogelijk is, genereert de engine een uitzondering. U kunt de bool en dubbele typen alleen ophalen als hun respectieve type, tekenreeksen of objecten.

Wisfunctie

Als u het werkgeheugen en de agenda voor een exemplaar van een regelengine opnieuw wilt instellen, gebruikt u de functie Clear in Microsoft Rules Composer. Zie Optimalisatie van regelengine voor meer informatie over het werkgeheugen en de agenda.

Werkgeheugen en agenda voor uw regelengine opnieuw instellen

  1. Zoek en selecteer in het venster RuleSet Explorer de regel waar u het werkgeheugen en de agenda voor de regelengine wilt wissen.

  2. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Wissen toe als een actie.

    De functie Clear heeft geen argumenten.

Stop, functie

Als u de huidige uitvoering door de regelengine wilt stoppen, gebruikt u de functie Halt in de Microsoft Rules Composer.

Uitvoering van regelset stoppen

  1. Zoek en selecteer in het venster RuleSet Explorer de regel waar u de uitvoering van de regelset wilt stoppen.

  2. Voeg in het deelvenster THEN onder Acties de ingebouwde functie Stoppen toe als een actie.

De functie Halt heeft één Booleaans argument. Als u de waarde opgeeft als waar, wist de regelengine de agenda die de in behandeling zijnde kandidaatregels bevat.

De methode Ruleset.Execute is een wrapper rond de methode RuleEngine.Execute en gebruikt code die vergelijkbaar is met de volgende code:

RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);

Als u de methode Ruleset.Execute gebruikt om een regelset uit te voeren, retourneert de regelengine het besturingselement naar de methode Ruleset.Execute wanneer de functie Halt wordt uitgevoerd. De methode Ruleset.Execute trekt de feiten in en retourneert het besturingselement naar de aanroeper. In dit geval kan de uitvoering van de regelset gestopt niet worden hervat.

Als u echter rechtstreeks de methode RuleEngine.Execute gebruikt om de regelset uit te voeren, kunt u de uitvoering van de gestopte regelset hervatten met de volgende regel die in behandeling is door RuleEngine.Execute opnieuw aan te roepen, mits u geen objecten hebt ingetrokken die nodig zijn tussen de twee aanroepen.

Notitie

Met de methode Ruleset.Execute worden de exemplaren van de regelengine opgeslagen voor betere prestaties. Als u rechtstreeks de methode RuleEngine.Execute gebruikt, worden de exemplaren van de regelengine niet in de cache opgeslagen.

De volgende voorbeeldcode laat zien hoe u de uitvoering van de gestopte regelset hervat:

// Assert facts into working memory of the rules engine instance.
RuleEngine.Assert(facts);

// Execute the ruleset.
RuleEngine.Execute();

// The ruleset invokes the Halt method when executing actions.
// Control returns here when the Halt function is called. 
// When engine halts, do the following tasks.

// Add your code here.

// Resume the halted rules engine execution.
RuleEngine.Execute();

// Retract or remove facts from working memory in the rules engine.
RuleEngine.Retract(facts);

Functie Intrekken

Als u objecten uit een regelset en uit het werkgeheugen van de regelengine wilt verwijderen, gebruikt u de functie Intrekken in Microsoft Rules Composer.

Een .NET-object intrekken

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN onder Acties de ingebouwde functie Intrekken toe als een actie.

  3. Selecteer .NET-klassen in het venster Feitenverkenner.

  4. Sleep op het tabblad .NET-klassen de gewenste klasse, niet de assembly of methode, naar het argument voor de parameter Retract .

    Als u een methode naar de functie Retract sleept, probeert de engine het object in te trekken dat door de methode wordt geretourneerd.

Het intrekken van een .NET-object heeft de volgende gevolgen:

  • Acties op de agenda die de objecten gebruiken, worden uit de agenda verwijderd.

    Notitie

    Andere acties die hoger op de agenda staan, zijn mogelijk al uitgevoerd voordat u de functie Intrekken gebruikt.

  • Regels die het object in een predicaat gebruiken, hebben hun acties verwijderd uit de agenda, als er acties op de agenda aanwezig zijn.

  • De engine evalueert het object niet meer.

Een TypedXmlDocument-entiteit of -entiteiten intrekken

U kunt de oorspronkelijke TypedXmlDocument-entiteit intrekken die in de regelengine is opgenomen, of u kunt een van de onderliggende Entiteiten van TypedXmlDocument intrekken die zijn gemaakt op basis van de bovenliggende XmlDocument-entiteit .

Stel dat u het volgende xml-voorbeeld hebt:

<order>
    <orderline customer="Joe" linenumber="001">
        <product name="router" quantity="10" cost="550" />
    </orderline>
    <orderline customer="Jane" linenumber="002">
        <product name="switch" quantity="1" cost="300" />
    </orderline>
</order>

U kunt de entiteit TypedXmlDocument intrekken die is gekoppeld aan een orderobject, of u kunt een of beide typedXmlDocument-entiteiten intrekken die aan het orderlijnobject zijn gekoppeld. Alle TypedXmlDocument-entiteiten zijn gekoppeld aan de entiteit TypedXmlDocument op het hoogste niveau die oorspronkelijk is asserteerd, niet met de entiteit TypedXmlDocument die boven dat knooppunt TypedXmlDocument op het hoogste niveau in de XML-structuurhiërarchie wordt weergegeven.

Product is bijvoorbeeld een TypedXmlDocument-entiteit onder het orderlijnobject en is gekoppeld aan de entiteit TypedXmlDocument voor order, niet de entiteit TypedXmlDocument voor orderlijn. In de meeste gevallen is dit onderscheid niet belangrijk. Als u het orderobject echter intrekt, worden de orderlijn - en productobjecten ook ingetrokken. Als u het orderlijnobject intrekt, wordt alleen dat object ingetrokken, niet het productobject .

De engine werkt alleen met en houdt de objectexemplaren, die TypedXmlDocument-exemplaren zijn, bij die de engine die is gemaakt toen de entiteit TypedXmlDocument in eerste instantie werd assertieed. Als u extra knooppunten maakt, zoals knooppunten op hetzelfde niveau, voor een knooppunt dat is geselecteerd via een selector in de regelset, worden deze knooppunten niet geëvalueerd in regels, tenzij er TypedXmlDocument-entiteiten voor deze knooppunten worden gemaakt en gecontroleerd. Als u deze nieuwe TypedXmlDocument-exemplaren op lager niveau bevestigt, evalueert de engine de exemplaren in de regels, maar de entiteit TypedXmlDocument op het hoogste niveau beschikt niet over deze exemplaren. Wanneer het typedXmlDocument op het hoogste niveau wordt ingetrokken, worden de nieuwe, onafhankelijk bevestigde TypedXmlDocument-entiteiten niet automatisch ingetrokken. Als er nieuwe knooppunten worden gemaakt, voert u een Intrekbewerking en opnieuwassert uit op het volledige XmlDocument. Dit is de meest gebruikelijke en meest eenvoudige stap die u moet uitvoeren.

De klasse TypedXmlDocument biedt nuttige methoden die u kunt aanroepen binnen een aangepast .NET-lid als onderdeel van een actie. Deze methoden omvatten de mogelijkheid om de XmlNode op te halen die is gekoppeld aan het TypedXmlDocument of het bovenliggende TypedXmlDocument.

De entiteit TypedXmlDocument op het hoogste niveau intrekken

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN onder Acties de ingebouwde functie Intrekken toe als een actie.

  3. Selecteer XML-schema's in het venster Feitenverkenner.

  4. Sleep op het tabblad XML-schema's het knooppunt op het hoogste niveau voor het schema naar het argument voor de functie Intrekken .

    Dit bovenste knooppunt eindigt op de extensie .xsd en vertegenwoordigt het hoofdknooppunt van het document, niet het knooppunt van het documentelement. Het knooppunt heeft een / selector die verwijst naar het oorspronkelijke TypedXmlDocument. Wanneer u het bovenliggende TypedXmlDocument intrekt, worden alle onderliggende Entiteiten van TypedXmlDocument die zijn gekoppeld aan het TypedXmlDocument verwijderd uit het werkgeheugen, inclusief alle Entiteiten van TypedXmlDocument die zijn gemaakt door de functie Assert aan te roepen, op basis van selectors die in de regelset worden gebruikt.

Een onderliggende TypedXmlDocument-entiteit intrekken

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN onder Acties de ingebouwde functie Intrekken toe als een actie.

  3. Selecteer XML-schema's in het venster Feitenverkenner.

  4. Sleep het onderliggende knooppunt vanaf het tabblad XML-schema's naar het argument voor de functie Intrekken .

De functie RetractByType

Als u alle objecten met het opgegeven type uit het werkgeheugen van de regelengine wilt verwijderen, gebruikt u de functie RetractByType in de Microsoft Rules Composer. Deze functie verschilt van de functie Intrekken , waardoor alleen specifieke items met een bepaald type worden verwijderd.

Alle .NET-objecten met een specifiek type intrekken

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN onder Actions de ingebouwde functie RetractByType toe als een actie.

  3. Selecteer .NET-klassen in het venster Feitenverkenner.

  4. Sleep de klasse vanaf het tabblad .NET-klassen naar het argument voor de functie RetractByType .

Alle TypedXmlDocument-entiteiten met een specifiek type intrekken

Het RetractByType verwijdert alle TypedXmlDocument-entiteiten met dezelfde DocumentType.Selector.

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN onder Actions de ingebouwde functie RetractByType toe als een actie.

  3. Selecteer XML-schema's in het venster Feitenverkenner.

  4. Sleep op het tabblad XML-schema's het juiste knooppunt naar de functie RetractByType .

Als u de functie RetractByType gebruikt op het hoofdknooppunt van het document, trekt deze actie niet alleen alle TypedXmlDocument-entiteiten in die zijn asserteerd met dat DocumentType, maar ook alle onderliggende TypedXmlDocument-entiteiten of XmlNode-knooppunten in de structuurhiërarchie, gekoppeld aan die bovenliggende TypedXmlDocument-entiteiten.

Functie Opnieuw beoordelen

Als u de functie Assert wilt aanroepen voor een object dat al bestaat in het werkgeheugen van de engine, gebruikt u de functie Reassert in Microsoft Rules Composer. Het gedrag is gelijk aan het uitgeven van een intrekkingsopdracht voor het object, gevolgd door een Assert-opdracht.

Als u bijvoorbeeld de functie Reassert op een .NET-object gebruikt, voert de regelengine de volgende stappen uit:

  1. Trek het .NET-object uit het werkgeheugen in.

  2. Verwijder acties op de agenda voor regels die gebruikmaken van het object in een predicaat of actie.

  3. Bevestig het .NET-object weer in het werkgeheugen en evalueer als een nieuw asserted object.

  4. Evalueer alle regels die gebruikmaken van het object in een predicaat opnieuw en voeg de acties van deze regels indien nodig toe aan de agenda.

  5. De acties naar de agenda gelezen voor regels die eerder zijn geëvalueerd als waar en alleen het object gebruiken in hun acties.

Een .NET-object opnieuw beoordelen

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Reassert toe als een actie.

  3. Selecteer .NET-klassen in het venster Feitenverkenner.

  4. Sleep de klasse vanaf het tabblad .NET-klassen naar het argument voor de functie Reassert .

Een Entiteit TypedXmlDocument opnieuw beoordelen

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Reassert toe als een actie.

  3. Selecteer XML-schema's in het venster Feitenverkenner.

  4. Sleep op het tabblad XML-schema's het entiteitsknooppunt dat u wilt gebruiken in de functie Reassert .

Als u een entiteit TypedXmlDocument op het hoogste niveau opnieuw bekijkt, kunnen de onderliggende entiteiten TypedXmlDocument, die zijn gemaakt toen de entiteit TypedXmlDocument op het hoogste niveau voor het eerst werd asserteerd, zich anders gedragen, afhankelijk van de status van elke onderliggende entiteit TypedXmlDocument.

Als een nieuwe of bestaande onderliggende entiteit bijvoorbeeld 'vies' is, wat betekent dat ten minste één veld is gewijzigd in de regelset met behulp van een actie, wordt er een functie Assert of Reassert-functie uitgevoerd op dat onderliggende element. Elk bestaand kind dat niet vies is, blijft in het werkgeheugen.

Notitie

Een knooppunt is niet gemarkeerd als vuil van externe bewerkingen die de engine niet kent, bijvoorbeeld een externe toepassing programmatisch toevoegt, verwijdert of dat knooppunt bijwerkt.

In het volgende voorbeeld ziet u een vereenvoudigd scenario waarin het gedrag van de onderliggende entiteit wordt beschreven wanneer de bovenliggende entiteit opnieuw wordt uitgevoerd. Stel dat u de volgende TypedXmlDocument-entiteiten in het werkgeheugen hebt: Parent, Child1, Child2 en Child3.

  • Bovenliggend is de entiteit TypedXmlDocument op het hoogste niveau.
  • Elk onderliggend element bevat een veld met de naam ExampleField, waarbij de waarde is ingesteld op 1, bijvoorbeeld Child1.ExampleField = 1'.

Stel dat een regelactie de volgende bewerkingen uitvoert op de onderliggende entiteiten:

  • De waarde ExampleField voor Child2 wordt bijgewerkt van 1 naar 0.
  • Met de gebruikerscode wordt Child3 verwijderd.
  • Met de gebruikerscode wordt een nieuwe onderliggende entiteit TypedXmlDocument met de naam NewChild toegevoegd aan Parent.

In het volgende voorbeeld ziet u de nieuwe weergave van objecten in het werkgeheugen:

Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild

Stel nu dat u de bovenliggende entiteit opnieuw bekijkt, wat resulteert in het volgende gedrag van de onderliggende entiteit:

  • Child2 wordt opnieuw opgestart omdat het nu vies is nadat het veld is bijgewerkt.
  • Child3 wordt ingetrokken uit het werkgeheugen.
  • NewChild wordt in het werkgeheugen gesteld.
  • Child1 blijft ongewijzigd in het werkgeheugen omdat het niet is bijgewerkt voordat het bovenliggende item opnieuw werd uitgevoerd.

De functie Update

Als u een object opnieuw wilt beoordelen in de regelengine voor herwaardering, gebruikt u de functie Update in Microsoft Rules Composer op basis van de nieuwe gegevens en status. Het object kan een .NET-klassetype of TypedXmlDocument-type hebben. U kunt ook de functie Update gebruiken om de prestaties van de engine te verbeteren en eindeloze lusscenario's te voorkomen.

Belangrijk

Het standaard maximumaantal lus voor herwaardering van regels is 2^32, dus voor bepaalde regels kan de uitvoering van de regelset lang duren. Als u het aantal loops wilt verminderen, wijzigt u de eigenschap Maximale uitvoeringslusdiepte in de regelsetversie.

Een .NET-object bijwerken

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Bijwerken toe als een actie.

  3. Selecteer .NET-klassen in het venster Feitenverkenner.

  4. Sleep de klasse vanaf het tabblad .NET-klassen naar het argument voor de functie Update .

Normaal gesproken gebruikt u Assert om een nieuw object in het werkgeheugen van de regelengine te plaatsen en gebruikt u Bijwerken om een al bestaand object in het werkgeheugen bij te werken. Wanneer u een nieuw object als feit bevestigt, evalueert de engine de voorwaarden in alle regels opnieuw. Wanneer u echter een bestaand object bijwerkt, evalueert de engine alleen voorwaarden die gebruikmaken van het bijgewerkte feit en voegt deze acties toe aan de agenda als deze voorwaarden waar zijn.

Stel dat u de volgende regels hebt en dat de objecten met de naam ItemA en ItemB al bestaan in het werkgeheugen.

  • Regel 1 evalueert de eigenschap Id in ItemA, stelt de eigenschap Id op ItemB in en evalueert ItemB na de wijziging opnieuw. Wanneer ItemB opnieuw wordt geactiveerd, behandelt de engine ItemB als een nieuw object en evalueert de engine alle regels die ItemB gebruiken in de predicaten of acties opnieuw. Dit gedrag zorgt ervoor dat de engine regel 2 opnieuw evalueert op basis van de nieuwe waarde in ItemB.Id zoals ingesteld in regel 1.

    Regel 1

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • Regel 2 kan de eerste evaluatie mislukken, maar resulteert in waar tijdens de tweede evaluatie.

    Regel 2

    IF ItemB.Id == 2
    THEN ItemB.Value = 100
    

De mogelijkheid om objecten opnieuw te beoordelen in het werkgeheugen geeft u expliciet controle over het gedrag in scenario's voor ketens. In dit voorbeeld wordt echter een neveneffect van reassertion weergegeven, waarbij regel 1 ook opnieuw wordt geëvalueerd. Als ItemA.Id ongewijzigd, resulteert regel 1 opnieuw in waar en wordt de actie Assert(ItemB) opnieuw geactiveerd. Als gevolg hiervan creëert de regel een eindeloze lussituatie.

Eindeloze lussen voorkomen

U moet objecten opnieuw kunnen beoordelen zonder eindeloze lussen te maken. Om dergelijke scenario's te voorkomen, kunt u de functie Update gebruiken. Net als de functie Reassert voert de functie Update de functies Intrekken en Assert uit op de bijbehorende objectexemplaren die worden gewijzigd door regelacties, maar met de volgende belangrijke verschillen:

  • Op de agenda blijven acties voor regels op de agenda staan wanneer het exemplaartype alleen wordt gebruikt in de acties, niet de predicaten.

  • Regels die alleen gebruikmaken van het exemplaartype in acties, worden niet opnieuw geëvalueerd.

Als gevolg hiervan worden regels die gebruikmaken van de instantietypen, alleen in de predicaten of beide predicaten en acties, opnieuw geëvalueerd en worden de acties van de regels indien van toepassing aan de agenda toegevoegd.

Door het voorgaande voorbeeld te wijzigen om de functie Bijwerken te gebruiken, kunt u ervoor zorgen dat de engine alleen regel 2 opnieuw evalueert omdat de voorwaarde voor regel 2 ItemB gebruikt. De engine evalueert regel 1 niet opnieuw, omdat ItemB alleen wordt gebruikt in de acties voor regel 1*, waardoor het lusscenario wordt geëlimineerd.

Regel 1

IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)

Regel 2

IF ItemB.Id == 2
THEN ItemB.Value = 100

Ondanks dat de functie Update op deze manier wordt gebruikt, bestaat de mogelijkheid nog steeds voor het maken van lusscenario's. Denk bijvoorbeeld aan de volgende regel:

IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)

Het predicaat maakt gebruik van ItemA, zodat de engine de regel opnieuw evalueert wanneer Update wordt aangeroepen op ItemA. Als de waarde voor ItemA.Id elders niet wordt gewijzigd, blijft regel 1 als waar evalueren, waardoor Update opnieuw wordt aangeroepen op ItemA.

Als regelontwerper moet u ervoor zorgen dat u dergelijke lusscenario's niet kunt maken. De juiste aanpak om dit probleem op te lossen verschilt op basis van de aard van de regels.

In het volgende voorbeeld ziet u een eenvoudige manier om het probleem in het vorige voorbeeld op te lossen door een controle toe te voegen op ItemA.Value waarmee wordt voorkomen dat de regel opnieuw wordt geëvalueerd als waar nadat de acties van de regel de eerste keer zijn uitgevoerd.

IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)

Een TypedXmlDocument-entiteit bijwerken

  1. Zoek en selecteer in het venster RuleSet Explorer de gewenste regel.

  2. Voeg in het deelvenster THEN , onder Acties, de ingebouwde functie Bijwerken toe als een actie.

  3. Selecteer XML-schema's in het venster Feitenverkenner.

  4. Sleep op het tabblad XML-schema's het entiteitsknooppunt dat u wilt gebruiken in de functie Update .

Stel dat u de volgende regels hebt:

  • Regel 1 evalueert het totale aantal artikelen in een inkooporderbericht.

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • Regel 2 stelt de status in op Goedkeuring nodig als het totale aantal groter is dan of gelijk is aan 10.

    Regel 2

    IF ProcessPO.Order:/Order/Items/TotalCount >= 10
    THEN ProcessPO.Order:/Order/Status = "Needs approval"
    

Als u het volgende inkooporderbericht doorgeeft als invoer voor deze regelset, ziet u dat de status niet is ingesteld op Goedkeuring vereist, ook al is totalcount 14. Dit gedrag treedt op omdat regel 2 alleen aan het begin wordt geëvalueerd wanneer de waarde TotalCount 0 is. De regel wordt niet telkens geëvalueerd wanneer TotalCount wordt bijgewerkt.

<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>

Als u de engine de voorwaarden telkens opnieuw wilt laten evalueren wanneer TotalCount wordt bijgewerkt, moet u de functie Update aanroepen op het bovenliggende knooppunt (Items) voor het bijgewerkte knooppunt (TotalCount). Als u regel 1 als volgt wijzigt en de regel nog één keer test, wordt het veld Status ingesteld op Goedkeuring nodig:

Regel 1 (bijgewerkt)

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)