Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'asserzione è il processo di aggiunta di istanze di oggetti nella memoria di lavoro del motore di regole aziendali. Il motore elabora ogni istanza in base alle condizioni e alle azioni relativi al tipo di istanza, utilizzando le fasi di corrispondenza, risoluzione dei conflitti e azione.
Negli argomenti seguenti vengono descritti i comportamenti risultanti dall'uso della funzione Assert per tipi di fatti diversi.
Oggetti .NET
Ogni oggetto viene asserito nella memoria di lavoro come istanza separata. Ciò significa che l'istanza viene analizzata da ogni predicato che fa riferimento al tipo dell'oggetto ( ad esempio, IF Object.Property = 1). Viene inoltre resa disponibile per le azioni della regola che si riferiscono al tipo, in base ai risultati delle condizioni della regola.
Si consideri l'esempio seguente.
Regola 1
IF A.Value = 1
THEN A.Status = "good"
Regola 2
IF B.Value = 1
THEN A.Status = "good"
Nella regola 1, solo le istanze di A con valore 1 avranno la proprietà Status aggiornata. Nella regola 2, tuttavia, se la condizione restituisce true, tutte le istanze di A avranno lo stato aggiornato. Infatti, se sono presenti più istanze di B, le istanze A verranno aggiornate ogni volta che la condizione restituisce true per un'istanza B.
Per asserire un oggetto .NET dall'interno di una regola, è possibile aggiungere la funzione Assert predefinita come azione regola. Si noti che il motore delle regole ha una funzione CreateObject , ma non viene visualizzata come funzione separata in Business Rule Composer. La chiamata viene creata trascinando il metodo del costruttore dell'oggetto che si desidera creare dalla visualizzazione della Classe .NET di Esplora fatti al pannello delle azioni. Business Rule Composer converte quindi il metodo del costruttore in una chiamata CreateObject nella definizione della regola.
TypedXmlDocument
Quando viene asserito un TypedXmlDocument, il Motore delle Regole Aziendali crea delle istanze figlio di TypedXmlDocument in base ai selettori definiti nella regola.
I selettori e i campi sono entrambe espressioni XPath. È possibile considerare i selettori come un modo per isolare i nodi di un documento XML e i campi come identificazione di elementi specifici all'interno del selettore. Tutti i campi all'interno di un selettore vengono raggruppati come oggetto dal motore. Quando si seleziona un nodo nella scheda XML Schemi nell'Esploratore di fatti, il Business Rule Composer compila automaticamente la proprietà Selettore XPath per tutti i nodi e la proprietà Campo XPath per ogni nodo che non contiene nodi figlio. In alternativa, è possibile immettere le proprie espressioni XPath per XPath Selector e XPath Field , se necessario.
Se il selettore corrisponde a più parti del documento XML, più oggetti di questo tipo vengono inseriti o rimossi dalla memoria di lavoro del motore di regole. Si supponga di avere il codice XML seguente.
<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>
Se si usa il selettore /root/order (o //order), due oggetti vengono aggiunti alla memoria di lavoro.
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>
All'interno di ogni selettore, i singoli campi vengono indicati da XPaths.
Se si usa il selettore /root/order/item (o (/order/item o //item), quattro oggetti vengono aggiunti alla memoria di lavoro del motore regole, i due elementi per Joe e i due elementi per Jane.
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
Ogni oggetto ha accesso a tre campi, @name, @quantitye @cost. Poiché l'oggetto è un riferimento al documento originale, è possibile fare riferimento ai campi padre , ad esempio ".. /@customer").
È possibile usare più selettori all'interno dello stesso documento. Ciò consente di visualizzare parti diverse del documento( ad esempio, se una sezione è l'ordine e un'altra sezione contiene l'indirizzo di spedizione). Tenere tuttavia presente che gli oggetti creati vengono definiti dalla stringa XPath che li ha creati. L'uso di un'espressione XPath diversa, anche se si risolve nello stesso nodo, genera un TypedXmlDocument univoco.
Il motore regole supporta tipi scalari .NET di base in modo nativo, nonché oggetti per i tipi di riferimento. I documenti XML sono fondamentalmente testo, ma in base al tipo specificato al momento della compilazione della regola, il valore del campo può essere di qualsiasi tipo. Inoltre, poiché i campi sono espressioni XPath, possono restituire un set di nodi, nel qual caso il primo elemento del set è utilizzato come valore.
Dietro le quinte, il motore di regole può convertire un valore di campo di testo in uno dei tipi supportati tramite la funzione XmlConvert. È possibile specificare questa impostazione impostando il tipo in Business Rule Composer. Se non è possibile eseguire una conversione, viene generata un'eccezione. I tipi bool e double possono essere recuperati solo come tipo, stringhe o oggetti corrispondenti.
TypedDataTable
Quando un oggetto TypedDataTable viene asserito, tutti i DataRows contenuti in DataTable vengono automaticamente asseriti nel motore come TypedDataRows. Ogni volta che una tabella o una colonna di tabella viene utilizzata come argomento di regola, l'espressione viene valutata rispetto al singolo TypedDataRows e non a TypedDataTable.
Si supponga, ad esempio, di avere la regola seguente compilata in base a una tabella "Clienti":
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
Annotazioni
Per compilare una regola in base a una tabella di database, è necessario usare Tabella dati/riga come tipo di associazione di database.
Si supponga di inserire la seguente DataTable, composta da tre DataRows, nel motore (come TypedDataTable).
| ID Cliente | Titolo del contatto |
|---|---|
| 001 | Addetto/a ai Materiali |
| 002 | Addetto alla Fornitura |
| 003 | Impiegato addetto alle forniture |
Il motore inserisce tre TypedDataRows: 001, 002 e 003.
Ogni TypedDataRow viene valutato in modo indipendente rispetto alla regola. Il primo TypedDataRow soddisfa la condizione della regola e i secondi due hanno esito negativo. I risultati vengono visualizzati nel modo seguente.
| ID Cliente | Titolo di Contatto |
|---|---|
| 001 | Manager acquisti |
| 002 | Addetto alle forniture |
| 003 | Impiegato alle forniture |
Annotazioni
TypedDataRows può anche essere asserito direttamente nel motore. Questi vengono elaborati nello stesso modo descritto in precedenza.
DataSetName.DataTableName viene considerato un identificatore univoco. Pertanto, se un secondo TypedDataTable viene asserito con lo stesso nome dataset e il nome di DataTable , sostituisce il primo TypedDataTable. Tutti i TypedDataRow associati al primo TypedDataTable vengono ritirati e il secondo TypedDataTable viene definito.
DataConnection
Come per un oggetto TypedDataTable, il trascinamento di una tabella o di una colonna come argomento regola nel Business Rule Composer comporta regole compilate in base agli oggetti TypedDataRow restituiti, anziché alla DataConnection stessa.
Si supponga che venga creata la regola seguente e che venga asserita una connessione di DataConnection che contiene una SqlConnection su Northwind.Customers.
IF Northwind.Customers.CustomerID = 001
THEN Northwind.Customers.ContactTitle = "Purchasing Manager"
Quando il motore valuta la regola usata nella sezione TypedDataTable , compila dinamicamente una query simile alla seguente:
SELECT *
FROM Northwind.Customers
WHERE CustomerID = 1
Poiché solo una riga nel database soddisfa questo criterio, viene creata e asserta nel motore un solo typedDataRow per un'ulteriore elaborazione.
Riepilogo delle entità asserte e dei tipi di istanza
Nella tabella seguente viene riepilogato il comportamento di asserzione per i vari tipi, che mostra il numero di istanze risultanti create nel motore per ogni entità asserta, nonché il tipo applicato a ognuna di queste istanze per identificarli.
| Entità | Numero di istanze asserte | Tipo di istanza |
|---|---|---|
| Oggetto .NET | 1 (oggetto stesso) | Classe .NET completa |
| TypedXmlDocument | 1-N TypedXmlDocument(s): in base alle associazioni del selettore create e al contenuto del documento | DocumentType.Selector |
| TabellaDatiTipizzata | 1-N TypedDataRow(s): Uno per ciascun DataRow nel DataTable |
DataSetName.DataTableName |
| TypedDataRow | 1 (TypedDataRow affermato) | DataSetName.DataTableName |
| DataConnection | 1-N (uno per ogni TypedDataRow restituito eseguendo una query su DataConnection) | DataSetName.DataTableName |