Filtros con expresiones

<< Click to Display Table of Contents >>

Navigation:  Bizagi Studio > Asistente de Procesos > Reglas de Negocio > Ejemplos de reglas de negocio > Manejo de la interfaz de usuario >

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

 

note_pinConsideraciones

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.

 

Controls Properties27

 

 

Ejemplos de Filtros con expresiones

Filtros en combos

Filttos en tablas

 

Filtros en combos

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:

 

AdvancedFilters7

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 (expicon) dentro del campo Filtro.

 

AdvancedFilters8

 

Dé clic en Nuevo para crear una expresión.

 

ManagingUserInterface51

 

2. Una nueva ventana mostrará el editor de expresiones. Cree un módulo de expresión.

 

AdvancedFilters9

 

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.

 

AdvancedFilters10

 

 

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.

 

 

AdvancedFilters11

 

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.

 

 

AdvancedFilters12

 

Filterstring=Condition1 + " OR "+ Condition2;

 

6. Finalmente, retorne el filtro de la siguiente manera:

 

AdvancedFilters13

 

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 (expicon), dentro del campo Filtro.

 

AdvancedFilters1

 

Dé clic en Nuevo para crear una expresión.

 

ManagingUserInterface51

 

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.

 

AdvancedFilters2

 

 

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.

 

AdvancedFilters3

 

 

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.

 

AdvancedFilters14

 

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

 

CHelper18

 

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.

 

 

AdvancedFilters4

 

 

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

 

AdvancedFilters5

 

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

 

Filtros en tablas

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.

 

Forms Components218

 

2. En el diseñador de formas, definimos un filtro de expresión para el control de Tabla.

 

Forms Components88.

 

3. Dé clic en Nueva para crear un nuevo filtro basado en el resultado de una expresión. Agregue una nueva expresión.

 

Forms Components219

 

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.

 

Forms Components220

 

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.

 

Forms Components221