Partager via


Fonction Mise à jour

Lorsque la fonction Update est appelée un objet, l’objet est réaffirmé dans le moteur pour être réévalué, en fonction des nouvelles données et de l’état. L’objet peut être de type TypedXmlDocument ou .NET class ou DataConnection ou TypedDataTable.

Vous pouvez également utiliser la fonction Update pour améliorer les performances du moteur et empêcher les scénarios de boucle sans fin, comme décrit dans cette rubrique.

En règle générale, vous utilisez Assert pour placer un nouvel objet dans la mémoire de travail du moteur de règles et utilisez Update pour mettre à jour un objet déjà existant dans la mémoire de travail. Lorsque vous déclarez un nouvel objet, les conditions dans tous les règles sont évaluées. Lorsque vous mettez à jour un objet existant, seules les conditions utilisant le fait mis à jour sont réévaluées, et les actions sont ajoutées à l'agenda si ces conditions ont la valeur True.

Utilisation de la fonction Mettre à jour sur les faits .NET

Prenons l'exemple des deux règles suivantes. Supposons que les objets ItemA et ItemB existent déjà dans la mémoire de travail. La règle 1 évalue la propriété Id sur ItemA, définit la propriété Id sur ItemB, puis réaffirme ItemB après la modification. Lorsque ItemB est réaffirmé, il est traité comme un nouvel objet et le moteur réévalue toutes les règles qui utilisent l’objet ItemB dans les prédicats ou les actions. Cela garantit que la règle 2 est réévaluée par rapport à la nouvelle valeur de ItemB.Id, comme défini dans la règle 1. La règle 2 a peut-être échoué la première fois qu’elle a été évaluée, mais elle a la valeur true la deuxième fois qu’elle est évaluée.

Règle 1

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

Règle 2

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

Cette possibilité de redéclarer les objets dans la mémoire de travail donne à l'utilisateur un contrôle explicite sur le fonctionnement des scénarios de chaînage avant. Dans cet exemple, l'effet secondaire de la nouvelle déclaration est la réévaluation de la règle 1. Étant donné que ItemA.Id n’a pas été modifié, la règle 1 est à nouveau évaluée à true et l’action Assert(ItemB) se déclenche à nouveau. Par conséquent, la règle crée une situation de boucle sans fin.

Notes

Le nombre maximal de boucles par défaut en cas de réévaluation des règles est de 2^32. Pour certaines règles, l’exécution de la stratégie peut durer longtemps. Vous pouvez réduire le nombre en ajustant la propriété Maximum Execution Loop Depth de la version de la stratégie.

Vous devez être en mesure de réaffirmer des objets sans créer de boucles infinies, et la fonction Update fournit cette fonctionnalité. Comme une nouvelle affirmation, la fonction Update effectue la rétraction et l’assertion des instances d’objet associées, qui ont été modifiées à partir d’actions de règle, mais il existe deux différences clés :

  • Les actions sur l'agenda pour les règles dans lesquelles le type d'instance n'est utilisé que dans les actions (pas les prédicats) resteront dans l'agenda.

  • Les règles qui n'utilisent que le type d'instance dans les actions ne seront pas réévaluées.

    Par conséquent, les règles qui utilisent les types d'instances dans les prédicats seulement ou dans les prédicats et les actions seront réévaluées et leurs actions seront ajoutées à l'agenda en conséquence.

    La modification de l’exemple précédent pour utiliser la fonction Update garantit que seule la règle 2 est réévaluée, car ItemB est utilisé dans la condition de la règle 2. La règle 1 n’est pas réévaluée, car ItemB est utilisé uniquement dans les actions de la règle 1, éliminant ainsi le scénario de boucle.

Règle 1

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

Règle 2

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

Toutefois, il reste possible de créer des scénarios de bouclage. Observez par exemple la règle suivante :

Règle 1

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

Étant donné que ItemA est utilisé dans le prédicat, il est réévalué lorsque Update est appelé sur ItemA. Si la valeur de ItemA.Id n’est pas modifiée ailleurs, la règle 1 continue d’évaluer la valeur true, ce qui entraîne l’appel de Mise à jour à nouveau sur A. Le concepteur de règles doit s’assurer que des scénarios de boucle tels que celui-ci ne sont pas créés.

L'approche à adopter dépendra de la nature des règles. Le mécanisme suivant permet de résoudre facilement le problème qui se pose dans l'exemple précédent.

La fonction Update peut être utilisée dans le Compositeur de règles métiers avec une référence à la classe, comme avec les fonctions Assert, Retract ou RetractByType .

Règle 1

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

L’ajout du case activée sur ItemA.Value empêche la règle 1 d’évaluer à nouveau la valeur true après la première exécution des actions de la règle 1.

Utilisation de la fonction Mettre à jour sur les faits XML

Prenons l'exemple des deux règles suivantes. Supposons que la règle 1 évalue le nombre total d'articles dans un message de bon de commande et la règle 2 définit l'état sur « Needs approval » si le nombre total est supérieur ou égal à 10.

Règle 1

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

Règle 2

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

Si vous passez le message de bon de commande suivant en tant qu’entrée à cette stratégie, vous remarquez que le status n’est pas défini sur « Nécessite une approbation », même si le nombre total d’articles est de 14. C’est parce que la règle2 est évaluée uniquement au début lorsque la valeur du champ TotalCount est 0 et que la règle n’est pas évaluée chaque fois que le nombre total disponible est mis à jour. Pour que les conditions soient réévaluées chaque fois que TotalCount est mis à jour, vous devez appeler la fonction Update sur le nœud parent (Items) du nœud modifié (TotalCount). Si vous modifiez la règle 1 comme illustré ci-dessous et testez cette règle une nouvelle fois, la valeur du champ État doit être définie sur « Needs Approval ».

<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 règle 1 modifiée est la suivante :

Règle 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)  

Utilisation de la fonction Mettre à jour sur les faits de base de données

TypedDataTable

Si Update est appelé sur un TypedDataTable, Update est appelé par le moteur sur tous les TypedDataRows associés. La mise à jour peut également être appelée sur un TypedDataRows individuel.

DataConnection

La mise à jour d’un DataConnection n’est pas prise en charge. Utilisez Assert à la place.

Voir aussi

Fonctions de contrôle de moteur