英語で読む

次の方法で共有


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 のインスタンスが複数ある場合、A インスタンスは、条件が B インスタンスに対して true と評価されるたびに更新されます。

ルール内から .NET オブジェクトをアサートするには、組み込みの Assert 関数をルール アクションとして追加します。 ルール エンジンには CreateObject 関数がありますが、ビジネス ルール作成ツールでは別の関数として表示されないことに注意してください。 この関数を呼び出すには、作成するオブジェクトのコンストラクター メソッドをファクト エクスプローラーの .NET クラス ビューからアクション ペインにドラッグします。 次に、ビジネス ルール Composer は、コンストラクター メソッドをルール定義の CreateObject 呼び出しに変換します。

TypedXmlDocument

TypedXmlDocument がアサートされると、ビジネス ルール エンジンは、ルールで定義されているセレクターに基づいて子 TypedXmlDocument インスタンスを作成します。

セレクターとフィールドは両方とも XPath 式です。 セレクターは、XML ドキュメントのノードを分離するための方法として、フィールドは、セレクター内の特定の項目を識別するものとしてとらえることができます。 各セレクター内のすべてのフィールドは、エンジンによって 1 つのオブジェクトとしてまとめられます。 ファクト エクスプローラーの [XML スキーマ] タブの下にあるノードを選択すると、ビジネス ルール作成ツールは、すべてのノードの XPath Selector プロパティと、子ノードを含まないノードの 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) を使用すると、2 つのオブジェクトが作業メモリに追加されます。

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>  

各セレクター内で、個々のフィールドは XPath によって参照されます。

セレクター /root/order/item (または (//order/item または //item) を使用すると、4 つのオブジェクトがルール エンジンの作業メモリに追加され、Joe の 2 つの項目と Jane の 2 つの項目が追加されます。

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

各オブジェクトは、@name、、 @quantityおよび @costの 3 つのフィールドにアクセスできます。 オブジェクトは元のドキュメントへの参照であるため、親フィールド ("../@customer" など) を参照できます。

同じドキュメント内でも、複数のセレクターを使用することができます。 これにより、ドキュメントのさまざまな部分 (注文を示すセクションと発送先住所を示すセクションなど) を表示することが可能になります。 ただし、作成されるオブジェクトは作成元の XPath 文字列によって定義されることを覚えておく必要があります。 別の XPath 式を使用すると、同じノードに解決された場合でも、一意の TypedXmlDocument になります。

ルール エンジンは、基本的な .NET スカラー型をネイティブでサポートしているだけでなく、参照型のオブジェクトもサポートしています。 XML ドキュメントは基本的にテキストですが、ルールの作成時に指定された型に基づいており、フィールド値の型は任意です。 また、フィールドは XPath 式であるため、ノード セットを返す場合があります。この場合は、セット内の最初の項目が値として使用されます。

ルール エンジンでは、バックグラウンドで XmlConvert 関数を使用して、テキスト フィールド値をサポートされている任意の型に変換できます。 これを指定するには、ビジネス ルール作成ツールで型を設定します。 変換が不可能な場合は、例外がスローされます。 bool 型と double 型は、それぞれの型、文字列、またはオブジェクトとしてのみ取得できます。

TypedDataTable

TypedDataTable がアサートされると、DataTable に含まれるすべての DataRow がTypedDataRows としてエンジンに自動的にアサートされます。 テーブルまたはテーブル列をルール引数として使用すると、式は TypedDataTable ではなく、個々の TypedDataRows に対して評価されます。

たとえば、"Customers" テーブルに対して作成された次のルールがあるとします。

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

注意

データベース テーブルに対してルールを作成するには、データベース バインドの種類として データ テーブル/行 を使用する必要があります。

( TypedDataTable として) 3 つの DataRows を使用して、次の DataTable をアサートするとします。

CustomerID ContactTitle
001 Supply Clerk
002 Supply Clerk
003 Supply Clerk

エンジンは、001、002、003 の 3 つの TypedDataRows を挿入します。

TypedDataRow は、ルールに対して個別に評価されます。 最初の TypedDataRow は ルールの条件を満たし、2 番目の 2 つ目は失敗します。 結果は次のように表示されます。

CustomerID ContactTitle
001 Purchasing Manager
002 Supply Clerk
003 Supply Clerk

注意

TypedDataRow はエンジンに直接アサートすることもできます。 その場合も前述の方法で処理されます。

DataSetName.DataTableName は一意識別子と見なされます。 したがって、2 つ目の TypedDataTable が同じ DataSet 名と DataTable 名でアサートされている場合は、最初の TypedDataTable よりも優先されます。 最初 の TypedDataTableに関連付けられている TypedDataRow はすべて取り消され、2 番目の TypedDataTable がアサートされます。

DataConnection

TypedDataTable と同様に、ビジネス ルール作成ツールでテーブルまたは列をルール引数としてドラッグすると、DataConnection 自体ではなく、返された TypedDataRowに対して作成されたルールが作成されます。

次の規則が作成され、Northwind.Customers への SqlConnection を含む DataConnection がアサートされるとします。

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

エンジンは、 TypedDataTable セクションで使用される規則を評価すると、次のようなクエリを動的に構築します。

SELECT *  
FROM Northwind.Customers  
WHERE CustomerID = 1  

この条件を満たすのはデータベース内の 1 つの行だけなので、さらに処理するために 1 つの TypedDataRow のみが作成され、エンジンにアサートされます。

アサートされるエンティティとインスタンスの種類の要約

次の表は、さまざまな型のアサート動作をまとめたものです。アサートされた各エンティティのエンジンで作成された結果のインスタンスの数と、それらを識別するために各インスタンスに適用される型を示します。

Entity アサートされるインスタンスの数 インスタンスの種類
.NET オブジェクト 1 (オブジェクト自体) 完全修飾 .NET クラス
TypedXmlDocument 1 ~ N 個の TypedXmlDocument (作成されるセレクター バインドとドキュメントのコンテンツに基づく) DocumentType.Selector
TypedDataTable 1 ~ N 個の TypedDataRow

(DataTable の各 DataRow につき 1 個)
DataSetName.DataTableName
TypedDataRow 1 (アサートされる TypedDataRow) DataSetName.DataTableName
DataConnection 1 ~N 個 (DataConnection の照会によって返される各 TypedDataRow につき 1 個) DataSetName.DataTableName

参照

エンジン制御関数