Přidání řídicích funkcí v akcích pro optimalizaci provádění pravidel pomocí nástroje Microsoft Rules Composer

Platí pro: Azure Logic Apps (Standard)

Tento průvodce ukazuje, jak optimalizovat provádění pravidel přidáním řídicích funkcí do akcí v pravidlech pomocí nástroje Microsoft Rules Composer. Řídicí funkce pomáhají vaší aplikaci nebo sadě pravidel řídit fakta v pracovní paměti stroje pravidel. Mezi tyto funkce patří Assert, Clear, Halt, Retract, RetractByType, Reassert a Update pro objekty .NET a TypedXmlDocument, které můžete použít jako fakta. Existence faktů v pracovní paměti řídí podmínky, které modul vyhodnocuje, a akce, které se provádějí.

Požadavky

  • Stáhněte a nainstalujte nástroj Microsoft Rules Composer.

  • Soubor XML, který obsahuje sadu pravidel, na které chcete pracovat.

    Pokud chcete přidat fakta, zadejte jejich hodnoty v dokumentech XML, na které ukazujete z okna Průzkumníka pravidel. Nebo můžete tvůrce faktů použít k poskytnutí modulu pravidel pole, které obsahuje objekty .NET jako fakta. Další informace najdete v tématu Vytváření tvůrců faktů a retrieverů.

Funkce Assert

Chcete-li přidat instance objektů do pracovní paměti stroje pravidel, použijte funkci Assert v nástroji Microsoft Rules Composer. Jádro zpracovává každou instanci objektu podle podmínek a akcí, které se vztahují k typu instance, pomocí fází shody-řešení konfliktů-akce.

Následující tabulka shrnuje chování funkce Assert pro podporované kontrolní entity a typy instancí, včetně počtu výsledných instancí vytvořených v modulu pro každou kontrolní entitu a typu použitého u každé instance pro identifikaci.

Entita Počet vytykaných instancí Typ instance
Objekt .NET 1 (samotný objekt) Plně kvalifikovaná třída .NET
TypedXmlDocument 1-N TypedXmlDocument(y): Na základě vytvořených vazeb selektoru a obsahu dokumentu TypDokumentu.Selector

Ověřit objekt .NET

Modul pravidel nativně podporuje základní skalární typy a objekty .NET pro referenční typy. Procesing objektů .NET s ověřením je nejpřímější z metod zpracování.

V nástroji Microsoft Rules Composer můžete v rámci pravidla uplatnit objekt .NET.

  1. V nástroji Microsoft Rules Composer načtěte soubor XML, který obsahuje úložiště pravidel, na které chcete pracovat.

  2. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  3. V podokně PAK v části Akce přidejte integrovanou funkci Assert jako akci.

  4. V okně Průzkumník faktů vyberte třídy .NET.

  5. Na kartě Třídy .NET přetáhněte metodu konstruktoru pro objekt, který chcete, k argumentu v akci Assert.

    Microsoft Rules Composer přeloží metodu konstruktoru na volání CreateObject v definici pravidla.

    Poznámka:

    Přestože modul pravidel obsahuje funkci CreateObject , funkce se v nástroji Microsoft Rules Composer nezobrazí jako samostatná funkce.

Každý objekt je uplatněn do pracovní paměti jako samostatná instance objektu, což znamená, že každý predikát, který odkazuje na typ objektu, například IF Object.Property = 1, analyzuje instanci. Instanci lze také použít pro akce pravidel, které odkazují na typ, na základě výsledků podmínek pravidel.

Předpokládejme například, že máte následující pravidla:

Pravidlo 1

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

Pravidlo 2

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

V pravidle 1 se aktualizují pouze instance A s hodnotou 1 mají aktualizovánu svou vlastnost Status. V pravidle 2 se ale, pokud se podmínka vyhodnotí jako pravdivá, všechny instance A aktualizují. Ve skutečnosti platí, že pokud existuje více instancí B, instance A se aktualizují pokaždé, když se podmínka vyhodnotí jako true pro instanci B.

Potvrzení entity TypedXmlDocument

V nástroji Microsoft Rules Composer můžete v rámci pravidla uplatnit entitu TypedXmlDocument .

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně THEN v části Akce přidejte vestavěnou funkci Assert jako akci.

  3. V okně Průzkumník faktů vyberte schémata XML.

  4. Na kartě Schémata XML přetáhněte uzel, který chcete použít k argumentu v akci Assert.

Dokumenty XML jsou v podstatě text, ale hodnoty polí můžou být libovolný typ, který je založen na zadaném typu při vytváření pravidla. Pole jsou výrazy XPath, takže můžou vrátit sadu uzlů, což znamená, že první položka v sadě se použije jako hodnota.

Pokud je entita TypedXmlDocument uplatněna jako fakt, modul pravidel vytvoří podřízené instance TypedXmlDocument na základě selektorů definovaných v pravidle. Selektory si můžete představit jako způsob, jak izolovat uzly v dokumentu XML a pole jako identifikaci konkrétních položek v rámci selektoru. Modul pravidel seskupí všechna pole uvnitř jednoho selektoru jako objekt.

Selektory jsou také výrazy XPath. Když v Průzkumníku faktů vyberete uzel na kartě Schémata XML, Nástroj Microsoft Rules Composer automaticky vyplní vlastnost XPath Selector pro všechny uzly a vlastnost XPath Field pro jakýkoli uzel, který neobsahuje podřízené uzly. Případně můžete zadat vlastní výrazy XPath pro XPath Selector a XPath Pole v případě potřeby. Pokud selektor odpovídá více částem v dokumentu XML, více objektů tohoto typu se uplatní nebo odstraní z pracovní paměti systémového jádra pravidel.

V rámci stejného dokumentu můžete použít více selektorů. Tímto způsobem můžete zobrazit různé části dokumentu, například předpokládejme, že jeden oddíl je objednávka a další oddíl obsahuje dodací adresu. Mějte však na paměti, že vytvořené objekty jsou definovány řetězcem XPath, který je vytvořil. Pokud použijete jiný výraz XPath, výsledkem je jedinečná entita TypedXmlDocument , i když se výraz přeloží na stejný uzel.

Předpokládejme například, že máte následující KÓD XML:

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

Pokud používáte selektor /root/order nebo //order, přidají se do pracovní paměti modulu následující objekty:

Objekt 1

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

Objekt 2

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

V rámci každého selektoru XPath odkazuje na jednotlivá pole. Pokud tedy použijete selektor /root/order/item, order/item nebo item, přidají se do pracovní paměti modulu následující objekty se dvěma položkami pro Joea a dvě položky pro Jane:

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

Každý objekt má přístup ke třem polím: @name, @quantity a @cost. Můžete odkazovat na nadřazená pole, protože objekt je odkazem na původní dokument, například .. /@customer.

Modul pravidel může na pozadí převést hodnotu textového pole na libovolný z podporovaných typů prostřednictvím funkce XmlConvert . Tuto možnost můžete zadat nastavením typu v nástroji Microsoft Rules Composer. Pokud převod není možný, vyvolá modul výjimku. Můžete načíst typy bool a double pouze jako jejich odpovídající typy, konkrétně buď jako řetězce, nebo objekty.

Funkce vymazání

Chcete-li resetovat pracovní paměť a agendu instance pravidlového stroje, použijte funkci Clear v nástroji Microsoft Rules Composer. Další informace o pracovní paměti a agendě naleznete v tématu Optimalizace pravidlového enginu.

Resetování pracovní paměti a seznamu úkolů pro váš stroj pravidel

  1. V okně Průzkumník sady pravidel najděte a vyberte pravidlo, ve kterém chcete vymazat pracovní paměť a agendu pro váš modul pravidel.

  2. V podokně PAK, v části Akce, přidejte vestavěnou funkci Vymazat jako akci.

    Funkce Clear nepřijímá žádné argumenty.

Funkce Halt

Pokud chcete zastavit aktuální spuštění modulem pravidel, použijte funkci Halt v nástroji Microsoft Rules Composer.

Zastavení spouštění sady pravidel

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte pravidlo, ve kterém chcete zastavit spuštění sady pravidel.

  2. V podokně PAK v části Akce přidejte integrovanou funkci Zastavit jako akci.

Funkce Halt přebírá jeden Boolean argument. Pokud zadáte hodnotu jako true, modul pravidel vymaže agendu obsahující čekající kandidátní pravidla.

Metoda Ruleset.Execute je obálka kolem RuleEngine.Execute metoda a používá kód podobný následujícímu kódu:

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

Pokud použijete metodu Ruleset.Execute ke spuštění sady pravidel, modul pravidel vrátí řízení do metody Ruleset.Execute při spuštění funkce Halt. Metoda Ruleset.Execute odvolá fakta a vrátí řízení volajícímu. V takovém případě nelze pokračovat ve vykonávání zastavené sady pravidel.

Pokud však přímo použijete metodu RuleEngine.Execute ke spuštění sady pravidel, můžete obnovit zastavené spuštění sady pravidel spuštěním dalšího čekajícího pravidla voláním RuleEngine.Execute znovu za předpokladu, že jste neodvolali žádné objekty potřebné mezi těmito dvěma voláními.

Poznámka:

Metoda Ruleset.Execute ukládá instance stroje pravidel do mezipaměti pro lepší výkon. Pokud přímo používáte RuleEngine.Execute metoda, instance stroje pravidel nejsou uloženy do mezipaměti.

Následující ukázkový kód ukazuje, jak obnovit zastavené spuštění sady pravidel:

// 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);

Funkce Retract

Chcete-li odebrat objekty ze sady pravidel a z pracovní paměti stroje pravidel, použijte funkci Odvolání v nástroji Microsoft Rules Composer.

Odvolání objektu .NET

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK v části Akce přidejte vestavěnou funkci Retract jako akci.

  3. V okně Průzkumník faktů vyberte třídy .NET.

  4. Z karty Třídy .NET přetáhněte požadovanou třídu, nikoli sestavení nebo metodu, do argumentu parametru Zpětné.

    Pokud přetáhnete metodu do funkce Odvolání , modul se pokusí odvolat objekt vrácený metodou.

Odvolání objektu .NET má následující dopad:

  • Akce na agendě, které používají objekty, se z programu odeberou.

    Poznámka:

    Jiné akce výše na pořadu jednání již mohly být provedeny před použitím funkce Zrušení.

  • Pravidla, která používají objekt v predikátu, mají své akce odstraněny ze seznamu úloh, pokud na seznamu existují nějaké akce.

  • Modul už objekt nevyhodnocuje.

Stažení entity nebo entit TypedXmlDocument

Můžete odvolat původní entitu TypedXmlDocument, která byla uplatněna do pravidlového systému, nebo můžete odvolat jednu z podřízených entit TypedXmlDocument vytvořených z nadřazené entity XmlDocument.

Předpokládejme, že máte následující příklad XML:

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

Můžete buď odvolat entitu TypedXmlDocument přidruženou k objektu order , nebo můžete odvolat jednu nebo obě entity TypedXmlDocument přidružené k objektu orderline . Všechny entity TypedXmlDocument jsou přidružené k entitě nejvyšší úrovně TypedXmlDocument, která byla původně prohlášena, a nikoli s entitou TypedXmlDocument, která se zobrazuje nad tímto vrcholovým uzlem TypedXmlDocument ve stromové hierarchii XML.

Produkt je například entitouTypedXmlDocument pod objektem orderline a je spojena s entitou TypedXmlDocument pro objednávku, nikoli s entitou TypedXmlDocument pro orderline. Ve většině případů není toto rozlišení důležité. Pokud však odvoláte objekt objednávky, položky objednávky a objekty produktů jsou také odvolány. Pokud odvoláte objekt orderline , bude odvolán pouze tento objekt, nikoli objekt produktu .

Motor funguje pouze s instancemi objektů, které jsou instancemi TypedXmlDocument, a které motor vytvořil při prvotním založení entity TypedXmlDocument. Pokud vytváříte další uzly, například uzly na stejné úrovni pro uzel, který byl vybrán pomocí selektoru v sadě pravidel, tyto uzly se nevyhodnocují v pravidlech, pokud pro ně nejsou vytvořeny a assertovány entity TypedXmlDocument . Pokud potvrdíte tyto nové instance nižší úrovně TypedXmlDocument, engine vyhodnocuje instance v pravidlech, ale entita TypedXmlDocument nejvyšší úrovně o nich nemá znalosti. Při stažení TypedXmlDocument nejvyšší úrovně nejsou nové, nezávisle uplatněné entity TypedXmlDocument automaticky staženy. V důsledku toho, pokud jsou vytvořeny nové uzly, proveďte retrakci a reaplikaci na plném XmlDocument, což je typický a nejjednodušší krok, který je potřeba provést.

TypedXmlDocument třída poskytuje užitečné metody, které můžete volat v rámci vlastního člena .NET jako součást akce. Tyto metody zahrnují schopnost získat XmlNode přidružené k TypedXmlDocument nebo nadřazenému TypedXmlDocument.

Odvolejte entitu TypedXmlDocument nejvyšší úrovně

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK, pod sekcí Akce, přidejte vestavěnou funkci Zrušení jako akci.

  3. V okně Průzkumník faktů vyberte XML schémata.

  4. Na kartě Schémata XML přetáhněte uzel nejvyšší úrovně schématu do argumentu pro funkci Odvolání.

    Tento horní uzel končí v rozšíření .xsd a představuje kořenový uzel dokumentu, nikoli uzel prvku dokumentu. Uzel má / selektor, který odkazuje na počáteční TypedXmlDocument. Při odvolání nadřazené TypedXmlDocument jsou všechny podřízené entity TypedXmlDocument přidružené k TypedXmlDocument odebrány z pracovní paměti, včetně všech entit TypedXmlDocument vytvořených voláním funkce Assert, na základě selektorů použitých v sadě pravidel.

Zrušení podřízené entity TypedXmlDocument

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně THEN v části Akce přidejte vestavěnou funkci Odvolat jako akci.

  3. V okně Průzkumník faktů vyberte schémata XML.

  4. Na záložce XML schémat přetáhněte podřízený uzel do argumentu pro funkci Zpět.

Funkce RetractByType

Chcete-li odebrat všechny objekty se zadaným typem z pracovní paměti stroje pravidel, použijte funkci RetractByType v nástroji Microsoft Rules Composer. Tato funkce se liší od funkce Zrušit, která odebere pouze konkrétní položky s určitým typem.

Zrušit všechny objekty .NET určitého typu

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK v části Akce přidejte vestavěnou funkci RetractByType jako akci.

  3. V okně Průzkumník faktů vyberte třídy .NET.

  4. Přetáhněte třídu z karty .NET třídy do argumentu funkce RetractByType.

Odvolat všechny entity TypedXmlDocument s konkrétním typem

Funkce RetractByType odebere všechny TypedXmlDocument entity se stejným DocumentType.Selector.

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK v části Akce přidejte vestavěnou funkci RetractByType jako akci.

  3. V okně Průzkumník faktů vyberte schémata XML.

  4. Na kartě Schémata XML přetáhněte příslušný uzel do funkce RetractByType.

Konzistentní s funkcí Odvolání, pokud používáte funkci RetractByType na kořenovém uzlu dokumentu, nejenže tato akce odvolá všechny entity TypedXmlDocument s tímto DocumentType, ale také všechny podřízené entity TypedXmlDocument nebo XmlNode v hierarchii stromu spojené k těmto nadřazeným entitám TypedXmlDocument.

Funkce Reassert

Chcete-li volat funkci Assert u objektu, který již existuje v pracovní paměti modulu, použijte funkci Reassert v nástroji Microsoft Rules Composer. Chování je ekvivalentní k vydání příkazu Odvolání objektu následovaného příkazem Assert .

Pokud například použijete funkci Reassert u objektu .NET, modul pravidel provede následující kroky:

  1. Odvolání objektu .NET z pracovní paměti

  2. Odeberte všechny akce v programu pro pravidla, která objekt používají v predikátu nebo akci.

  3. Vyhodnoťte objekt .NET zpět do pracovní paměti a vyhodnoťte ho jako nově assertovaný objekt.

  4. Znovu vyhodnocujte všechna pravidla, která objekt používají v predikátu, a podle potřeby přidejte akce těchto pravidel do programu.

  5. Přidejte akce zpět do agendy pro všechna pravidla, která se dříve vyhodnotila jako pravdivá, a používala objekt pouze ve svých akcích.

Znovu potvrdit objekt .NET

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně THEN v části Akce přidejte jako akci vestavěnou funkci Reassert.

  3. V okně Průzkumník faktů vyberte třídy .NET.

  4. Z karty .NET Classes přetáhněte třídu do argumentu funkce Reassert.

Znovu potvrďte entitu TypedXmlDocument

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK v části Akce přidejte integrovanou funkci Reassert jako akci.

  3. V okně Průzkumník faktů vyberte schémata XML.

  4. Na kartě XML Schémata přetáhněte uzel entity, který chcete k argumentu v rámci funkce Reassert.

Pokud znovu uplatníte entitu TypedXmlDocument nejvyšší úrovně, podřízené entity TypedXmlDocument, které byly vytvořeny při prvním uplatnění téže entity TypedXmlDocument nejvyšší úrovně, se mohou chovat jinak v závislosti na stavu každé podřízené entity TypedXmlDocument.

Pokud je například nová nebo existující podřízená entita "modifikovaná", což znamená, že nejméně jedno pole bylo změněno v sadě pravidel pomocí akce, provede se u této podřízené entity funkce Assert nebo funkce Reassert. Všechny existující potomky, které nejsou špinavé, zůstanou v operační paměti.

Poznámka:

Uzel není označený jako znečištěný externími operacemi, které modul nezjistí, například když externí aplikace programově přidává, odstraňuje nebo aktualizuje daný uzel.

Následující příklad ukazuje zjednodušený scénář, který popisuje chování podřízených entit při opětovném potvrzení nadřazené entity. Předpokládejme, že máte v pracovní paměti následující entity TypedXmlDocument : Parent, Child1, Child2 a Child3.

  • Nadřazený objekt je entita nejvyšší úrovně TypedXmlDocument.
  • Každý potomek obsahuje pole s názvem ExampleField, kde je hodnota nastavena na 1, například Child1.ExampleField = 1.

Předpokládat, že akce pravidla provádí následující operace na podřízených entitách:

  • Hodnota ExampleField pro Child2 se aktualizuje z 1 na 0.
  • Uživatelský kód odstraní Child3.
  • Uživatelský kód přidá novou podřízenou entitu TypedXmlDocument s názvem NewChild do nadřazeného objektu.

Následující příklad ukazuje novou reprezentaci objektů v pracovní paměti:

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

Předpokládejme, že znovu potvrdíte Nadřazenou entitu, což má za následek následující chování podřízených entit:

  • Child2 se znovu sestaví, protože je teď po aktualizaci pole špinavé.
  • Potomek 3 je vyřazen z pracovní paměti.
  • NewChild je vložen do pracovní paměti.
  • Child1 zůstává beze změny v pracovní paměti, protože nebyl aktualizován předtím, než byl nadřazený objekt znovu potvrzen.

Funkce aktualizace

Chcete-li znovu sestavit objekt do modulu pravidel pro opětovné hodnocení na základě nových dat a stavu, použijte funkci Update v nástroji Microsoft Rules Composer. Objekt může mít typ třídy .NET nebo TypedXmlDocument . Pomocí funkce Update můžete také zlepšit výkon engine a zabránit scénářům nekonečné smyčky.

Důležité

Výchozí maximální počet smyček pro opakované hodnocení pravidel je 2^32, takže pro určitá pravidla může spuštění sady pravidel trvat dlouhou dobu. Pokud chcete snížit počet smyček, změňte vlastnost Maximální hloubka smyčky provádění ve verzi sady pravidel.

Aktualizace objektu .NET

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK v části Akce přidejte integrovanou funkci Update jako akci.

  3. V okně Průzkumník faktů vyberte třídy .NET.

  4. Na kartě Třídy .NET přetáhněte třídu do argumentu funkce Update.

Příkaz Assert se obvykle používá k umístění nového objektu do pracovní paměti modulu pravidel a použití funkce Update k aktualizaci již existujícího objektu v pracovní paměti. Když jako fakt použijete nový objekt, modul znovu vyhodnocuje podmínky ve všech pravidlech. Když však aktualizujete existující objekt, modul znovu vyhodnotí pouze podmínky, které používají aktualizovaný fakt, a přidá akce do programu, pokud se tyto podmínky vyhodnotí jako true.

Předpokládejme například, že máte následující pravidla a že objekty s názvem ItemA a ItemB již existují v pracovní paměti.

  • Pravidlo 1 vyhodnotí vlastnost ID v ItemA, nastaví vlastnost ID v ItemB a po změně znovu sestaví ItemB . Při opětovném sestavení ItemB modul zachází s ItemB jako s novým objektem a modul znovu vyhodnocuje všechna pravidla, která v predikátech nebo akcích používají ItemB . Toto chování zajišťuje, že modul znovu vyhodnocuje pravidlo 2 proti nové hodnotě v ItemB.Id , jak je nastaveno v pravidle 1.

    Pravidlo 1

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • Pravidlo 2 může selhat při prvním vyhodnocení, ale vyhodnotí se jako true během druhého vyhodnocení.

    Pravidlo 2

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

Schopnost znovu vložit objekty do pracovní paměti vám dává explicitní kontrolu nad chováním ve scénářích dopředného řetězení. Tento příklad však odhalí vedlejší účinek znovu prosazení, kde pravidlo 1 je také znovu zhodnoceno. Při ItemA.Id beze změny se pravidlo 1 znovu vyhodnotí jako true a akce Assert(ItemB) se znovu aktivuje. V důsledku toho pravidlo vytvoří nekonečnou smyčku.

Zabránit nekonečným smyčkám

Musíte být schopni znovu sestavit objekty bez vytváření nekonečných smyček. Abyste se takovým scénářům vyhnuli, můžete použít funkci Update . Podobně jako funkce Reassert, funkce Update provádí funkce Retract a Assert u přidružených instancí objektů, které se mění akcemi pravidla, ale s následujícími klíčovými rozdíly:

  • Akce pro pravidla zůstávají na pořadu jednání, pokud je typ instance používán pouze v akcích, nikoli v predikátech.

  • Pravidla, která používají pouze typ instance v akcích, se znovu nevyhodnotují.

Výsledkem je, že pravidla, která používají typy instancí, buď pouze v predikátech, nebo v predikátech i akcích, se znovu zhodnocují a akce pravidel se podle potřeby přidají do programu.

Změnou předchozího příkladu na použití funkce Update se můžete ujistit, že modul znovu vyhodnocuje pouze pravidlo 2 , protože podmínka pro pravidlo 2 používá ItemB. Modul znovu nevyhodnotuje pravidlo 1 , protože PoložkaB se používá pouze v akcích pro pravidlo 1*, čímž se eliminuje scénář smyčky.

Pravidlo 1

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

Pravidlo 2

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

I přes použití funkce Update tímto způsobem stále existuje možnost vytváření smyčkových scénářů. Představte si například následující pravidlo:

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

Predikát používá ItemA, takže modul znovu vyhodnocuje pravidlo při zavolání aktualizace v ItemA. Pokud se hodnota pro ItemA.Id jinde nezmění, pravidlo 1 se bude dál vyhodnocovat jako true, což způsobí opětovné volání aktualizace v ItemA.

Jako návrhář pravidel musíte zajistit, abyste se vyhnuli vytváření takových smyček. Vhodný přístup k vyřešení tohoto problému se liší v závislosti na povaze pravidel.

Následující příklad ukazuje jednoduchý způsob, jak vyřešit problém v předchozím příkladu přidáním kontroly itemA.Value, která zabrání pravidlo vyhodnotit jako true znovu po prvním spuštění akce pravidla.

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

Aktualizace entity TypedXmlDocument

  1. V okně Průzkumníka sady pravidel vyhledejte a vyberte požadované pravidlo.

  2. V podokně PAK v části Akce přidejte integrovanou funkci Update jako akci.

  3. V okně Průzkumník faktů vyberte schémata XML.

  4. Na kartě XML Schémata přetáhněte uzel entity, který chcete, k argumentu ve funkci Update.

Předpokládejme například, že máte následující pravidla:

  • Pravidlo 1 vyhodnotí celkový počet položek ve zprávě nákupní objednávky.

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • Pravidlo 2 nastaví stav "Vyžaduje schválení", pokud je celkový počet větší nebo roven 10.

    Pravidlo 2

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

Pokud jako vstup do této sady pravidel předáte následující zprávu nákupní objednávky, zjistíte, že stav není nastaven na "Vyžaduje schválení", i když TotalCount je 14. K tomuto chování dochází, protože pravidlo 2 je vyhodnoceno pouze na začátku, když je hodnota TotalCount 0. Pravidlo se nevyhodnocuje pokaždé, když se aktualizuje TotalCount .

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

Pokud chcete, aby modul pokaždé, když se aktualizuje TotalCount , znovu vyhodnocoval podmínky, musíte volat funkci Update na nadřazený uzel (Items) pro aktualizovaný uzel (TotalCount). Pokud změníte pravidlo 1 následujícím způsobem a otestujete pravidlo ještě jednou, je pole Stav nastaveno na "Vyžaduje schválení":

Pravidlo 1 (aktualizováno)

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)