閱讀英文

共用方式為


Assert

判斷提示 是將物件實例新增至商務規則引擎工作記憶體的程式。 引擎會根據針對執行個體類型所寫入的條件與動作,使用相符-衝突解析-動作階段來處理每個執行個體。

下列主題描述針對不同事實類型使用 Assert 函式所產生的行為。

.NET 物件

每個物件都會判斷提示到工作記憶體中,以做為個別的執行個體。 這表示執行個體是由參考物件類型 (例如,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 實例,則每次條件評估為 B 實例 true 時,都會更新 A 實例。

若要從規則內判斷提示 .NET 物件,您可以將內建 Assert 函式新增為規則動作。 請注意,規則引擎具有 CreateObject 函式,但不會在商務規則編輯器中顯示為個別函式。 建置其叫用的方式,是將您想要建立的物件建構函式方法,從 [事實總管] 之 [.NET 類別] 檢視拖曳到動作窗格中。 然後,商務規則編輯器會將建構函式方法轉譯為規則定義中的 CreateObject 呼叫。

TypedXmlDocument

判斷提示 TypedXmlDocument 時,商務規則引擎會根據規則中定義的選取器建立子 TypedXmlDocument 實例。

選取器和欄位都是 XPath 運算式。 您可以將選取器視為隔離 XML 文件節點的方法,並將欄位當成在選取器中識別特定項目的方法。 引擎會將一個選取器中的所有欄位群組在一起,以做為一個物件。 當您在 [事實總管] 的 [XML 架構 ] 索引標籤下選取節點時,商務規則編輯器會自動填入所有節點的 XPath 選取器 屬性,以及不包含子節點之任何節點的 XPath Field 屬性。 或者,您可以視需要為 XPath 選取器和XPath 欄位輸入自己的 XPath 運算式。

若選取器符合 XML 文件的多個部分,則這個類型的多個物件會判斷提示到規則引擎工作記憶體,或從中撤回。 假設您有下列的 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/item (或 (//order/item 或 //item) ,則會將四個物件新增至規則引擎工作記憶體,Joe 的兩個專案和 Jane 的兩個專案。

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

每個物件都可以存取三個欄位,@name、 @quantity 和 @cost 。 因為物件是原始文件的參照,您可以參考父欄位 (例如,"../@customer")。

您可以在相同文件中使用多個選取器。 這可讓您檢視文件的不同部分 (例如,若一個區段是訂單,而另一個區段包含送貨地址)。 不過,請記住,建立的物件是由建立它們的 XPath 字串所定義。 使用不同的 XPath 運算式,即使它解析為相同的節點,也會產生唯一 的 TypedXmlDocument

規則引擎本質上支援基本的 .NET 純量類型,以及參照類型的物件。 XML 文件基本上是文字,但根據建立規則時所指定的類型,欄位值可能是任何類型。 此外,因為欄位是 XPath 運算式,它們可能會傳回節點集,在此情況下,此集中的第一個項目會當成值來使用。

在幕後,規則引擎可以透過 XmlConvert 函式,將文字域值轉換成任何一個支援的類型。 您可以藉由在「商務規則編輯器」中設定類型來加以指定。 若無法轉換,則會擲出一個例外狀況。 booldouble類型只能擷取為各自的類型、字串或物件。

TypedDataTable

TypedDataTable判斷提示時,DataTable中包含的所有DataRows都會自動判斷提示到引擎中,做為TypedDataRows。 每當使用資料表或資料表資料行做為規則引數時,都會根據個別 TypedDataRows評估運算式,而不是針對 TypedDataTable評估。

例如,假設您為「客戶」資料表建立了下列規則:

IF Northwind.Customers.CustomerID = 001  
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"  

注意

若要針對資料庫資料表建置規則,您必須使用 [資料表/ 資料列 ] 作為資料庫系結類型。

假設您在引擎中判斷提示下列 DataTable ,其中三個 DataRow (為 TypedDataTable) 。

CustomerID ContactTitle
001 供應職員
002 供應職員
003 供應職員

引擎會插入三個 TypedDataRows:001、002 和 003。

每個 TypedDataRow 都會根據規則獨立評估。 第一個 TypedDataRow 符合規則條件,而第二個則失敗。 結果如下所示。

CustomerID ContactTitle
001 採購經理
002 供應職員
003 供應職員

注意

TypedDataRows 也可以直接判斷提示到引擎。 會以稍早所述的相同方式來處理這些項目。

DataSetName.DataTableName會被視為唯一識別碼。 因此,如果使用相同的DataSet 名稱和 DataTable名稱判斷提示第二個TypedDataTable,則會取代第一個TypedDataTable 所有與第一個TypedDataTable 相關聯的 TypedDataRow都會撤銷,並判斷提示第二個TypedDataTable

DataConnection

如同 TypedDataTable,將資料表或資料行拖曳為商務規則編輯器中的規則引數,會產生針對傳回 的 TypedDataRow所建置的規則,而不是 DataConnection 本身。

假設已建立下列規則,並判斷提示 DataConnection 包含 Northwind.Customers 的 SqlConnection

IF Northwind.Customers.CustomerID = 001  
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"  

當引擎評估 TypedDataTable 區段中所使用的規則時,它會動態建置看起來如下的查詢:

SELECT *  
FROM Northwind.Customers  
WHERE CustomerID = 1  

由於資料庫中只有一個資料列符合此準則,因此只會建立一個 TypedDataRow ,並判斷提示至引擎以進一步處理。

判斷提示實體和執行個體型別的摘要

下表概述各種型別的判斷提示行為、顯示在引擎中對每個判斷提示實體建立的結果執行個體數目,以及套用至那些執行個體以識別它們的型別。

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

DataTable 中每個 DataRow 都有一個
DataSetName.DataTableName
TypedDataRow 1 (判斷提示的 TypedDataRow) DataSetName.DataTableName
DataConnection 1-N (由查詢 DataConnection 傳回的每個 TypedDataRow 都有一個) DataSetName.DataTableName

另請參閱

引擎控制函式