Vezérlőfüggvények hozzáadása műveletekhez a szabályok végrehajtásának optimalizálásához a Microsoft Rules Composer használatával

A következőkre vonatkozik: Azure Logic Apps (Standard)

Ez az útmutató bemutatja, hogyan optimalizálhatja a szabályok végrehajtását úgy, hogy vezérlőfüggvényeket ad hozzá a szabályok műveleteihez a Microsoft Rules Composer használatával. A vezérlőfüggvények segítségével az alkalmazás vagy a szabálykészlet szabályozhatja a szabálymotor munkamemóriában lévő tényeket. Ezek a függvények közé tartoznak a .NET objektum és a tényként használható TypedXmlDocument entitások Assert, Clear, Halt, Retract, RetractByType, Reassert, és Update függvényei. A munkamemória tényeinek megléte határozza meg a motor által kiértékelt feltételeket és a végrehajtott műveleteket.

Előfeltételek

  • Töltse le és telepítse a Microsoft Rules Composert.

  • A használni kívánt szabálykészletet tartalmazó XML-fájl.

    Tények hozzáadásához adja meg az értékeiket a RuleSet Explorer ablakból rámutató XML-dokumentumokban. Ténykészítővel is elláthatja a szabálymotort egy .NET-objektumokat tényként tartalmazó tömbdel. További információ: Ténykészítők és lekérdezők létrehozása.

Assert függvény

Ha objektumpéldányokat szeretne hozzáadni a szabálymotor munkamemóriához, használja az Assert függvényt a Microsoft Rules Composerben. A motor az egyes objektumpéldányokat a példány típusára írt feltételeknek és műveleteknek megfelelően dolgozza fel az egyezés-ütközés feloldási művelet fázisaival.

Az alábbi táblázat összefoglalja az Assert függvény viselkedését a támogatott igazolt entitások és példánytípusok esetében, beleértve az egyes igazolt entitások motorjában létrehozott példányok számát és az azonosításhoz alkalmazott típust az egyes példányokhoz.

Entitás Érvényesített példányok száma Példány típusa
.NET-objektum 1 (maga az objektum) Teljes mértékben minősített .NET-osztály
TypedXmlDocument 1-N TypedXmlDocument(ek): A létrehozott választókötések és a dokumentum tartalma alapján DokumentumTípus.Kiválasztó

.NET-objektum érvényesítése

A szabálymotor natív módon támogatja az alapszintű .NET skaláris típusokat és objektumokat a referenciatípusokhoz. Az állítással történő .NET-objektumfeldolgozás a legegyszerűbb a feldolgozási típusok közül.

A Microsoft Rules Composerben a .NET-objektumokat egy szabályon belül is érvényesítheti.

  1. A Microsoft Rules Composerben töltse be a használni kívánt szabálytárolót tartalmazó XML-fájlt.

  2. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  3. Az THEN panel Műveletek csoportjában adja hozzá műveletként az Assert beépített függvényt.

  4. A Tényekkezelő ablakban válassza a .NET-osztályok lehetőséget.

  5. A .NET-osztályok lapon húzza át az objektum konstruktormetódusát az Assert művelet argumentumára, ahol használni szeretné.

    A Microsoft Rules Composer a konstruktor metódust a szabálydefinícióban lévő CreateObject-hívásra fordítja le.

    Megjegyzés

    Bár a szabálymotor rendelkezik CreateObject függvénnyel, a függvény nem jelenik meg külön függvényként a Microsoft Rules Composerben.

Minden objektumot külön objektumpéldányként állít be a munkamemória, ami azt jelenti, hogy minden olyan predikátum, amely az objektum típusára hivatkozik, például IF Object.Property = 1, elemzi a példányt. A példány a típusra hivatkozó szabályműveletek számára is elérhető a szabályfeltételek eredményei alapján.

Tegyük fel például, hogy a következő szabályokkal rendelkezik:

1. szabály

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

2. szabály

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

Az 1. szabályban csak az 1 értékű A példányok frissülnek az Állapot tulajdonsággal. A 2. szabályban azonban, ha a feltétel értéke igaz, minden A-példány állapota frissül. Ha több B példány is létezik, az A példányok minden alkalommal frissülnek, amikor a feltétel igaznakbizonyul egy B-példány esetében.

TypedXmlDocument entitás érvényesítése

A Microsoft Rules Composerben egy TypedXmlDocument entitást egy szabályból állíthat be.

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá műveletként az Assert beépített függvényt.

  3. A Tényekkezelő ablakban válassza az XML-sémák lehetőséget.

  4. Az XML-sémák lapon húzza a kívánt csomópontot az Argumentum művelet argumentumára.

Az XML-dokumentumok alapvetően szövegesek, de a mezőértékek bármilyen típusúak lehetnek, ami a szabály létrehozásakor megadott típuson alapul. A mezők XPath-kifejezések, ezért csomópontkészletet adhatnak vissza, ami azt jelenti, hogy a készlet első elemét használják értékként.

Ha egy TypedXmlDocument entitás tényként van érvényesítve, a szabálymotor typedXmlDocument gyermekpéldányokat hoz létre a szabályban meghatározott választók alapján. A szelekciók úgy is felfoghatók, mint az XML-dokumentumok csomópontjainak kiválasztására szolgáló eszközök, a mezők pedig a szelekciók konkrét elemeinek azonosítására. A szabálymotor az összes mezőt objektumként csoportosítja egy választóban.

A választók szintén XPath-kifejezések. Amikor kijelöl egy csomópontot az XML-sémák lapon, a Microsoft Rules Composer automatikusan kitölti az XPath Selector tulajdonságot az összes csomóponthoz és az XPath Mező tulajdonságot minden olyan csomóponthoz, amely nem tartalmaz gyermekcsomópontokat. Másik lehetőségként megadhatja saját XPath-kifejezéseit az XPath-választóhoz és az XPath-mezőhöz, ha szükséges. Ha a választó egyezik az XML-dokumentum több részével, a rendszer több ilyen típusú objektumot állít be vagy von vissza a szabálymotor munkamemóriából.

Ugyanazon a dokumentumon belül több választót is használhat. Így a dokumentum különböző részeit tekintheti meg, például tegyük fel, hogy az egyik szakasz a rendelés, a másik pedig a szállítási címet tartalmazza. Ne feledje azonban, hogy a létrehozott objektumokat az őket létrehozó XPath-sztring határozza meg. Ha másik XPath-kifejezést használ, az eredmény egy egyedi TypedXmlDocument entitás, még akkor is, ha a kifejezés ugyanahhoz a csomóponthoz lesz feloldva.

Tegyük fel például, hogy a következő XML-fájllal rendelkezik:

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

Ha a szelektort /root/order vagy //order használja, a rendszer a következő objektumokat adja hozzá a motor munkamemóriájához:

1. objektum

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

2. objektum

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

Az egyes választókban az XPaths az egyes mezőkre hivatkozik. Ha tehát a választót /root/order/item, //order/item vagy //item használja, a következő objektumok kerülnek a motor munkamemóriájába: két elem Joe számára és két elem Jane számára.

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

Minden objektum három mezőt érhet el: @name, @quantity és @cost. Hivatkozhat a szülőmezőkre, mert az objektum az eredeti dokumentum hivatkozása, például .. /@customer.

A színfalak mögött a szabálymotor az XmlConvert függvényen keresztül bármely támogatott típussá konvertálhat szövegmező-értéket. Ezt a beállítást a Microsoft Rules Composerben a típus beállításával adhatja meg. Ha az átalakítás nem lehetséges, a motor kivételt jelez. bool és double típusokat csak saját típusukban lehet lekérni, akár mint stringek, akár mint objektumok.

Függvény törlése

A szabálymotor-példány munkamemóriájának és napirendjének alaphelyzetbe állításához használja a Clear függvényt a Microsoft Rules Composerben. A munkamemóriával és a napirenddel kapcsolatos további információkért tekintse meg a Szabályok motoroptimalizálás című témakört.

A szabálymotor munkamemóriának és napirendjének alaphelyzetbe állítása

  1. A RuleSet Explorer ablakban keresse meg és válassza ki azt a szabályt, amelyből törölni szeretné a szabálymotor munkamemória és napirendjét.

  2. Az THEN panel Műveletek csoportjában adja hozzá műveletként a Beépített függvény törlése parancsot.

    A Clear függvény nem vesz fel argumentumokat.

Halt függvény

Ha le szeretné állítani az aktuális végrehajtást a szabálymotorral, használja a Microsoft Rules Composer Stop függvényét.

Szabálykészlet végrehajtásának leállítása

  1. A RuleSet Explorer ablakban keresse meg és válassza ki azt a szabályt, amelyben le szeretné állítani a szabálykészlet végrehajtását.

  2. THEN panelen, a Műveletek csoport alatt adja hozzá a Halt beépített függvényt műveletként.

A Halt függvény egyetlen logikai argumentumot használ. Ha az értéket igaznak adja meg, a szabálymotor törli az agendát, amely a függőben lévő jelölt szabályokat tartalmazza.

A Ruleset.Execute metódus egy burkoló a RuleEngine.Execute metódus körül, és az alábbi kódhoz hasonló kódot használ:

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

Ha a Ruleset.Execute metódust használja egy szabálykészlet végrehajtásához, a szabálymotor visszaadja a szabálykészlet.Execute metódus vezérlését a Halt függvény végrehajtásakor. A Ruleset.Execute metódus visszavonja a tényeket, és visszaadja az irányítást a hívónak. Ebben az esetben a leállított szabálykészlet végrehajtása nem folytatható.

Ha azonban közvetlenül a RuleEngine.Execute metódust használja a szabálykészlet végrehajtásához, folytathatja a leállított szabálykészlet végrehajtását a következő függőben lévő szabály kilövésével a RuleEngine.Execute ismételt meghívásával, feltéve, hogy nem vont vissza semmilyen objektumot a két hívás között.

Megjegyzés

A Ruleset.Execute metódus gyorsítótárazza a szabálymotor-példányokat a jobb teljesítmény érdekében. Ha közvetlenül a RuleEngine.Execute metódust használja, a szabálymotor-példányok nem lesznek gyorsítótárazva.

Az alábbi mintakód bemutatja, hogyan folytathatja a leállított szabálykészlet végrehajtását:

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

Visszavonási függvény

Ha objektumokat szeretne eltávolítani egy szabálykészletből és a szabálymotor munkamemóriából, használja a Visszavonás függvényt a Microsoft Rules Composerben.

.NET-objektum visszavonása

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített visszavonás függvényt műveletként.

  3. A Tényekkezelő ablakban válassza a .NET-osztályok lehetőséget.

  4. A .NET-osztályok lapon húzza a kívánt osztályt, nem pedig a szerelvényt vagy metódust a Visszavonás paraméter argumentumába.

    Ha egy metódust a Visszahúzás függvénybe húz, a motor megpróbálja visszavonni a metódus által visszaadott objektumot.

A .NET-objektumok visszavonása a következő hatással van:

  • Az objektumokat használó napirendi műveletek törlődnek a napirendről.

    Megjegyzés

    Előfordulhat, hogy a napirenden magasabb szintű egyéb műveletek már végrehajtottak a Visszavonás függvény használata előtt.

  • Az objektumot predikátumban használó szabályok eltávolítják azokat a napirendről, ha bármilyen művelet szerepel a napirenden.

  • A motor már nem értékeli ki az objektumot.

TypedXmlDocument entitás vagy entitások visszavonása

Visszavonhatja a szabálymotorban érvényesített eredeti TypedXmlDocument entitást, vagy visszavonhatja a szülő XmlDocument entitásból létrehozott TypedXmlDocument gyermekentitások egyikét.

Tegyük fel, hogy az alábbi XML-példával rendelkezik:

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

Visszavonhatja a rendelésobjektumhoz társított TypedXmlDocument entitást, vagy visszavonhatja az orderline objektumhoz társított TypedXmlDocument entitások egyikét vagy mindkettőt. Minden TypedXmlDocument entitás az eredetileg érvényes legfelső szintű TypedXmlDocument entitáshoz van társítva, nem pedig a TypedXmlDocument entitáshoz, amely az XML-fahierarchiában a legfelső szintű TypedXmlDocument csomópont felett jelenik meg.

A termék például egy TypedXmlDocument entitás az orderline objektum alatt, és a TypedXmlDocument entitáshoz van társítva a rendelés esetében, nem pedig az orderlineTypedXmlDocument entitásához. A legtöbb esetben ez a megkülönböztetés nem fontos. Ha azonban visszavonja a rendelési objektumot, a rendeléssor és a termékobjektumok is vissza lesznek vonva. Ha visszavonja az orderline objektumot, csak az objektum lesz visszavonva, a termékobjektum nem.

A motor csak a TypedXmlDocument objektumpéldányaival működik és azokat követi nyomon, amelyek akkor jöttek létre, amikor a motor a TypedXmlDocument entitást kezdetben állította. Ha további csomópontokat hoz létre, például testvércsomópontokat egy olyan csomóponthoz, amelyet a szabálykészlet egyik választója választott ki, ezek a csomópontok nem lesznek kiértékelve szabályokban, kivéve, ha a TypedXmlDocument entitások létrejönnek és érvényesítik őket. Ha ezeket az új, alacsonyabb szintű TypedXmlDocument példányokat állítja be, a motor kiértékeli a szabályok példányait, de a legfelső szintű TypedXmlDocument entitás nem rendelkezik velük kapcsolatos ismeretekkel. A legfelső szintű TypedXmlDocument visszavonásakor az új, egymástól függetlenül érvényes TypedXmlDocument entitások nem lesznek automatikusan visszavonva. Ennek eredményeképpen, ha új csomópontok jönnek létre, végezzen visszavonást és újraszerelést a teljes XmlDocumenten, amely a tipikus és legegyértelműbb lépés.

A TypedXmlDocument osztály hasznos metódusokat biztosít, amelyeket egy egyéni .NET-tagon belül egy művelet részeként hívhat meg. Ezek a metódusok tartalmazzák annak képességét, hogy megszerezzük az XmlNode-t, amely a TypedXmlDocument-hez vagy a szülő TypedXmlDocument-hez van társítva.

A legfelső szintű TypedXmlDocument entitás visszavonása

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített visszavonás függvényt műveletként.

  3. A Tényekkezelő ablakban válassza az XML-sémák lehetőséget.

  4. Az XML-sémák lapon húzza a séma legfelső szintű csomópontját a Visszavonás függvény argumentumába.

    Ez a legfelső csomópont az .xsd kiterjesztéssel végződik, és a dokumentum gyökércsomópontját jelöli, nem pedig a dokumentumelem-csomópontot. A csomópont rendelkezik egy / választóval, amely a kezdeti TypedXmlDocumentre hivatkozik. Amikor visszavonja a szülő TypedXmlDocument dokumentumot, az ehhez a TypedXmlDocument-hez társított összes TypedXmlDocument gyermekentitást eltávolítják a munkamemóriából, beleértve az összes TypedXmlDocument entitást is, amelyet az Assert függvény meghívásával hoztak létre a szabálykészlet választói alapján.

Gyermek TypedXmlDocument entitás visszavonása

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített visszavonás függvényt műveletként.

  3. A Tényekkezelő ablakban válassza az XML-sémák lehetőséget.

  4. Az XML-sémák lapon húzza a gyermekcsomópontot a Visszavonás függvény argumentumába.

RetractByType függvény

Ha el szeretné távolítani a szabálymotor munkamemóriából a megadott típusú összes objektumot, használja a Microsoft Rules ComposerBen a RetractByType függvényt. Ez a függvény eltér a Visszavonás függvénytől, amely csak bizonyos típusú elemeket távolít el.

Az összes .NET-objektum visszavonása egy adott típussal

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített RetractByType függvényt műveletként.

  3. A Tényekkezelő ablakban válassza a .NET-osztályok lehetőséget.

  4. A .NET-osztályok lapon húzza az osztályt a RetractByType függvény argumentumába.

Az összes TypedXmlDocument entitás visszavonása egy adott típussal

A RetractByType eltávolítja az összes TypedXmlDocument entitást ugyanazzal a DocumentType.Selector-ral.

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített RetractByType függvényt műveletként.

  3. A Tényekkezelő ablakban válassza az XML-sémák lehetőséget.

  4. Az XML-sémák lapon húzza a megfelelő csomópontot a RetractByType függvényre.

A Retract függvénnyel összhangban, ha a dokumentum gyökércsomópontján alkalmazza a RetractByType függvényt, ez a művelet nemcsak az adott DocumentType-tal érvényesített TypedXmlDocument entitásokat vonja vissza, hanem az összes kapcsolódó gyermek TypedXmlDocument entitást vagy XmlNode csomópontot is a fahierarchiában, amelyek ezekhez a szülő TypedXmlDocument entitásokhoz vannak társítva.

Funkció újramegerősítése

Ha a motor működésmemóriájában már meglévő objektumon az Assert függvényt szeretné hívni, használja a Microsoft Rules Composer 'Reassert' függvényét. Ez a viselkedés egyenértékű azzal, ha egy Visszavonás parancsot ad ki az objektumhoz, majd egy Helyességi parancsot.

Például, ha egy .NET-objektumon az Újrahivatkozás függvényt használja, a szabálymotor a következő lépéseket hajtja végre:

  1. Távolítsa el a .NET-objektumot a munkamemóriából.

  2. Távolítsa el az objektumot predikátumban vagy műveletben használó szabályok napirenden lévő műveleteit.

  3. A .NET-objektumot vissza kell állítani a munkamemóriába, és újonnan érvényesített objektumként kell kiértékelni.

  4. Értékelje újra az objektumot egy predikátumban használó szabályokat, és szükség szerint adja hozzá a szabályok műveleteit a napirendhez.

  5. Újra helyezi a napirendre a korábban igazra értékelt szabályok műveleteit, és a műveleteikben csak az objektumot használják.

.NET-objektum újraszerelése

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. A THEN panel Műveletek csoportjában, adja hozzá a Reassert beépített függvényt, mint műveletet.

  3. A Tényekkezelő ablakban válassza a .NET-osztályok lehetőséget.

  4. A .NET-osztályok lapon húzza az osztályt az Újraösszeállítás függvény argumentumába.

TypedXmlDocument entitás újraösszeállítása

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. A THEN panelen, az Műveletek alatt adja hozzá a Reassert beépített függvényt, mint műveletet.

  3. A Tényekkezelő ablakban válassza az XML-sémák lehetőséget.

  4. Az XML-sémák lapon húzza a reassert függvény argumentumára a kívánt entitáscsomópontot.

Ha újra összeállít egy legfelső szintű TypedXmlDocument entitást, a TypedXmlDocument gyermek entitások, amelyek a legfelső szintű TypedXmlDocument entitás első érvényesítésekor lettek létrehozva, az egyes TypedXmlDocument gyermek entitások állapotától függően eltérően viselkedhetnek.

Ha például egy új vagy meglévő gyermekentitás "piszkos", ami azt jelenti, hogy a szabálykészletben legalább egy mező módosult egy művelet használatával, akkor a rendszer egy Assert függvényt vagy újraösszeállítási függvényt hajt végre a gyermeken. A munkaemlékezetben marad minden olyan meglévő gyermek, amely nem piszkos.

Megjegyzés

A csomópontok nincsenek olyan piszkosként megjelölve a külső műveletektől, amelyekről a motor nem tud, például egy külső alkalmazás programozott módon adja hozzá, törli vagy frissíti a csomópontot.

Az alábbi példa egy egyszerűsített forgatókönyvet mutat be, amely leírja a gyermek entitások viselkedését a szülő entitás újramegerősítésekor. Tegyük fel, hogy a munkamemória következő TypedXmlDocument entitásai vannak: Szülő, Gyermek1, Gyermek2 és Gyermek3.

  • A szülő a legfelső szintű TypedXmlDocument entitás.
  • Minden gyermek tartalmaz egy ExampleField nevű mezőt, ahol az érték 1, például Child1.ExampleField = 1.

Tegyük fel, hogy egy szabályművelet a következő műveleteket hajtja végre a gyermek entitásokon:

  • A Child2 ExampleField értéke 1-ről 0-ra frissül.
  • A felhasználói kód törli a Child3 elemet.
  • A felhasználói kód hozzáad egy új TypedXmlDocument gyermeket NewChild néven a Szülő entitáshoz.

Az alábbi példa az objektumok új ábrázolását mutatja be a munkamemória területén:

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

Tegyük fel, hogy újra összeállítja a Szülő entitást, amely a következő gyermekentitások viselkedését eredményezi:

  • Child2 újra felülvizsgálat alatt áll, mert a mező frissítése után most már módosított állapotban van.
  • A Gyermek3 vissza lesz vonva a munkamemória alól.
  • NewChild be van helyezve a munkamemóriába.
  • Child1 változatlan marad a munkamemóriában, mert nem frissült, mielőtt a szülő újra meg lett erősítve.

Frissítési függvény

Ha újra szeretne összeállítani egy objektumot a szabálymotorba az új adatok és állapot alapján, használja az Update függvényt a Microsoft Rules Composerben. Az objektum .NET-osztálytípussal vagy TypedXmlDocument típussal rendelkezhet. Az Update függvénnyel javíthatja a motor teljesítményét, és megelőzheti a végtelen ciklusos forgatókönyveket.

Fontos

A szabályok újraértékelésének alapértelmezett maximális ciklusszáma 2^32, ezért bizonyos szabályok esetében a szabálykészletek végrehajtása hosszú ideig tarthat. A ciklusok számának csökkentéséhez módosítsa a szabálykészlet-verzió Maximális végrehajtási ciklusmélység tulajdonságát.

.NET-objektum frissítése

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített frissítés függvényt műveletként.

  3. A Tényekkezelő ablakban válassza a .NET-osztályok lehetőséget.

  4. A .NET-osztályok lapon húzza az osztályt a Frissítés függvény argumentumába.

Az Assert használatával általában egy új objektumot helyez el a szabálymotor munkamemóriában, és az Update használatával frissít egy már meglévő objektumot a munkamemóriában. Ha egy új objektumot tényként állít be, a motor újraértékeli az összes szabály feltételeit. Ha azonban frissít egy meglévő objektumot, a motor csak a frissített tényt használó feltételeket értékeli újra, és műveleteket ad hozzá a napirendhez, ha ezek a feltételek teljesülnek.

Tegyük fel például, hogy a következő szabályokkal rendelkezik, és hogy az ItemA és az ItemB nevű objektumok már léteznek a munkamemória területén.

  • 1. szabály kiértékeli az ItemA Id tulajdonságát, beállítja az Id tulajdonságot az ItemB-ben, majd újra érvényesíti ItemB-t a módosítás után. Az ItemB újraösszeállításakor a motor az ItemB-t új objektumként kezeli, a motor pedig újraértékeli a predikátumokban vagy műveletekben az ItemB-t használó összes szabályt. Ez a viselkedés gondoskodik arról, hogy a motor újraértékelje 2. szabályt az 1. szabály szerint megadott ItemB.Id új értékével szemben.

    1. szabály

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • Lehet, hogy a 2. szabály nem felel meg az első értékelésnél, de a második kiértékelés során igazra értékelődik.

    2. szabály

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

Az objektumok munkamemóriába való újraösszesítésének képessége explicit vezérlést biztosít a továbbítási láncolásos forgatókönyvek viselkedése felett. Ez a példa azonban egy olyan mellékhatást mutat be az újraértékelésből, ahol az 1 . szabályt is újraértékelik. Amennyiben a ItemA.Id változatlan, a 1. szabály ismét igaz eredményt ad, és az Assert(ItemB) művelet ismét végrehajtódik. Ennek eredményeképpen a szabály végtelen ciklushelyzetet hoz létre.

Végtelen hurkok megakadályozása

Végtelen hurkok létrehozása nélkül újra kell tudnia összeszerelni az objektumokat. Az ilyen forgatókönyvek elkerülése érdekében használhatja az Update függvényt. A Reassert függvényhez hasonlóan a Frissítés függvény is végrehajtja a Visszavonás és az Érvényesség függvényt a szabályműveletek által módosított társított objektumpéldányokon, de az alábbi főbb különbségekkel:

  • A napirenden a szabályokra vonatkozó műveletek akkor maradnak napirenden, ha a példánytípust csak a műveletekben használják, nem pedig a predikátumokban.

  • Azok a szabályok, amelyek csak a példánytípust használják a műveletekben, nem lesznek újraértékelve.

Ennek eredményeképpen a példánytípusokat használó szabályokat – akár csak a predikátumokban, akár a predikátumokban és a műveletekben is – újraértékesíti a rendszer, és a szabályok műveletei a megfelelő módon bekerülnek a napirendbe.

Ha módosítja az előző példát a Frissítés függvény használatára, meggyőződhet arról, hogy a motor csak a 2. szabályt veszi át újra, mert a 2. szabály feltétele az ItemB-t használja. A motor nem értékeli újra a 1. szabályt, mert az ItemB-t csak az 1. szabály műveleteiben használják, így kiküszöbölve a ciklusos forgatókönyvet.

1. szabály

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

2. szabály

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

Annak ellenére, hogy így használja az Update függvényt, továbbra is fennáll a lehetőség a ciklusos forgatókönyvek létrehozására. Vegyük például a következő szabályt:

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

A predikátum ItemA-t használ, így a motor újraértékesíti a szabályt, amikor a frissítés az ItemA-n van meghívva. Ha a ItemA.Id értéke máshol nem változik, az 1. szabály továbbra is igazként értékeli ki az értéket, ami azt eredményezi, hogy újra meghívja az Update-et az ItemA-n.

Szabálytervezőként el kell kerülnie az ilyen ciklusforgatókönyvek létrehozását. A probléma megoldásának megfelelő megközelítése a szabályok jellegétől függően eltérő.

Az alábbi példa egy egyszerű módszert mutat be a probléma megoldására az előző példában az ItemA.Value ellenőrzés hozzáadásával, amely megakadályozza, hogy a szabály ismét igazként értékeljen a szabály első végrehajtása után.

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

TypedXmlDocument entitás frissítése

  1. A RuleSet Explorer ablakban keresse meg és válassza ki a kívánt szabályt.

  2. Az THEN panel Műveletek csoportjában adja hozzá a Beépített frissítés függvényt műveletként.

  3. A Tényekkezelő ablakban válassza az XML-sémák lehetőséget.

  4. Az XML-sémák lapon húzza a kívánt entitáscsomópontot a Frissítés függvény argumentumára.

Tegyük fel például, hogy a következő szabályokkal rendelkezik:

  • Az 1 . szabály kiértékeli a beszerzési rendelés üzenetében szereplő cikkek teljes számát.

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • A 2. szabály "Jóváhagyást igényel" állapotra állítja, ha a teljes szám nagyobb vagy egyenlő 10-nél.

    2. szabály

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

Ha a következő vásárlási megrendelési üzenetet adja meg a szabálykészlet bemeneteként, láthatja, hogy az állapot nem "Jóváhagyásra van szükség" értékre van állítva, annak ellenére, hogy a TotalCount értéke 14. Ez a viselkedés azért fordul elő, mert a 2 . szabály kiértékelése csak akkor kezdődik, amikor a TotalCount értéke 0. A rendszer nem értékeli ki a szabályt minden alkalommal, amikor a TotalCount frissül.

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

Ahhoz, hogy a motor minden alkalommal újraértékelje a feltételeket a TotalCount frissítésekor, meg kell hívnia a frissítési függvényt a frissített csomópont szülőcsomópontján (Elemek) (TotalCount). Ha az 1. szabályt az alábbiak szerint módosítja, és még egyszer teszteli a szabályt, az Állapot mező értéke "Jóváhagyásra van szükség":

Szabály 1 (frissítve)

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)