Partager via


Fonction de mise à jour

Lorsque la fonction Update est invoquée sur un objet, celui-ci est réintroduit dans le moteur pour être évalué en fonction des nouvelles données et de l’état. L’objet peut être de type TypedXmlDocument ou classe .NET, 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 de toutes les règles sont évaluées. Lorsque vous mettez à jour un objet existant, seules les conditions qui utilisent le fait mis à jour sont réévaluées et les actions sont ajoutées à l’ordre du jour si ces conditions sont évaluées à true.

Utilisation de la fonction Update sur les données .NET

Prenez les deux règles qui suivent comme exemple. Supposons que les objets ItemA et ItemB existent déjà en 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établit ItemB après la modification. Lorsque ItemB est réappréscrit, 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 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 peut avoir échoué la première fois qu’elle a été évaluée, mais prend 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 réinscrire les objets en mémoire de travail permet à l’utilisateur de contrôler explicitement le comportement dans les scénarios de chaînage avant. Toutefois, un effet secondaire de la réévaluation dans cet exemple est que la règle 1 est également réévaluée. Étant donné que ItemA.Id n’a pas été modifié, la règle 1 renvoie à nouveau la valeur true et l’action Assert(ItemB) se déclenche à nouveau. Par conséquent, la règle crée une situation de boucle infinie.

Remarque

Le nombre maximal de boucles par défaut de réévaluation des règles est 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é Profondeur de boucle d’exécution maximale de la version de stratégie.

Vous devez pouvoir répéter les 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 inscrites à l'ordre du jour concernant les règles où le type d'instance est exclusivement utilisé dans les actions (par opposition aux prédicats) resteront à l'ordre du jour.

  • Les règles qui utilisent uniquement 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 uniquement ou les prédicats et les actions seront réévaluées et leurs actions ajoutées à l’ordre du jour selon les besoins.

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

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 est toujours possible de créer des scénarios en boucle. Par exemple, considérez 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 La mise à jour est appelée sur ItemA. Si la valeur de ItemA.Id n’est pas modifiée ailleurs, la règle 1 continue d’être évaluée sur true, ce qui entraîne l’appel de la mise à jour une fois de plus sur A. Le concepteur de règles doit s’assurer que les scénarios de bouclage tels que ceux-ci ne sont pas créés.

L’approche appropriée sera différente en fonction de la nature des règles. Voici un mécanisme simple pour résoudre le problème dans l’exemple précédent.

La fonction Update peut être utilisée dans business Rule Composer 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 de la vérification sur ItemA.Value empêche la règle 1 d’évaluer à nouveau la valeur true une fois que les actions de la règle 1 sont exécutées la première fois.

Utilisation de la fonction Mise à jour sur les faits XML

Prenez les deux règles qui suivent comme exemple. Supposons que. La règle 1 évalue le nombre total d’éléments dans un message de bon de commande, et la règle2 définit l’état sur « Besoin d’approbation » 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 transmettez le message de bon de commande suivant en tant qu’entrée à cette règle, vous remarquez que l’état n’est pas défini sur « Besoin d’approbation », même si le nombre total d’éléments est de 14. Cela est dû au fait 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 (Éléments) du nœud modifié (TotalCount). Si vous modifiez la règle1 comme indiqué ci-dessous et que vous la testez une fois de plus, vous devez voir la valeur du champ État défini sur « Besoin d’approbation ».

<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 Update sur les faits de base de données

Table de Données Typées

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

DataConnection

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

Voir aussi

Fonctions de contrôle du moteur