Agregar funciones de control en acciones para optimizar la ejecución de reglas mediante Microsoft Rules Composer (versión preliminar)
Se aplica a: Azure Logic Apps (estándar)
Importante
Esta funcionalidad está en versión preliminar y está sujeta a las Condiciones de uso complementarias para las versiones preliminares de Microsoft Azure.
En esta guía, se describe cómo optimizar la ejecución de reglas mediante la adición de funciones de control a acciones en las reglas mediante Microsoft Rules Composer. Las funciones de control ayudan a la aplicación o al conjunto de reglas a controlar los hechos en la memoria de trabajo del motor de reglas. Entre estas funciones, se incluyen Assert, Clear, Halt, Retract, RetractByType, Reassert, and Update para el objeto .NET y las entidades TypedXmlDocument que puede usar como hechos. La existencia de hechos en la memoria de trabajo impulsa las condiciones que el motor evalúa y las acciones que se ejecutan.
Requisitos previos
Descargue e instale el Microsoft Rules Composer.
El archivo XML que contiene el conjunto de reglas sobre el que desea trabajar.
Para agregar hechos, especifique sus valores en los documentos XML que apunte desde la ventana Explorador del conjunto de reglas. O bien, puede usar un creador de hechos para proporcionar el motor de reglas con una matriz que contenga objetos .NET como hechos. Para más información, consulte Compilación de creadores y recuperadores de hechos.
Función Assert
Para agregar instancias de objeto a la memoria de trabajo del motor de reglas, use la función Assert en Microsoft Rules Composer. El motor procesa las instancias de objeto de acuerdo con las condiciones y acciones que se escriben en el tipo de instancia, mediante las fases de acción o resolución de conflictos o coincidencias.
En la tabla siguiente, se resume el comportamiento de la función Assert para las entidades declaradas y los tipos de instancia admitidos, incluyendo el número de instancias resultantes creadas en el motor para cada entidad declarada y el tipo aplicado a cada instancia para su identificación.
Entity | Número de instancias declaradas | Tipo de instancia |
---|---|---|
Objeto .NET | 1 (el objeto en sí) | Clase .NET completa |
TypedXmlDocument | 1-N TypedXmlDocument(s): basado en los enlaces del selector creados y el contenido del documento | DocumentType.Selector |
Aserción de un objeto .NET
El motor de reglas admite de forma nativa los tipos y objetos escalares básicos de .NET para los tipos de referencia. El procesamiento de objetos .NET impuestos es el tipo de procesamiento más sencillo.
En Microsoft Rules Composer, puede declarar un objeto .NET desde una regla.
En Microsoft Rules Composer, cargue el archivo XML que contiene el almacén de reglas en el que desea trabajar.
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Assert como una acción.
En la ventana Explorador de hechos, seleccione Clases de .NET.
En la pestaña Clases de .NET, arrastre el método constructor para el objeto que desea al argumento en la acción Assert.
Microsoft Rules Composer traduce el método de constructor en una llamada CreateObject de la definición de reglas.
Nota:
Aunque el motor de reglas tiene una función CreateObject, la función no aparece como una función independiente en Microsoft Rules Composer.
Cada objeto se afirma en memoria de trabajo como una instancia de objeto independiente, lo que significa que cada predicado que hace referencia al tipo del objeto, como IF Object.Property = 1
, analiza la instancia. La instancia también está disponible para acciones de regla que hagan referencia al tipo, en función de los resultados de las condiciones de regla.
Por ejemplo, supongamos que tiene las siguientes reglas:
Regla 1
IF A.Value = 1
THEN A.Status = "good"
Regla 2
IF B.Value = 1
THEN A.Status = "good"
En la Regla 1, solo las instancias A con un valor de 1 tienen actualizada su propiedad Status. Sin embargo, en la Regla 2, si la condición se evalúa como true, se actualizarán los estados de todas las instancias de A. De hecho, si existen varias instancias de B, las instancias de A se actualizarán siempre que la condición se evalúe como true en una instancia de B.
Aserción de una entidad TypedXmlDocument
En Microsoft Rules Composer, puede declarar una entidad TypedXmlDocument desde dentro de una regla.
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Assert como una acción.
En la ventana Explorador de hechos, seleccione Esquemas XML.
En la pestaña Esquemas XML, arrastre el nodo que desea al argumento en la acción Assert.
Los documentos XML son básicamente texto, pero los valores de campo pueden ser cualquier tipo, que se basa en el tipo especificado cuando se creó la regla. Los campos son expresiones XPath, por lo que pueden devolver un conjunto de nodos, lo que significa que el primer elemento del conjunto se usa como valor.
Cuando se declara una entidad TypedXmlDocument como un hecho, el motor de reglas crea instancias secundarias TypedXmlDocument, en función de los selectores definidos en la regla. Los selectores pueden considerarse una forma de aislar los nodos en un documento XML, y los campos pueden usarse como elementos específicos de identificación en el selector. El motor de reglas agrupa todos los campos dentro de un selector como un objeto.
Los selectores también son expresiones XPath. En el Explorador de hechos, cuando selecciona un nodo en la pestaña Esquemas XML, Microsoft Rules Composer rellena automáticamente la propiedad Selector XPath en todos los nodos, y la propiedad Campo XPath en los nodos que no contengan nodos secundarios. También puede especificar expresiones XPath propias en Selector XPath y Campo XPath, si fuera necesario. Si el selector coincide con varias partes del documento XML, varios objetos de este tipo se imponen en la memoria de trabajo del motor de reglas o se retiran de ella.
Puede usar varios selectores en el mismo documento. De esta manera, puede ver distintas partes del documento; por ejemplo, en el caso de que una sección sea el pedido y otra contenga la dirección de envío. No obstante, tenga en cuenta que los objetos creados se definen mediante la cadena XPath que los ha creado. Si usa otra expresión XPath, el resultado es una entidad TypedXmlDocument única, incluso si la expresión se resuelve en el mismo nodo.
Por ejemplo, supongamos que tiene el siguiente 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>
Si usa el selector /root/order u //order, se agregan los siguientes objetos a la memoria de trabajo del motor:
Objeto 1
<order customer="Joe">
<item name="router" quantity="10" cost="550" />
<item name="switch" quantity="3" cost="300" />
</order>
Objeto 2
<order customer="Jane">
<item name="switch" quantity="1" cost="300" />
<item name="cable" quantity="23" cost="9.99" />
</order>
Dentro de cada selector, XPaths hace referencia a los campos individuales. Por tanto, si usa el selector /root/order/item, //order/item o //item, los siguientes objetos se agregan a la memoria de trabajo del motor con dos elementos para Joe y los dos elementos para Jane:
<root>
<order customer="Joe">
</order>
<order customer="Jane">
</order>
</root>
Cada objeto puede tener acceso a tres campos: @name, @quantity y @cost. Puede hacer referencia a los campos principales porque el objeto constituye una referencia en el documento original, por ejemplo, ../@customer.
En segundo plano, el motor de reglas puede convertir un valor de campo de texto en cualquiera de los tipos compatibles a través de la función XmlConvert. Puede especificar esta opción al establecer el tipo en Microsoft Rules Composer. Si no es posible una conversión, el motor produce una excepción. Puede recuperar los tipos bool y double solo como su tipo respectivo, ya sea cadenas u objetos.
Función clear
Para restablecer la memoria de trabajo y la agenda de una instancia del motor de reglas, use la función Clear en Microsoft Rules Composer. Para más información sobre la memoria de trabajo y la agenda, consulte Optimización del motor de reglas.
Restablecer la memoria de trabajo y la agenda del motor de reglas
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla en la que desea borrar la memoria de trabajo y la agenda del motor de reglas.
En el panel THEN, en Acciones, agregue la función integrada Clear como una acción.
La función Clear no toma ningún argumento.
Función halt
Para detener la ejecución actual por parte del motor de reglas, use la función Halt en Microsoft Rules Composer.
Detener la ejecución del conjunto de reglas
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla en la que desea detener la ejecución del conjunto de reglas.
En el panel THEN, en Acciones, agregue la función integrada Halt como una acción.
La función Halt toma un único argumento booleano. Si especifica el valor como true, el motor de reglas borra la agenda que contiene las reglas candidatas pendientes.
El método Ruleset.Execute es un contenedor alrededor del método RuleEngine.Execute y usa código similar al código siguiente:
RuleEngine.Assert(facts);
RuleEngine.Execute();
RuleEngine.Retract(facts);
Si usa el método Ruleset.Execute para ejecutar un conjunto de reglas, el motor de reglas devuelve el control al método Ruleset.Execute cuando se ejecuta la función Halt. El método Ruleset.Execute retira los hechos y devuelve el control al autor de la llamada. En este caso, la ejecución del conjunto de reglas detenido no se puede reanudar.
Sin embargo, si usa directamente el método RuleEngine.Execute para ejecutar el conjunto de reglas, puede reanudar la ejecución del conjunto de reglas detenido y activar la siguiente regla pendiente al llamar a RuleEngine.Execute de nuevo, siempre y cuando no retire los objetos necesarios entre las dos llamadas.
Nota:
El método Ruleset.Execute almacena en caché las instancias del motor de reglas para mejorar el rendimiento. Si usa directamente el método RuleEngine.Execute, las instancias del motor de reglas no se almacenan en caché.
En el código de ejemplo siguiente, se muestra cómo reanudar la ejecución del conjunto de reglas detenido:
// Assert facts into working memory of the rules engine instance.
RuleEngine.Assert(facts);
// Execute the ruleset.
RuleEngine.Execute();
// The ruleset invokes the Halt method when executing actions.
// Control returns here when the Halt function is called.
// When engine halts, do the following tasks.
// Add your code here.
// Resume the halted rules engine execution.
RuleEngine.Execute();
// Retract or remove facts from working memory in the rules engine.
RuleEngine.Retract(facts);
Función Retract
Para quitar objetos de un conjunto de reglas y de la memoria de trabajo del motor de reglas, use la función Retract en Microsoft Rules Composer.
Retirar un objeto .NET
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Retract como una acción.
En la ventana Explorador de hechos, seleccione Clases de .NET.
En la pestaña Clases de .NET, arrastre la clase que desee, no al ensamblado o al método, en el argumento del parámetro Retract.
Si arrastra un método a la función Retract, el motor intenta retirar el objeto que devuelve el método.
La retirada de un objeto .NET tiene el siguiente impacto:
Las acciones de la agenda que utilizan los objetos se quitan de la agenda.
Nota:
Es posible que ya se hayan ejecutado otras acciones superiores en el orden del día antes de usar la función Retract.
Las acciones de las reglas que utilizan el objeto en un predicado se retiran de la agenda, si existe alguna acción en la agenda.
El motor ya no evalúa el objeto.
Retirar una entidad o entidades TypedXmlDocument
Puede retirar la entidad TypedXmlDocument original que se afirmó en el motor de reglas o puede retirar una de las entidades secundarias TypedXmlDocument creadas a partir de la entidad primaria XmlDocument.
Supongamos que tiene el siguiente XML de ejemplo:
<order>
<orderline customer="Joe" linenumber="001">
<product name="router" quantity="10" cost="550" />
</orderline>
<orderline customer="Jane" linenumber="002">
<product name="switch" quantity="1" cost="300" />
</orderline>
</order>
Puede retirar la entidad TypedXmlDocument asociada a un objeto de order, o bien puede retirar una o ambas de las entidades TypedXmlDocument asociadas al objeto orderline. Todas las entidades TypedXmlDocument están asociadas a la entidad TypedXmlDocument de nivel superior que se declaró originalmente, no con la entidad TypedXmlDocument que aparece encima de ese nodo TypedXmlDocument de la jerarquía del árbol XML.
Por ejemplo, product es una entidad TypedXmlDocument debajo del objeto orderline y está asociada a la entidad TypedXmlDocument para order, no a la entidad TypedXmlDocument para orderline. En la mayoría de los casos, esta distinción no es importante. Sin embargo, si retira el objeto order, los objetos orderline y product también se retiran. Si retira el objeto orderline, solo se retira ese objeto y no el objeto product.
El motor solo funciona con y realiza un seguimiento de las instancias de objeto, que son instancias TypedXmlDocument, que el motor creó cuando se afirmó inicialmente l entidad TypedXmlDocument . Si crea nodos adicionales, como nodos relacionados para un nodo seleccionado a través de un selector en el conjunto de reglas, estos nodos no se evalúan en reglas a menos que se creen y declaren entidades TypedXmlDocument para ellos. Si declara estas nuevas instancias de TypedXmlDocument de nivel inferior, el motor evalúa las instancias de las reglas, pero la entidad TypedXmlDocument de nivel superior no tiene conocimientos sobre ellas. Cuando se retira el TypedXmlDocument de nivel superior, las entidades nuevas TypedXmlDocument impuestas de forma independiente, no se retiran automáticamente. Como resultado, si se crean nuevos nodos, realice una operación Retract y Reassert en el XmlDocument completo, que es el paso típico y más sencillo que se debe realizar.
La clase TypedXmlDocument proporciona métodos útiles que puede llamar dentro de un miembro personalizado de .NET como parte de una acción. Estos métodos incluyen la capacidad de hacer que el XmlNode se asocie con el TypedXmlDocument o el TypedXmlDocument primario.
Retirar la entidad TypedXmlDocument de nivel superior
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Retract como una acción.
En la ventana Explorador de hechos y seleccione Esquemas XML.
En la pestaña Esquemas XML, arrastre el nodo de nivel superior para el esquema al argumento de la función Retract.
Este nodo superior termina en la extensión .xsd y representa el nodo raíz del documento, no el nodo del elemento de documento. El nodo tiene un selector / que hace referencia al TypedXmlDocument inicial. Al retirar el TypedXmlDocument primario, todas las entidades secundarias TypedXmlDocument asociadas a TypedXmlDocument se quitan de la memoria de trabajo, incluidas todas las entidades TypedXmlDocument creadas al llamar a la función Assert, en función de los selectores usados en el conjunto de reglas.
Retirar una entidad TypedXmlDocument secundaria
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Retract como una acción.
En la ventana Explorador de hechos y seleccione Esquemas XML.
En la pestaña Esquemas XML, arrastre el nodo secundario al argumento de la función Retract.
Función RetractByType
Para quitar todos los objetos con el tipo especificado de la memoria de trabajo del motor de reglas, use la función RetractByType en Microsoft Rules Composer. Esta función difiere de la función Retract, que quita solo elementos específicos con un tipo determinado.
Retirar todos los objetos .NET con un tipo específico
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada RetractByType como una acción.
En la ventana Explorador de hechos, seleccione Clases de .NET.
En la pestaña Clases de .NET, arrastre la clase al argumento de la función RetractByType.
Retirar todas las entidades TypedXmlDocument con un tipo específico
RetractByType quita todas las entidades TypedXmlDocument con el mismo DocumentType.Selector.
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada RetractByType como una acción.
En la ventana Explorador de hechos, seleccione Esquemas XML.
En la pestaña Esquemas XML, arrastre el nodo adecuado a la función RetractByType.
Coherente con la función Retract, si usa la función RetractByType en el nodo raíz del documento, no solo retira todas las entidades TypedXmlDocument impuestas con ese DocumentType, sino también con todas las entidades TypedXmlDocument secundarias o nodos XmlNode de la jerarquía de árbol, asociadas a esas entidades TypedXmlDocument primarias.
Función Reassert
Para llamar a la función Assert en un objeto que ya existe en la memoria de trabajo del motor, use la función Reassert en Microsoft Rules Composer. El comportamiento es equivalente a emitir un comando Retract para el objeto, seguido de un comando Assert.
Por ejemplo, si usa la función Reassert en un objeto .NET, el motor de reglas realiza los pasos siguientes:
Retirar el objeto .NET de la memoria de trabajo.
Quite todas las acciones del programa para las reglas que usan el objeto en un predicado o una acción.
Imponga el objeto .NET en memoria de trabajo y evalúelo como un objeto recién impuesto.
Vuelva a evaluar las reglas que usen el objeto en un predicado y agregue las acciones de esas reglas a la agenda según corresponda.
Lea las acciones en el orden del día para las reglas que se han evaluado previamente como true y solo usan el objeto en sus acciones.
Restablecer un objeto .NET
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Reassert como una acción.
En la ventana Explorador de hechos, seleccione Clases de .NET.
En la pestaña Clases de .NET, arrastre la clase al argumento de la función Reassert.
Restablecer una entidad TypedXmlDocument
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Reassert como una acción.
En la ventana Explorador de hechos, seleccione Esquemas XML.
En la pestaña Esquemas XML, arrastre el nodo de entidad que desea al argumento en la función Reassert.
Si vuelve a declarar una entidad TypedXmlDocument de nivel superior, las entidades secundarias TypedXmlDocument, que se crearon cuando la entidad TypedXmlDocument de nivel superior se declaró por primera vez, puede comportarse de forma diferente, en función del estado de cada entidad secundaria TypedXmlDocument.
Por ejemplo, si una entidad secundaria nueva o existente tiene cambios sin guardar, lo que significa que al menos un campo se cambió en el conjunto de reglas mediante una acción, se realiza una función Assert o Reassert en ese elemento secundario. Cualquier elemento secundario existente que no tenga cambios sin guardar permanece en la memoria de trabajo.
Nota:
Un nodo no se marca como con cambios sin guardar ("dirty") por operaciones externas que el motor no conoce; por ejemplo, si una aplicación externa agrega, elimina o actualiza ese nodo mediante programación.
En el ejemplo siguiente, se muestra un escenario simplificado que describe los comportamientos de la entidad secundaria cuando se vuelve a asegurar su entidad primaria. Supongamos que tiene las siguientes entidades TypedXmlDocument en memoria de trabajo: Parent, Child1, Child2 y Child3.
- Parent es la entidad TypedXmlDocument de nivel superior.
- Cada elemento secundario contiene un campo denominado ExampleField donde el valor se establece en 1, por ejemplo,
Child1.ExampleField
= 1`.
Supongamos que una acción de regla realiza las siguientes operaciones en las entidades secundarias:
- El valor ExampleField para Child2 se actualiza de 1 a 0.
- El código de usuario elimina Child3.
- El código de usuario agrega una nueva entidad secundaria TypedXmlDocument denominada NewChild a Parent.
En el ejemplo siguiente, se muestra la nueva representación de objetos en memoria de trabajo:
Parent
Child1 // Where Child1.ExampleField = 1
Child2 // Where Child2.ExampleField = 0
NewChild
Supongamos que vuelve a aplicar la entidad Parent, lo que da como resultado los siguientes comportamientos de entidad secundaria:
- Child2 se vuelve a declarar porque ahora tiene cambios sin guardar después de actualizar su campo.
- Child3 se retira de la memoria de trabajo.
- NewChild se declara en la memoria de trabajo.
- Child1 permanece sin cambios en la memoria de trabajo porque no se actualizó antes de que se volvivera a declarar el elemento primario.
Función Update
Para volver a declarar un objeto en el motor de reglas para la reevaluación, en función de los nuevos datos y el estado, use la función Update en Microsoft Rules Composer. El objeto puede tener el tipo de clase .NET o el tipo TypedXmlDocument. También puede usar la función Update para mejorar el rendimiento del motor y evitar escenarios de bucles infinitos.
Importante
El número máximo de bucles predeterminado para la reevaluación de reglas es 2^32, por lo que para determinadas reglas, la ejecución del conjunto de reglas puede durar mucho tiempo. Para reducir el número de bucles, cambie la propiedad Profundidad máxima del bucle de ejecución en la versión del conjunto de reglas.
Actualización de un objeto .NET
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Update como una acción.
En la ventana Explorador de hechos, seleccione Clases de .NET.
En la pestaña Clases de .NET, arrastre la clase al argumento de la función Update.
Por lo general, se usa Assert para colocar un nuevo objeto en la memoria de trabajo del motor de reglas y se usa Update para actualizar un objeto que ya existe en la memoria de trabajo. Cuando se declara un nuevo objeto como un hecho, el motor vuelve a evaluar las condiciones de todas las reglas. Sin embargo, al actualizar un objeto existente, el motor vuelve a evaluar solo las condiciones que usan el hecho actualizado y agrega acciones a la agenda, si estas condiciones se evalúan como true.
Por ejemplo, supongamos que tiene las siguientes reglas y que los objetos denominados ItemA y ItemB ya existen en la memoria de trabajo.
La Regla 1 evalúa la propiedad Id en ItemA, establece la propiedad Id en ItemB y, a continuación, vuelve a imponer ItemB después del cambio. Cuando ItemB se vuelve a declarar, el motor trata ItemB como un nuevo objeto y vuelve a evaluar todas las reglas que usan ItemB en los predicados o acciones. Este comportamiento garantiza que el motor vuelva a evaluar la Regla 2 con el nuevo valor de ItemB.Id tal como se establece en la Regla 1.
Regla 1
IF ItemA.Id == 1 THEN ItemB.Id = 2 Assert(ItemB)
La Regla 2 podría producir un error en la primera evaluación, pero se evalúa como true durante la segunda evaluación.
Regla 2
IF ItemB.Id == 2 THEN ItemB.Value = 100
La funcionalidad de volver a imponer objetos en la memoria de trabajo le da control explícito sobre el comportamiento en los escenarios de encadenamiento directo. Sin embargo, en este ejemplo, se revela un efecto secundario de la acción de volver a declarar, que provoca que también se vuelve a evaluar la Regla 1. Puesto que ItemA.Id no se cambió, la Regla 1 vuelve a evaluar en true y la acción Assert(ItemB) se vuelve a activar. En consecuencia, la regla crea una situación de bucle infinito.
Impedir bucles sin fin
Usted debe ser capaz de restablecer objetos sin crear bucles infinitos. Para evitar estos escenarios, puede usar la función Update. Al igual que la función Reassert, la función Update realiza las funciones Retract y Assert en las instancias de objeto asociadas que cambian mediante acciones de regla, pero con las siguientes diferencias clave:
En el orden del día, las acciones para las reglas permanecen en la agenda cuando el tipo de instancia solo se usa en las acciones, no en los predicados.
Las reglas que solo usan el tipo de instancia en las acciones no se vuelven a evaluar.
Como resultado, las reglas que usan los tipos de instancia, ya sea en solo los predicados o en los predicados y las acciones, se vuelven a evaluar y las acciones de las reglas se agregan a la agenda según corresponda.
Al cambiar el ejemplo anterior para usar la función Update, puede asegurarse de que el motor vuelva a evaluar solo la Regla 2 porque la condición de la Regla 2 usa ItemB. El motor no vuelve a evaluar la Regla 1 porque ItemB solo se usa en las acciones de la Regla 1*, lo que elimina el escenario de bucle.
Regla 1
IF ItemA.Id == 1
THEN ItemB.Id = 2
Update(ItemB)
Regla 2
IF ItemB.Id == 2
THEN ItemB.Value = 100
A pesar de usar la función Update de esta manera, todavía existe la posibilidad de crear escenarios de bucle. Por ejemplo, considere la siguiente regla:
IF ItemA.Id == 1
THEN ItemA.Value = 20
Update(ItemA)
El predicado usa ItemA, por lo que el motor vuelve a evaluar la regla cuando se llama a Update en ItemA. Si el valor de ItemA.Id no se cambia en otro lugar, la Regla 1 continúa evaluando como true, lo que hace que se vuelva a llamar a Update en ItemA.
Como diseñador de reglas, debe asegurarse de evitar la creación de estos escenarios de bucle. El enfoque adecuado para solucionar este problema difiere en función de la naturaleza de las reglas.
En el ejemplo siguiente, se muestra una manera sencilla de resolver el problema en el ejemplo anterior agregando una comprobación en ItemA.Value que impide que la regla se evalúe de nuevo como true después de que las acciones de la regla se ejecuten por primera vez.
IF ItemA.Id == 1 and ItemA.Value != 20
THEN ItemA.Value = 20
Update(ItemA)
Actualización de una entidad TypedXmlDocument
En la ventana Explorador del conjunto de reglas, busque y seleccione la regla que desee.
En el panel THEN, en Acciones, agregue la función integrada Update como una acción.
En la ventana Explorador de hechos, seleccione Esquemas XML.
En la pestaña Esquemas XML, arrastre el nodo de entidad que desea al argumento en la función Update.
Por ejemplo, supongamos que tiene las siguientes reglas:
La Regla 1 evalúa el recuento total de los artículos en un mensaje de pedido de compra.
IF 1 == 1 THEN ProcessPO.Order:/Order/Items/TotalCount = (ProcessPO.Order:/Order/Items/TotalCount + ProcessPO:/Order/Items/Item/Count)
La Regla 2 establece el estado en "Necesita aprobación" si el recuento total es mayor o igual que 10.
Regla 2
IF ProcessPO.Order:/Order/Items/TotalCount >= 10 THEN ProcessPO.Order:/Order/Status = "Needs approval"
Si pasa el siguiente mensaje de pedido de compra como entrada para este conjunto de reglas, observe que el estado no está establecido en "Necesita aprobación", aunque TotalCount es 14. Este comportamiento se produce porque la Regla 2 solo se evalúa al principio cuando el valor TotalCount es 0. La regla no se evalúa cada vez que se actualiza TotalCount.
<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>
Para que el motor vuelva a evaluar las condiciones cada vez que se actualice TotalCount, debe llamar a la función Update en el nodo primario (Items) para el nodo actualizado (TotalCount). Si cambia la Regla 1 de la siguiente manera y prueba la regla una vez más, el campo Estado se establece en "Necesita aprobación":
Regla 1 (actualizada)
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)