Sdílet prostřednictvím


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

Platí pro: Azure Logic Apps (Standard)

Důležité

Tato funkce je ve verzi Preview a podléhá dodatečným podmínkám použití pro microsoft Azure Preview.

Tato příručka popisuje, 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ří funkce Assert, Clear, Halt, Retract, RetractByType, Reassert a Update pro entity .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. Modul zpracovává každou instanci objektu podle podmínek a akcí, které jsou zapsány proti typu instance pomocí fází akce řešení konfliktů shody.

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.

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

Assert a .NET object

Modul pravidel nativně podporuje základní skalární typy a objekty .NET pro referenční typy. Asserted .NET object processing is the most přímočarý of the processing types.

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 argument v akci Assert.

    Microsoft Rules Composer přeloží konstruktor metody do CreateObject volání 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. Instance je také k dispozici pro akce pravidla, které odkazují na typ na základě výsledků podmínek pravidla.

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. Pokud se ale podmínka vyhodnotí jako pravdivá, v pravidle 2 se 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.

Assert a TypedXmlDocument entity

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ě PAK v části Akce přidejte integrovanou 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 pole XPath pro libovolný 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 odvolá z pracovní paměti stroje 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 pořadí, 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. Bool a dvojité typy můžete načíst pouze jako odpovídající typ, a to buď řetězce, nebo objekty.

Funkce Clear

Chcete-li obnovit pracovní paměť a program pro instanci stroje pravidel, použijte funkci Clear v nástroji Microsoft Rules Composer. Další informace o pracovní paměti a programu programu naleznete v tématu Optimalizace stroje pravidel.

Resetování pracovní paměti a programu pro modul pravidel

  1. V okně Průzkumníka pravidel najděte a vyberte pravidlo, ve kterém chcete vymazat pracovní paměť a program pro modul pravidel.

  2. V podokně PAK v části Akce přidejte integrovanou 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 logický argument. Pokud zadáte hodnotu jako true, modul pravidel vymaže program obsahující čekající kandidátské 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 Ruleset.Execute metoda ke spuštění sady pravidel, vrátí modul pravidel řízení do Ruleset.Execute metoda při spuštění funkce Halt. Metoda Ruleset.Execute odvolá fakta a vrátí řízení volajícímu. V takovém případě se zastavení spuštění sady pravidel nedá obnovit.

Pokud však přímo použijete RuleEngine.Execute metoda ke spuštění sady pravidel, můžete obnovit zastavené spuštění sady pravidel s dalším čekající pravidlo spuštěním volání 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 předdefinované funkce Odvolání jako akci.

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

  4. Na kartě Třídy .NET přetáhněte požadovanou třídu, nikoli sestavení nebo metodu, do argumentu pro zatažení parametru.

    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 vyšší v programu již mohly být provedeny před použitím funkce Odvolání .

  • Pravidla, která používají objekt v predikátu, mají jejich akce odebrány z programu, pokud v programu existují nějaké akce.

  • Modul už objekt nevyhodnocuje.

Odvolání entity nebo entit TypedXmlDocument

Můžete odvolat původní entitu TypedXmlDocument, která byla uplatněna do stroje pravidel, 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ě TypedXmlDocument nejvyšší úrovně, která byla původně uplatněna, nikoli s entitou TypedXmlDocument, která se zobrazí nad tímto uzlem TypedXmlDocument ve stromové hierarchii XML.

Produkt je například entita TypedXmlDocument pod objektem orderline a je přidružena k entitě TypedXmlDocument pro objednávku, nikoli Entity TypedXmlDocument pro orderline. Ve většině případů není toto rozlišení důležité. Pokud však odvoláte objekt objednávky , řádek objednávek a objekty produktu jsou také odvolány. Pokud odvoláte objekt orderline , bude odvolán pouze tento objekt, nikoli objekt produktu .

Modul funguje pouze s instancemi objektů, které jsou TypedXmlDocument instance, které modul vytvořil při počátečním uplatnění 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 tyto nové, nižší úrovně TypedXmlDocument instance, modul vyhodnotí instance v pravidlech, ale entita TypedXmlDocument nejvyšší úrovně o nich nemá znalosti. Při odvolání typedXmlDocument nejvyšší úrovně, nový, nezávisle asserted TypedXmlDocument entity nejsou automaticky odvolána. V důsledku toho, pokud jsou vytvořeny nové uzly, proveďte odvolání a opětovné sestavení v 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é typedXmlDocument nebo nadřazený TypedXmlDocument.

Odvolání entity TypedXmlDocument nejvyšší úrovně

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

  2. V podokně PAK v části Akce přidejte předdefinované funkce Odvolání jako akci.

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

  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 všechny podřízené entity TypedXmlDocument přidružené k TypedXmlDocument jsou odebrány z pracovní paměti, včetně všech TypedXmlDocument entity vytvořené voláním Assert funkce, na základě selektorů použitých v sadě pravidel.

Odvolání podřízené 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 předdefinované funkce Odvolání jako akci.

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

  4. Na kartě Schémata XML přetáhněte podřízený uzel do argumentu pro funkci Odvolání.

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 Odvolání , která odebere pouze konkrétní položky s určitým typem.

Odvolání všech objektů .NET s určitým typem

  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 RetractByType 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 pro funkci RetractByType.

Odvolání všech entit TypedXmlDocument s konkrétním typem

Funkce RetractByType odebere všechny entity TypedXmlDocument se stejným typem 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 integrovanou 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, a to nejen, že tato akce odvolá všechny entity TypedXmlDocument s tímto TypeType, ale také všechny podřízené entity TypedXmlDocument nebo XmlNode v hierarchii stromu přidružené 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řečetli jste akce programu pro všechna pravidla, která se dříve vyhodnotila jako pravdivá , a použila objekt pouze v jejich akcích.

Opětovné sestavení 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 Reassert 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 pro funkci Reassert.

Opětovné sestavení 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 Reassert jako akci.

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

  4. Na kartě Schémata XML přetáhněte uzel entity, který chcete do argumentu použít ve funkci Reassert.

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

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

Poznámka:

Uzel není označený jako nezašpiněný z externích operací, o kterých modul například prostřednictvím kódu programu 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 sestavení 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 TypedXmlDocument nejvyšší úrovně.
  • Každé podřízené pole obsahuje pole s názvem ExampleField, kde je hodnota nastavena na hodnotu 1, Child1.ExampleField například = 1.

Předpokládejme, že akce pravidla provádí následující operace s podřízenými entitami:

  • Hodnota ExampleField pro Child2 se aktualizuje z 1 na 0.
  • Uživatelský kód odstraní podřízenou 3.
  • 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 sestavíte nadřazenou entitu, která 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é.
  • Podřízený prvek 3 je odvolána z pracovní paměti.
  • NewChild se vytvrdí do pracovní paměti.
  • Podřízená položka 1 zůstane v pracovní paměti beze změny, protože nebyla aktualizována před opětovným sestavením nadřazeného objektu.

Funkce Update

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 motoru 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 jako akci integrovanou funkci Update .

  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 pro funkci 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 sestavit objekty do pracovní paměti vám dává explicitní kontrolu nad chováním ve scénářích přesměrování řetězení. Tento příklad však odhalí vedlejší účinek z opětovného vytvoření, kde se znovu zhodnotí pravidlo 1 . 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 situaci smyčky.

Prevence nekonečných smyček

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 provádí funkce Update 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í v programu v případě, že se typ instance používá pouze v akcích, nikoli predikáty.

  • 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 existuje možnost vytváření scénářů smyčky. 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 scénářů smyčky. 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 jako akci integrovanou funkci Update .

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

  4. Na kartě Schémata XML přetáhněte uzel entity, který chcete použít 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, všimněte si, že stav není nastavený na "Vyžaduje schválení", i když je TotalCount 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)