<< Clic para mostrar Tabla de Contenidos >> Filtros con expresiones |
En algunas situaciones puede ser necesaria la definición de filtros complejos que no pueden ser configurados directamente desde el editor de expresiones booleanas. Para estos casos, Bizagi permite definir Filtros Avanzados usando expresiones.
Los filtros avanzados se pueden definir para los siguientes controles:
•Combo
•Radio
•Lista
•Búsqueda
•Sugerencia
•Tablas
Las expresiones utilizadas para definir estos filtros utilizan sentencias de base datos, por esta razón, estas siempre deben retornar un valor del tipo string.
Recomendamos que el filtro sea retornado en una variable que contenga el filtro. También puede retornar una sentencia que debe siempre estar entre comillas dobles, así:
"(ProveedorFrecuente=true AND Calificación> 0,85)"
Cuando se comparan atributos Booleanos, tenga en cuenta utilizar true (verdadero) o false (falso) en minúsculas y sin comillas: p.e AtributoBooleano = true; Los valores de tipo cadena de texto deben ser definidos utilizando comillas simples, evite el uso de las mismas para otros valores. En los siguientes ejemplos utilizaremos sentencias de SQL (AND, OR, LIKE, <>, IN, etc).
Consideraciones |
•No se soportan filtros dentro de filtros. •Si está usando una expresión, el nombre de la misma será mostrado en el cajón izquierdo de la propiedad, Si el nombre es muy largo para ser mostrado, ponga el puntero sobre este cajón para mostrar el nombre completo de la expresión.
|
Ejemplos de Filtros con expresiones
Definir un filtro combinando AND/OR
Cuando usted necesita definir filtros cuyas condiciones se enlazan únicamente con un operador (AND/OR) usted puede utilizar el editor de expresiones booleanas. Sin embargo, cuando usted necesita que estas condiciones estén enlazadas por combinaciones de operadores AND/OR, usted debe utilizar Filtros avanzados.
Consideremos una situación donde usted requiere evaluar condiciones enlazadas por operadores AND/OR simultáneamente con el fin de definir los valores que se mostrarán en una lista desplegable.
En un Proceso de solicitud de compra, el administrador de compras debe seleccionar el proveedor para los productos solicitados de un control tipo combo. Los proveedores entre los cuales este puede ser seleccionado (valores mostrados en el combo), deben cumplir con los siguientes requerimientos.
- Si el proveedor es un proveedor frecuente entonces su reputación debe ser mayor al 85%.
- Si el proveedor es un proveedor no frecuente entonces su reputación debe ser mayor al 95%.
Observe que estos requerimientos se pueden expresar como dos condiciones diferentes enlazadas por un operador OR. Así mismo, cada condición esta compuesta por dos sub-condiciones enlazadas por un operador AND.
Para identificar si un proveedor es frecuente y para determinar su reputación, la entidad maestra Proveedor posee, entre otros, los siguientes atributos:
Para definir este filtro sobre el combo de Proveedor seleccionado, siga los pasos que se describen a continuación:
1. Abra el Diseñador de Formas desde el Asistente de Procesos, en la actividad donde se encuentra el control a ser filtrado.
Seleccione el control deseado (en este caso Proveedor seleccionado) y acceda a la pestaña Avanzado. Dé clic en el icono expresión () dentro del campo Filtro.
Dé clic en Nuevo para crear una expresión.
2. Una nueva ventana mostrará el editor de expresiones. Cree un módulo de expresión.
3. Declare las siguientes variables:
•Condition1: almacena el texto relacionado al filtro de la primera condición (Proveedor frecuente Y reputación > 0,85).
•Condition2: almacena el texto relacionado al filtro de la segunda condición (Proveedor no frecuente Y reputación > 0,95).
•Filterstring: es el texto del filtro que se aplicará a los valores del control.
4. Defina el texto para cada condición. Observe que en este caso utilizamos sentencias AND para enlazar las sub-condiciones de cada una.
Cada condición debe ser escrita entre comillas dobles.
Condition1="FrequentSupplier=true AND Rating > 0,85"
Condition2="FrequentSupplier=false AND Rating > 0,95"
5. Construya el texto del filtro a aplicar. Observe que este enlaza las dos condiciones construidas previamente utilizando un operador OR.
los operadores deben ser escritos entre comillas dobles.
Filterstring=Condition1 + " OR "+ Condition2;
6. Finalmente, retorne el filtro de la siguiente manera:
Filterstring;
Dé clic en OK para guardar los cambios.
Filtrar por Rol un combo relacionado a una entidad WFUSER
Los Filtros avanzados también son útiles para filtrar valores relacionados a atributos WFUser, de acuerdo a propiedades de usuario como Roles, Posiciones o Habilidades.
Suponga que en un Proceso de Mesa de ayuda la persona de soporte que recibe un reporte (ticket), debe asignarlo a uno de los técnicos calificados. Para hacerlo, esta persona selecciona un técnico de una lista desplegable (control tipo combo) denominado Asignar a, por lo que este control debería mostrar únicamente los usuarios que posean el rol de Técnico de Soporte.
Para filtrar los valores mostrados en este control, necesitamos establecer un Filtro avanzado que muestre los técnicos calificados de la entidad WFUser, basado en su rol.
Este filtro debe seguir la siguiente estructura:
idUser IN (idTech1,idTech2,idTech3....idTechN)
Donde idUser es la llave foránea de la entidad WFUser en base de datos, e IN es una sentencia SQL.
En consecuencia, la expresión utilizada para definir este filtro debe obtener, de alguna manera, un texto que contenga la sentencia básica (idUser in) seguida por los identificadores de los usuarios que posean el rol especifico, separados por comas y entre paréntesis (idTech1,idTech2,idTech3....idTechN).
Para hacerlo, siga los pasos que se describen a continuación:
1. Abra el Diseñador de Formas desde el Asistente de Procesos, en la actividad donde se encuentra el control a filtrar.
En la pestaña Avanzado dé clic en el icono de expresión (), dentro del campo Filtro.
Dé clic en Nuevo para crear una expresión.
2. En la expresión principal, cree Experto de expresión y un módulo For como se muestra a continuación.
•En el primer módulo de expresión declare las variables y obtenida la lista de usuarios con el Rol específico.
•Utilice el módulo For para iterar sobre cada registro de la lista.
•En el segundo módulo de expresión obtenga el texto de los identificadores de los usuarios que poseen el Rol.
•En el último módulo de expresión, construya el texto del filtro y aplíquelo.
3. En el primer módulo de expresión declare las siguientes variables:
•UsersArray: Guarda la lista de usuarios que pertenecen a un Rol específico.
•IterationIndex: Contador para el ciclo FOR.
•TempIdUser: Guarda temporalmente un registro específico de la lista de usuarios.
•newRow: Crea un nuevo registro en la relación donde se incluirá el usuario.
4. Obtenga la lista de usuarios que poseen el Rol (en este caso, el Técnico de Soporte) buscado utilizando la función Get users in Role que se encuentra en la categoría Usuarios de la lista de funciones.
//Obtenga la lista de usuarios con el Rol específico y guárdelo en la variable
UsersArray=CHelper.getUsersForRole("SupportTechnician");
5. Itere la lista utilizando un elemento FOR. El ciclo comienza en Cero (0) y termina en el último índice de la lista.
La sentencia UsersArray.Count regresará el número total de usuarios encontrados (es decir, cuenta los elementos del arreglo).
El ciclo será ejecutado mientras que el índice de la colección sea menor que el número total de elementos del arreglo.
6. Incluya el siguiente código en el segundo módulo de expresión para obtener el texto de los identificadores de los usuarios con el rol específico, en el formato requerido.
Observe que esta es solo una manera de hacerlo.
//Obtenga el identificador del usuario actual de la iteración
CurrentUserid=UsersArray(IterationIndex);
//Construya el texto utilizado para filtrar el combo
//Si el usuario actual no es el primer usuario de la lista
if (UsersIds!= null )
{
//Si el usuario actual no es el último usuario de la lista
if (IterationIndex!=(UsersArray.Count-1))
{
UsersIds=UsersIds+CurrentUserid+",";
}
//Si el usuario actual es el último usuario de la lista
else
{
UsersIds=UsersIds+CurrentUserid+")";
}
}
//Si el usuario actual es el primer usuario de la lista
if (UsersIds== null )
{
UsersIds="("+CurrentUserid+",";
}
7. En el último módulo de expresión construya el texto del filtro y aplíquelo tal como se muestra a continuación.
//Concatenar la sentencia del filtro con los identificadores de los usuarios que poseen el rol especificado
Filterstring="idUser in "+UsersIds;
//Aplíque el filtro
Filterstring;
Dé clic en OK para guardar los cambios.
En un proceso de Solicitud de Compras, el supervisor del solicitante debe aprobar una solicitud de un producto cuando se cumpla una de las siguientes condiciones:
•Un producto tiene costo unitario mayor que $1.000 y la cantidad es mayor a 100 unidades
O
•El precio total de un producto es mayor a $5.000 y su cantidad es menor a 100 unidades.
El supervisor debe ver únicamente los productos que él debe aprobar, por lo tanto, se necesita una tabla filtrada.
Se configura una tabla en la forma y se necesita una expresión de filtro para cumplir con los requerimientos de negocio.
1. En el Portal de Trabajo, se muestra la Tabla con la lista completa de productos sin filtros.
Vamos a crear un filtro para mostrar únicamente la información relevante.
2. En el diseñador de formas, definimos un filtro de expresión para el control de Tabla.
.
3. Dé clic en Nueva para crear un nuevo filtro basado en el resultado de una expresión. Agregue una nueva expresión.
4. Una vez el elemento de expresión se ha abierto, agregue el siguiente código para filtrar la tabla.
"(UnitPrice > 1000 AND Quantity > 100) OR (TotalPrice > 5000 AND Quantity < 100)"
Observe que la última parte de la expresión es lo que se retorna y debe estar escrito entre comillas dobles.
5. Guarde la expresión y la Forma.
6. Cuando se actualice el Portal de Trabajo, podemos ver que la tabla muestra únicamente dos productos relevantes que cumplen con las condiciones del filtro.
Last Updated 1/10/2023 3:18:08 PM