Condividi tramite


Funzione di aggiornamento

Quando viene richiamata una funzione Update , l'oggetto viene rivalutato nel motore in base ai nuovi dati e allo stato. L'oggetto può essere di tipo TypedXmlDocument o .NET o DataConnection o TypedDataTable.

È anche possibile usare la funzione Update per migliorare le prestazioni del motore e impedire scenari di cicli infiniti, come descritto in questo argomento.

In genere, si usa Assert per inserire un nuovo oggetto nella memoria di lavoro del motore regole e usare Update per aggiornare un oggetto già esistente nella memoria di lavoro. Quando si asserisce un nuovo oggetto, vengono valutate le condizioni in tutte le regole. Quando si aggiorna un oggetto esistente, vengono rivalutate solo le condizioni che utilizzano il fatto aggiornato e le azioni vengono aggiunte all'agenda se queste condizioni vengono valutate su true.

Utilizzo della funzione di aggiornamento sui dati di .NET

Prendere le due regole che seguono come esempio. Si supponga che gli oggetti ItemA e ItemB esistano già in memoria di lavoro. La regola 1 valuta la proprietà Id in ItemA, imposta la proprietà Id su ItemB e quindi rivaluta ItemB dopo la modifica. Quando ItemB viene rivalutato, viene considerato come un nuovo oggetto e il motore valuta nuovamente tutte le regole che usano l'oggetto ItemB nei predicati o nelle azioni. Ciò garantisce che la regola 2 venga rivalutata rispetto al nuovo valore di ItemB.Id, come impostato nella regola 1. La regola 2 potrebbe non riuscire la prima volta che è stata valutata, ma restituisce true la seconda volta che viene valutata.

Regola 1

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

Regola 2

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

Questa capacità di reintrodurre gli oggetti nella memoria di lavoro consente all'utente di controllare esplicitamente il comportamento negli scenari di catene dirette. Un effetto collaterale della rivalutazione in questo esempio, tuttavia, è che anche la regola 1 viene rivalutata. Poiché ItemA.Id non è stato modificato, la regola 1 restituisce true e l'azione Assert(ItemB) viene nuovamente attivata. Di conseguenza, la regola crea una situazione di ciclo infinito.

Annotazioni

Il numero massimo di cicli predefinito della rivalutazione delle regole è 2^32. Per determinate regole, l'esecuzione dei criteri potrebbe durare per molto tempo. È possibile ridurre il conteggio modificando la proprietà Maximum Execution Loop Depth della versione dei criteri.

È necessario essere in grado di rivalutare gli oggetti senza creare cicli infiniti e la funzione Update fornisce questa funzionalità. Analogamente a una riasserzione, la funzione Update esegue Ritrazione e Conferma delle istanze di oggetto associate, che sono state modificate dalle azioni della regola, ma ci sono due differenze principali:

  • Le azioni all'ordine del giorno per le regole in cui il tipo di istanza viene usato solo nelle azioni (non nei predicati) rimarranno all'ordine del giorno.

  • Le regole che usano solo il tipo di istanza nelle azioni non verranno rivalutate.

    Pertanto, le regole che usano i tipi di istanza solo nei predicati o entrambi i predicati e le azioni verranno rivalutate e le relative azioni aggiunte all'agenda in base alle esigenze.

    La modifica dell'esempio precedente per l'uso della funzione Update garantisce che solo la regola 2 venga rivalutata perché ItemB viene usato nella condizione della regola 2. La regola 1 non viene rivalutata perché ItemB viene usato solo nelle azioni della regola 1, eliminando lo scenario di ciclo.

Regola 1

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

Regola 2

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

Tuttavia, è comunque possibile creare scenari di ciclo. Si consideri ad esempio la regola seguente.

Regola 1

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

Poiché ItemA viene usato nel predicato, viene rivalutato quando viene chiamato Update in ItemA. Se il valore di ItemA.Id non viene modificato altrove, la regola 1 continua a restituire true, provocando la chiamata nuovamente di Update su A. Il progettista delle regole deve assicurarsi che cicli, come questo, non vengano creati.

L'approccio appropriato per questo sarà diverso in base alla natura delle regole. Di seguito è riportato un meccanismo semplice per risolvere il problema nell'esempio precedente.

La funzione Update può essere usata in Business Rule Composer con un riferimento alla classe, come per le funzioni Assert, Retract o RetractByType .

Regola 1

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

L'aggiunta del controllo in ItemA.Value impedisce alla regola 1 di valutare di nuovo su true dopo che le azioni della regola 1 vengono eseguite la prima volta.

Uso della funzione Aggiorna sui dati XML

Prendere le due regole che seguono come esempio. Supponiamo che. La regola 1 valuta il conteggio totale degli articoli in un messaggio di ordine di acquisto e rule2 imposta lo stato su "Richiede approvazione" se il conteggio totale è maggiore o uguale a 10.

Regola 1

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

Regola 2

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

Se passi il seguente messaggio di ordine di acquisto (PO) come input a questo criterio, noterai che lo stato non è impostato su "Richiede approvazione" anche se il conteggio totale degli articoli è 14. Poiché la regola2 viene valutata solo all'inizio quando il valore del campo TotalCount è 0 e la regola non viene valutata ogni volta che viene aggiornato il conteggio totale disponibile. Per rivalutare le condizioni ogni volta che viene aggiornato TotalCount , è necessario chiamare la funzione Update nel nodo padre (Items) del nodo modificato (TotalCount). Se si modifica Rule1 come illustrato di seguito e lo si testa ancora una volta, verrà visualizzato il valore del campo Stato impostato su "Richiede approvazione".

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

La regola modificata 1 è la seguente:

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

Uso della funzione Update sui fatti del database

TypedDataTable

Se update viene chiamato in un oggetto TypedDataTable, update viene chiamato dal motore in tutti i typedDataRows associati. L'aggiornamento può anche essere chiamato su singoli TypedDataRows.

DataConnection

L'aggiornamento di dataConnection non è supportato. Usare invece Assert .

Vedere anche

Funzioni di controllo motore