共用方式為


使用 Microsoft Rules Composer 將動作中的控制項函式新增至最佳化規則執行 (預覽)

適用於:Azure Logic Apps (標準)

重要

此功能處於預覽狀態,且受限於 Microsoft Azure 預覽版的補充使用規定

本指南說明如何使用 Microsoft Rules Composer,將控件函式新增至規則中的動作,將規則執行優化。 控件函式可協助您的應用程式或規則集控制規則引擎工作記憶體中的事實。 這些函式包括適用於 .NET 物件和 TypedXmlDocument 實體的 AssertClearHaltRetract、RetractByTypeReassertUpdate 函式。 工作記憶體中的事實會驅動引擎評估的條件,以及執行動作。

必要條件

  • 下載並安裝 Microsoft Rules Composer

  • 包含您要處理之規則集的 XML 檔案。

    若要新增事實,請在您從 RuleSet Explorer 視窗指向的 XML 檔中指定其值。 或者,您可以使用事實建立者,將包含 .NET 對象的陣列提供給規則引擎做為事實。 如需詳細資訊,請參閱 建置事實建立者和擷取程式

Assert 函式

若要將對象實例新增至規則引擎的工作記憶體,請使用 Microsoft Rules Composer 中的 Assert 函式。 引擎會根據針對實例類型所寫入的條件和動作,使用比對衝突解決動作階段來處理每個物件實例。

下表摘要說明 所支援判斷提示實體和實例類型的Assert 函式行為,包括針對每個判斷提示實體在引擎中建立的結果實例數目,以及套用至每個實例以進行識別的型別。

Entity 判斷提示的實例數目 執行個體類型
.NET 物件 1 (物件本身) 完整 .NET 類別
TypedXmlDocument 1-N TypedXmlDocument(s):根據建立的選取器系結和文件內容 DocumentType.Selector

判斷提示 .NET 物件

規則引擎原生支持參考型別的基本 .NET 純量類型和物件。 判斷提示的 .NET 對象處理是最直接的處理類型。

在 Microsoft Rules Composer 中,您可以從規則內判斷提示 .NET 物件。

  1. Microsoft Rules Composer 中,載入包含您要處理之規則存放區的 XML 檔案。

  2. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  3. 在 THEN 窗格中的 [動作] 底下,新增 Assert 內建函式作為動作。

  4. 在 [事實總] 視窗中,選取 [.NET 類別]。

  5. 從 [.NET 類別] 索引卷標中,將您想要之 物件的建構函式方法拖曳至 Assert 動作中的自變數。

    Microsoft Rules Composer 會將建構函式方法轉譯為 規則定義中的 CreateObject 呼叫。

    注意

    雖然規則引擎具有 CreateObject 函式,但函式不會顯示為Microsoft Rules Composer 中的個別函式。

每個物件都會判斷為工作記憶體做為個別的物件實例,這表示每個參考物件類型的述詞,例如 IF Object.Property = 1,都會分析 實例。 實例也可供參考型別的規則動作,根據規則條件的結果。

例如,假設您有下列規則:

規則 1

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

規則 2

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

在規則 1 中 ,只有值為 1 的 A 實例才會更新其 Status 屬性。 不過,在規則 2 中,如果條件評估為 true,則所有 A 實例的狀態都會更新。 事實上,如果有多個 B 實例存在,則每次條件評估為 true 時,都會更新 A 實例。

判斷提示 TypedXmlDocument 實體

在 Microsoft Rules Composer 中,您可以從規則內判斷提示 TypedXmlDocument 實體。

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 THEN 窗格中的 [動作] 底下,新增 Assert 內建函式作為動作。

  3. 在 [事實總管] 視窗中,選取 [XML 架構]。

  4. 從 [XML 架構] 索引標籤中,將您想要的節點拖曳至 Assert 動作中的自變數。

XML 檔案基本上是文字,但域值可能是任何類型,這是根據規則建置時指定的類型。 欄位是 XPath 運算式,因此可能會傳回 nodeset,這表示集合中的第一個專案會當做值使用。

當 TypedXmlDocument 實體判斷提示為事實時,規則引擎會根據規則中定義的選取器建立 TypedXmlDocument 子實例。 您可以將選取器視為隔離 XML 檔中節點的方法,並將字段視為識別選取器內的特定專案。 規則引擎會將一個選取器內的所有欄位群組為物件。

選取器也是 XPath 表達式。 在 [事實總管] 中,當您在 [XML 架構] 索引卷標上選取節點時,Microsoft規則編輯器會自動填入所有節點的 XPath 選取器屬性,以及任何不包含子節點之節點的 XPath Field 屬性。 或者,如有必要,您可以為 XPath 選取器和 XPath 字段輸入自己的 XPath 表達式。 如果選取器符合 XML 檔中的多個部分,則會判斷提示此類型的多個物件,或從規則引擎的工作記憶體中撤銷。

您可以在同一份檔中使用多個選取器。 如此一來,您可以檢視檔的不同部分,例如,假設某個區段是訂單,另一個區段包含出貨位址。 不過,請記住,所建立的物件是由建立物件的 XPath 字串所定義。 如果您使用不同的 XPath 運算式,即使表達式解析為相同的節點,結果也是唯 一的 TypedXmlDocument 實體。

例如,假設您有下列 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>

如果您使用選取器 /root/order 或 order,下列物件會新增至引擎的工作記憶體:

物件 1

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

物件 2

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

在每個選取器內,XPaths 會參考個別欄位。 因此,如果您使用選取器 /root/order/itemorder/itemitem,下列物件會新增至引擎的工作記憶體,其中包含 Joe 的兩個專案,以及 Jane 的兩個專案:

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

每個物件都可以存取三個字段: @name@quantity@cost。 您可以參考父欄位,因為物件是源檔的參考,例如 。。/@customer

在幕後,規則引擎可以透過 XmlConvert 函式,將文字域值轉換成任何支援的型別。 您可以在 Microsoft Rules Composer 中設定類型,以指定此選項。 如果無法轉換,引擎會擲回例外狀況。 您只能擷取 booldouble 類型做為其各自的類型,字串或物件。

Clear 函式

若要重設規則引擎實例的工作記憶體和議程,請使用 Microsoft Rules Composer 中的 Clear 函式。 如需工作記憶體和議程的詳細資訊,請參閱 規則引擎優化

重設規則引擎的工作記憶體和議程

  1. [RuleSet 總 管] 視窗中,尋找並選取您要清除規則引擎的工作記憶體和議程的規則。

  2. 在 THEN 窗格中的 [動作] 底下,新增 Clear 內建函式作為動作。

    Clear式不接受自變數。

Halt 函式

若要停止規則引擎目前的執行,請使用 Microsoft Rules Composer 中的 Halt 函式。

停止規則集執行

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您要停止規則集執行的規則。

  2. THEN 窗格中的 [動作] 底下,新增 [停止內建函式] 作為動作。

Halt式會採用單一布爾值自變數。 如果您將值指定為 true,規則引擎會清除包含擱置候選規則的議程。

Ruleset.Execute 方法是 RuleEngine.Execute 方法的包裝函式,並使用類似下列程式代碼的程式代碼:

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

如果您使用 Ruleset.Execute 方法來執行規則集,當 Halt 函式執行時,規則引擎會將控制權傳回 Ruleset.Execute 方法。 Ruleset.Execute 方法會擷取事實,並將控制權傳回給呼叫端。 在此情況下,已停止的規則集執行無法繼續。

不過,如果您直接使用 RuleEngine.Execute 方法來執行規則集,您可以再次呼叫 RuleEngine.Execute 來繼續停止的規則集執行,方法是再次呼叫 RuleEngine.Execute ,但前提是您並未撤銷兩個呼叫之間所需的任何物件。

注意

Ruleset.Execute 方法會快取規則引擎實例,以提升效能。 如果您直接使用 RuleEngine.Execute 方法,則不會快取規則引擎實例。

下列範例程式代碼示範如何繼續停止的規則集執行:

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

Retract 函式

若要從規則集和規則引擎的工作記憶體中移除物件,請使用 Microsoft Rules Composer 中的 Retract 函式。

撤銷 .NET 物件

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 [THEN] 窗格中的 [動作] 底下,新增 Retract 內建函式作為動作。

  3. 在 [事實總] 視窗中,選取 [.NET 類別]。

  4. 從 [.NET 類別] 索引卷標中,將您想要的類別,而不是元件或方法拖曳至 Retract 參數的自變數。

    如果您將方法拖曳至 Retract 函式,引擎會嘗試撤銷 方法所傳回的物件。

復原 .NET 物件會產生下列影響:

  • 使用物件的議程上的行動已從議程中移除。

    注意

    在您使用 Retract 函式之前,議程上的其他動作可能已經執行。

  • 在述詞中使用對象的規則,如果議程上有任何行動存在,就會將其行動從議程中移除。

  • 引擎不再評估物件。

撤銷 TypedXmlDocument 實體或實體

您可以將判斷提示的原始 TypedXmlDocument 實體撤銷至規則引擎,也可以撤銷從父 XmlDocument 實體建立的 TypedXmlDocument 子實體之一。

假設您有下列範例 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>

您可以撤銷與訂單物件相關聯的 TypedXmlDocument 實體,也可以撤銷與 orderline 物件相關聯的 TypedXmlDocument 實體或兩者。 所有 TypedXmlDocument 實體都會與最初判斷提示的最上層 TypedXmlDocument 實體相關聯,而不是與 XML 樹狀結構階層中出現在該最上層 TypedXmlDocument 節點上方的 TypedXmlDocument 實體相關聯。

例如,product 是 orderline 物件下方的 TypedXmlDocument 實體,且與 Orderline 的 TypedXmlDocument 實體相關聯,而不是 OrderlineTypedXmlDocument 實體。 在大部分情況下,這項區別並不重要。 不過,如果您撤銷 order 物件,也會撤銷 orderlineproduct 物件。 如果您撤銷 orderline 物件,則只會撤銷該物件,而不是 product 物件。

引擎只能與 TypedXmlDocument 實例的物件實例搭配運作,並追蹤最初判斷提示 TypedXmlDocument 實體時所建立的引擎。 如果您建立其他節點,例如透過規則集中選取器選取之節點的同層級節點,除非建立 TypedXmlDocument 實體併為其判斷提示,否則這些節點不會在規則中進行評估。 如果您判斷提示這些新、較低層級的 TypedXmlDocument 實例,引擎會評估規則中的實例,但最上層 TypedXmlDocument 實體並不知道這些實例。 撤銷最上層 TypedXmlDocument 時,不會自動撤銷獨立判斷提示 的 TypedXmlDocument 實體。 因此,如果建立新的節點,請在完整的 XmlDocument 上執行 RetractReassert,這是一般且最直接的步驟。

TypedXmlDocument 類別提供實用的方法,您可以在自定義 .NET 成員內呼叫做為動作的一部分。 這些方法包括取得TypedXmlDocument 或父 TypedXmlDocument 相關聯的 XmlNode 的功能。

撤銷最上層 TypedXmlDocument 實體

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 [THEN] 窗格中的 [動作] 底下,新增 Retract 內建函式作為動作。

  3. 在 [事實總 管] 視窗中,選取 [ XML 架構]。

  4. 從 [XML 架構] 索引標籤,將架構的最上層節點拖曳至 Retract 函式的自變數。

    這個頂端節點會以 .xsd 擴展名結尾,並代表檔根節點,而不是文件元素節點。 節點具有 / 參考初始 TypedXmlDocument 的選取器。 當您撤銷父 TypedXmlDocument 時,所有與 TypedXmlDocument 相關聯的 TypedXmlDocument 子實體都會從工作記憶體中移除,包括呼叫 Assert 函式所建立的所有 TypedXmlDocument 實體,根據規則集中使用的選取器。

撤銷子 TypedXmlDocument 實體

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 [THEN] 窗格中的 [動作] 底下,新增 Retract 內建函式作為動作。

  3. 在 [事實總 管] 視窗中,選取 [ XML 架構]。

  4. 從 [XML 架構] 索引卷標,將子節點拖曳至 Retract 函式的自變數。

RetractByType 函式

若要從規則引擎的工作記憶體中移除具有指定類型的所有物件,請使用 Microsoft Rules Composer 中的 RetractByType 函式。 此函式與 Retract 函式不同,只會移除特定類型的特定專案。

撤銷所有具有特定類型的 .NET 物件

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 THEN 窗格中的 [動作] 底下,將 RetractByType 內建函式新增為動作。

  3. 在 [事實總] 視窗中,選取 [.NET 類別]。

  4. 從 [.NET 類別] 索引卷標中,將類別拖曳至 RetractByType 函式的自變數。

撤銷具有特定類型的所有 TypedXmlDocument 實體

RetractByType 會移除具有相同 DocumentType.Selector 的所有 TypedXmlDocument 實體。

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 THEN 窗格中的 [動作] 底下,將 RetractByType 內建函式新增為動作。

  3. 在 [事實總管] 視窗中,選取 [XML 架構]。

  4. 從 [ XML 架構] 索引 標籤,將適當的節點拖曳至 RetractByType 函式。

與 Retract 函式一致,如果您在檔根節點上使用 RetractByType 函式,不僅會撤銷與 DocumentType 一起判斷提示的所有 TypedXmlDocument 實體,也會撤銷與這些父 TypedXmlDocument 實體相關聯的樹狀結構階層中的所有 TypedXmlDocument 實體或 XmlNode 節點。

Reassert 函式

若要在引擎的工作記憶體中已存在的物件上呼叫 Assert 函式,請使用 Microsoft Rules Composer 中的 Reassert 函式。 行為相當於發出 物件的 Retract 命令,後面接著 Assert 命令。

例如,如果您在 .NET 物件上使用 Reassert 函式,規則引擎會採取下列步驟:

  1. 從工作記憶體中撤銷 .NET 物件。

  2. 針對在述詞或動作中使用 對象的規則,移除議程上的任何動作。

  3. 將 .NET 物件判斷回工作記憶體,並評估為新判斷提示的物件。

  4. 重新評估任何在述詞中使用 對象的規則,並適當地將這些規則的動作新增至議程。

  5. 讀取任何先前評估為 true 之規則的議程動作,並只在其動作中使用 物件。

Reassert .NET 物件

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 THEN 窗格中的 [動作] 底下,新增 Reassert 內建函式作為動作。

  3. 在 [事實總] 視窗中,選取 [.NET 類別]。

  4. 從 [.NET 類別] 索引卷標中,將類別拖曳至 Reassert 函式的自變數。

重新設定 TypedXmlDocument 實體

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 THEN 窗格中的 [動作] 底下,新增 Reassert 內建函式作為動作。

  3. 在 [事實總管] 視窗中,選取 [XML 架構]。

  4. 從 [XML 架構] 索引標籤中,將您想要的實體節點拖曳至 Reassert 函式中的自變數。

如果您重新建立最上層 TypedXmlDocument 實體,則第一次判斷提示最上層 TypedXmlDocument 實體時所建立的 TypedXmlDocument 子實體會根據每個 TypedXmlDocument 子實體的狀態而有不同的行為。

例如,如果新的或現有的子實體是“dirty”,表示至少有一個字段在規則集中使用動作變更,則會 在該子系上執行 Assert 函式或 Reassert 函式。 任何不臟的現有子系會保留在工作記憶體中。

注意

節點不會從引擎不知道的外部作業中標示為骯髒,例如,外部應用程式會以程序設計方式新增、刪除或更新該節點。

下列範例顯示簡化的案例,描述其父實體重新評估時子實體的行為。 假設您在工作記憶體中有下列 TypedXmlDocument 實體: ParentChild1Child2Child3

  • 系是最上層 TypedXmlDocument 實體。
  • 每個子系都包含名為 ExampleField 的欄位,其中值設定為 1,例如Child1.ExampleField = 1'。

假設規則動作會對子實體執行下列作業:

  • Child2ExampleField 值會從 1 更新為 0。
  • 用戶程式代碼會 刪除 Child3
  • 用戶程式代碼會將名為 NewChild 的新 TypedXmlDocument 子實體新增至 Parent

下列範例顯示工作記憶體中物件的新表示法:

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

現在,假設您重新建立 實體,這會導致下列子實體行為:

  • Child2 已重新評估,因為其字段更新后現在已變更。
  • Child3 會從工作記憶體中收回。
  • NewChild 會判斷提示為工作記憶體。
  • Child1 在工作記憶體中保持不變,因為它在重新評估Parent之前未更新。

Update 函式

若要根據新的數據和狀態,在規則引擎中重新評估物件,請使用 Microsoft Rules Composer 中的 Update 函式。 物件可以有 .NET 類別類型或 TypedXmlDocument 類型。 您也可以使用 Update 函式來改善引擎效能,並防止無休止的迴圈案例。

重要

重新評估規則的預設最大循環計數為 2^32,因此針對特定規則,規則集執行可能會持續很長的時間。 若要減少迴圈計數,請變更 規則集版本上的 [最大執行迴圈深度 ] 屬性。

更新 .NET 物件

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 [THEN] 窗格中的 [動作] 底下,新增 [更新內建函式] 作為動作。

  3. 在 [事實總] 視窗中,選取 [.NET 類別]。

  4. 從 [.NET 類別] 索引卷標中,將類別拖曳至 Update 函式的自變數。

一般而言,您可以使用 Assert 將新物件放在規則引擎的工作記憶體中,並使用 Update 來更新工作記憶體中現有的物件。 當您將新的 物件判斷為事實時,引擎會重新評估所有規則中的條件。 不過,當您更新現有的物件時,如果這些條件評估為 true,引擎只會重新評估使用更新事實的條件,並將動作新增至議程。

例如,假設您有下列規則,且名為 ItemAItemB 的物件已存在於工作記憶體中。

  • 規則 1評估 ItemA 中的 Id 屬性、在 ItemB設定 Id 屬性,然後在變更之後重新評估 ItemB。 重新評估 ItemB 時,引擎會將 ItemB 視為新的物件,而引擎會重新評估在述詞或動作中使用 ItemB 的所有規則。 此行為可確保引擎會根據規則 1 中所設定 ItemB.Id 中的新值重新評估規則 2。

    規則 1

    IF ItemA.Id == 1
    THEN ItemB.Id = 2
    Assert(ItemB)
    
  • 規則 2 可能會失敗第一次評估,但在第二次評估期間評估為 true

    規則 2

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

將物件重新組譯成工作記憶體的功能可讓您明確控制轉送鏈結案例中的行為。 不過,此範例會顯示重新評估 規則 1 的副作用。 ItemA.Id 未變更時,規則 1 會再次評估為 true,而 Assert(ItemB) 動作會再次引發。 因此,規則會建立無休止的循環狀況。

避免無止盡的迴圈

您必須能夠在不建立無休止的循環的情況下重新建立物件。 若要避免這類情況,您可以使用 Update 函式。 如同 Reassert 函式,Update 函式會在規則動作變更的相關聯對象實例上執行 RetractAssert 函式,但有下列主要差異:

  • 在議程上,當實例類型只用於動作時,規則的動作會保留在議程上,而不是述詞。

  • 只會在動作中使用實例類型的規則不會重新評估。

因此,只使用述詞或述詞和動作的實例類型規則會重新評估,並適當地將規則的動作新增至議程。

藉由將上述範例變更為使用 Update 函式,您可以確定引擎只會重新評估規則 2,因為規則 2 的條件使用 ItemB。 引擎不會重新評估規則 1,因為 ItemB 只會用於規則 1* 的動作中,而不需要迴圈案例。

規則 1

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

規則 2

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

儘管以這種方式使用 Update 函式,但建立迴圈案例的可能性仍然存在。 例如,請考慮下列規則:

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

述詞會使用 ItemA,因此引擎會在 ItemA呼叫 Update重新評估規則。 如果 ItemA.Id 的值未在其他地方變更,規則 1 會繼續評估為 true,這會導致在 ItemA再次呼叫 Update

身為規則設計工具,您必須確保避免建立這類迴圈案例。 修正此問題的適當方法會根據規則的性質而有所不同。

下列範例示範一個簡單的方法來解決問題,方法是新增 ItemA.Value檢查,以防止規則在第一次執行規則的動作之後再次評估為 true

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

更新 TypedXmlDocument 實體

  1. 在 [ RuleSet Explorer] 視窗中,尋找並選取您想要的規則。

  2. 在 [THEN] 窗格中的 [動作] 底下,新增 [更新內建函式] 作為動作。

  3. 在 [事實總管] 視窗中,選取 [XML 架構]。

  4. 從 [XML 架構] 索引標籤,將您想要的實體節點拖曳至 Update 函式中的自變數。

例如,假設您有下列規則:

  • 規則 1 會評估採購單訊息中項目的總計數。

    IF 1 == 1
    THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)  
    
  • 如果總計數大於或等於 10,規則 2 會將狀態設定為「需要核准」。

    規則 2

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

如果您傳遞下列採購單訊息作為此規則集的輸入,您就會注意到狀態不會設定為「需要核准」,即使 TotalCount 是 14。 發生此行為是因為只有在 TotalCount 值為 0 時,才會評估規則 2。 每次更新 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>

若要讓引擎在每次更新 TotalCount 時重新評估條件,您必須針對更新的節點 (TotalCount) 呼叫父節點 (Items) 上的 Update 函式。 如果您變更 規則 1 ,並再測試規則一次, [狀態 ] 字段會設定為 [需要核准]:

規則 1 (已更新)

IF 1 == 1
THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count) AND
Update(ProcessPO.Order:/Order/Items)