Usando XPath
De
<keywords content="keywords"> getXPath, setXPath, Me.getXPath, Me.setXPath, addRelation </keywords>
Contenido |
¿Cómo Construir Expresiones XPath?
Bizagi como una herramienta BPM esta destinada a ser muy intuitiva y a permitir la automatización ágil de los procesos de negocio y sus subsecuentes modificaciones con una el objetivo de tener un mejoramiento continuo.
Con este objetivo en mente, Bizagi presenta el concepto de XPath, el cual es un mecanismo para estandarizar el lenguaje en la herramienta y hace el manejo de reglas del negocio sea más intuitivo para todos los involucrados.
El estándar XPath es el resultado del esfuerzo para construir un lenguaje de navegación en XML que sea facil de usar, el cual es útil para llevar acabo tareas complejas. Bizagi incorporó este estándar es su lenguaje, permitiendo al usuario llevar acabo tareas comunes sobre Entidades de Negocio, así como asignaciones, consultas, y navegación sobre entidades de negocio.
Adicionalmente, XPath ofrece la posibilidad de llevar a cabo operaciones por medio de las funciones que este posee y establece condiciones de forma intuitiva para obtener datos de forma filtrada.
Obtener información con XPath
< XPath expression >
Las expresiones XPath están escritas entre '<' y '>'.
Estas SIEMPRE empiezan con la Entidad de Proceso como el primer atributo y navegan el modelo de datos usando puntos entre los atributos.
La imagen de arriba será usada como guía para mostrar las Expresiones Xpath.
Una Solicitud de Crédito tiene una Entidad de Proceso llamada Solicitud (Request). A partir de esta entidad se realiza la navegación del modelo de datos, usando XPath.
Cada Solicitud tiene un Cliente y varias Garantías (Esta es una relación uno a muchos, o colección).
Utilizando XPath usted puede obtener el valor almacenado en un atributo o asignarle uno.
Para los siguiente ejemplos utilizaremos una variabe denominada VariableEjemplo para almacenar el valor de un atributo.
Para obtener el Valor de la Solicitud, use la expresión:
<Request.TotalValueRequest>
Para obtener el nombre del cliente asociado a la solicitud, utilice la expresión:
<Request.Clients.Name>
Para encontrar el identificador del Cliente que hace la Solicitud, use la expresión:
<Request.Clients.id>
En este caso, usted tiene que usar el atributo id para poder obtener el identificador de la entidad, ya que la expresión <Request.Clients> se refiere al Cliente de la Solicitud, y no a su identificador. Todas las entidades de Bizagi tienen un atributo "escondido" llamado id, que esta relacionado a la llave de la entidad.
Asignar valores con XPath
La forma más fácil para asignar un valor a un elemento es usando el operador "=".
<Client.Name>= "Peter" Asigna el nombre "Peter" al cliente
<Request.TotalValueRequested> = 1000 Asigna 1,000 al Valor Total Solicitado
Ejemplos
De acuerdo a cómo se escriba un XPath usted puede obtener el valor de un atributo o asignarle uno.
- Variable = <BusinessEntity.Attribute>
Almacena el atributo en la Variable
- <BusinessEntity.Attribute> = Variable
Asigna el valor de la Variable al atributo.
El diagrama muestra las relaciones que existen entre cuatro entidades en las que se pueden usar las siguientes expresiones XPath:
Xpath |
Significado |
<Request.RequestAuthorization> |
Cuando RequestAuthorization es un tipo de atributo booleano la expresión es verdadera o falsa (true ó false) y se interpreta como La solicitud es aprobada? |
<Request.Clients.Age> |
La edad del cliente (Age) es un atributo de tipo entero. |
<Request.TotalValueRequested> |
TotalValueRequested es un atributo de tipo moneda. La expresión es el monto Total de la Solicitud |
Para acceder a la información dentro de las entidades que tienen una relación de uno a muchos (1:N), es necesario usar el nombre de la relación, o Fact. Si hay una relación de uno a muchos, la expresión XPath representará un conjunto de valores.
Guarantees es el nombre del fact entre la Solicitud (Request) y las Garantias (Guarantees).
Xpath |
Significado |
<Request.Guarantees> |
Conjunto de garantías de la solicitud |
<Request.Guarantees.GuaranteedValue> |
Conjunto de valores de todas las garantías de la solicitud |
<Request.Guarantees.Type.Code> |
Código de todas las garantías de la solicitud |
Acceder a colecciones con XPath
Para acceder a información almacenada en las entidades que tienen relaciones 1-N, es necesario utilizar el nombre de la relación o Fact. El nombre de la relación es utilizado para navegar desde la entidadd del proceso a la coleción. Si hay una relación 1-N,la expresión XPath representará un conjunto de valores.
El nombre de la relación es la mostradda en la flecha que conecta las dos entidades en las “Guarantees”, y es utilizada para acceder a la colección. En este caso accede a todas las garantias de la solicitud.
- VariableEjemplo =<Request.Guarantees>
Obtiene todas las garantias de la solicitud.
- VariableEjemplo = <Request.Guarantees.GuaranteedValue>
Adicionalmente, el atributo GaranteedValue se especificó, lo cual retornará una colección de valores a las Garantias de la Solicitud.Por lo tanto ExampleVariable almacenará una colección de todos los GuaranteedValues de las Garantias relacionadas a la Solicitud.
Filtrar colecciones utilizando XPath
Las colecciones pueden ser filtradas para obtener conjuntos de valores mas pequeños para manipular. Los filtros son una poderosa herramiento que restringe el número de elementos que se representan en una expresión XPath. Filtro
<BusinessEntity.Fact[Filter]>
Los filtros se escriben entre llaves: '[' ']'
Cuando se filtra una colección, los atributos dentro de las llaves pertenecen a la entidad de la colección. De nuevo usted puede navegar a través de ellos utilizando un punto y asignando condiciones tales como mayor que o igual a , para obtener el conjunto deseado de valores.
Los siguientes son ejemplos de filtros en nuestra colección de Garantías:
Expresión |
Significado |
<Request.Guarantees[Type.Type = 'Mortgage']> |
Conjunto de Garantías de tipo Hipoteca |
<Request.Guarantees[GuaranteedValue > 10000 AND GuaranteedValue < 15000]> |
Conjunto de garantías con valores entre 10000 y 15000 |
Nota: En las expresiones XPath el atributo "id" es usado para comparar valores contra identificadores de atributos, o llaves foráneas. El filtro CORRECTO compara los valores del identificador con un número <Request.Guarantees[Type.id= 1]> |
Asignación masiva de valores:Para asignar un valor a varios ítems de una colección.
<Request.Guarantees[Type.Type = 'Mortgage'].Value> = 5000
Todas las Garantías de Hipoteca tendrán un valor de 5000
Consulte FILTROS para mayor informacion y ejemplos de como filtrar colecciones
Consulte Funciones XPath para mayor información sobre cálculos de XPath
Funciones getXPath y setXPath
Ademas de las llaves, usted también puede navegar a través del modelo de datos para obtener un conjunto de valores utilizando Xpath con las siguientes funciones (El Xpath debe ir entre comillas):
Me.getXPath("XPath")
'Me.setXPath('"XPath",value)
Usted puede utilizar < > llaves o las funciones mencionadas indistintamente.
Las siguientes expresiones son equivalentes:
VariableEjemplo = <Request.Clients.Age>
VariableEjemplo = Me.getXPath("Request.Clients.Age")
<Request.Clients.Age> = VariableEjemplo
Me.setXPath("Request.Clients.Age",VariableEjemplo)
Funciones getXPath y setXPath
Además de la navegación XPath usando brackets de diamante es posible también recorrer el modelo de datos son las siguientes funciones (el XPath debe estar entre comillas dobles):
Me.getXPath("XPath")
Me.setXPath('"XPath",value)
Usted puede usar los brackets de diamante o la función indistinamente.
Las siguientes expresiones son exactamente equivalentes:
VariableEjemplo= <Request.Clients.Age>
VariableEjemplo = Me.getXPath("Request.Clients.Age")
<Request.Clients.Age> = VariableEjemplo
Me.setXPath("Request.Clients.Age",VariableEjemplo)
Usando setXPath y getXPath en colecciones
Cuando las colecciones deben ser filtradas utilizando variables es NECESARIO utilizar las funcionessetXPath y getXPath . En esos filtros las llaves no pueden ser utilizadas. '< >' .
A continuación se muestra cómo se deben utilizar las variables:
Me.getXPath("BusinessEntity.Fact[AttributeName= "+ variable +"]")
Utilizando con un ejemplo anterior, si el tipo de Garantía fue almacenado en una variale, la asignación masiva de un valor a todas las garantias de ese tipo sería:
var GuaranteeType = 'Mortgage'
Me.setXPath("Request.Guarantees[Type.Type = "+ GuaranteeType +"].Value",5000)
Consulte FILTROS para mayor informacion y ejemplos de como filtrar colecciones
Agregar elementos a una relación
Para crear nuevas filas en una grilla (insertar registros en una colección) dentro de una regla de negocio, Bizagi cuenta con una función denominada "addRelation" en el objeto Me.
Por ejemplo, la siguiente sentencia se utiliza en una regla para agregar un nuevo registro a la entidad GuaranteeRequest:
Me.addRelation(“Request.Guarantees”);
La línea de arriba creará una nueva fila de GuaranteeRequest. Una vez la nueva fila se crea, los valores para los atributos de la entidad GuaranteeRequest se pueden setear:
var newGuarantee= Me.addRelation(“idRequest.Guarantees”);
newGuarantee.setXPath(“Value”,5000);
A continuación se presentan los elementos de la sentencia addRelation:
Elemento |
Descripción |
newGuarantee |
Variable que tiene la nueva garantía |
Me |
Contexto de la la entidad usada en addRelation. Cuando Me es usado, la expresión XPath comienza con la entidad de la aplicación. |
idRequest.Guarantees |
XPath de la relación sobre la cual el elemento es agregado. Guarantees es el nombre del Fact que relaciona la entidad Request y la entidad Guarantees, en la relación de uno a muchos (1:N) |
Nota: Como se enseña en el ejemplo anterior, nótese que se utilizan los métodos .setXPath y .getXPath para asignar u obtener los valores del nuevo registro creado. Por ejemplo, se puede obtener el Id asignado automáticamente (surrogate key), por medio de: newGuarantee.getXPath("id");. |
La función addRelation puede ser también usada para agregar elementos a una relación de muchos a muchos (NxM), identificando la llave foránea del elemento a agregar:
var newGuarantee = Me.addRelation(“Request.Guarantees”, 18);
En este caso, la garantía 18 será agregada a la relación Request_GuaranteeReq.
Ejemplo: En un proceso de Solicitud de Compra, un usuario crea la solicitud y luego el jefe tiene que aprobarla. La solicitud puede necesitar cambios, ser aprobada o rechazada. Las Observaciones de la aprobación son una colección, relacionadas a la solicitud. Se debe crear un registro de esta aprobación para que el jefe pueda ingresar sus observaciones. |
Ejemplo: En un proceso de Inventario, todos los productos tienen que ser subidos desde una Tabla de entidad paramétrica a una tabla con una relación de uno a muchos en el caso de Inventarios. |
El siguiente es el modelo de datos del ejemplo. Note que Inventario es la Entidad de Proceso Principal y tiene una relación de uno a muchos con Productos. Sin embargo, el nombre del fact es Office Supplies (material de oficina).
1. Agregue una evento de entrada (On Enter) en la primera actividad del proceso.
2. Cree la Expresión.
La entidad Paramétrica debe ser invocada usando CentityManager, guardando el arreglo en una variable. Esto se hace porque no hay relación entre los datos del caso y la entidad que contiene toda la información de los productos al momento de crear el caso.
Cuando todos los productos son guardados en la variable Products, navegue a través del arreglo agregando cada producto a la relación.
Esto se hace usando la función addRelation.
Finalmente, agregue el Producto a la relación usando la función setXPath. El objeto producto (ProductID) debe ser fijado en el atributo que relaciona al Producto con la Entidad Paramétrica Supply (Materiales).
3. Así luciría la interfaz del usuario
Información avanzada
Si el usuario está trabajando con colecciones y se debe asignar un valor a un registro en especial, en este caso a una sola Garantía, lo primero es seleccionar dicho registro, el n-ésimo para este ejemplo.
Asuma que en la expresión (o regla) se tiene una variable var TotalRows (Total de filas) que guarda el número total de registros que tiene la colección.
- La siguiente expresión accede al registro n-ésimo, en este caso al registro correspondiente al número total de filas (TotalRows).
Se debe enviar a la expresión el registro n-ésimo -1 ya que la expresión cuenta la colección como si comenzara en el registro cero (0).
Guarantees.get(TotalRows-1).setXPath("Value", 30000)
- La siguiente expresión accede al n-ésimo registro filtrando la colección. En este caso, esta expresión accede al primer registro como la fila 1(uno). El usuario debe enviar el n-ésimo registro, no el n-esimo-1 como en la expresión anterior.
Me.setXPath("Request.Guarantees["+TotalRows+"].Value",30000)
Artículos relacionados
<comments />