Acceder a entidades no relacionas con el modelo de datos

<< Clic para mostrar Tabla de Contenidos >>

Navegación:  Bizagi Studio > Asistente de Procesos > Reglas de Negocio > Elementos de las reglas de negocio > Elemento de expresiones >

Acceder a entidades no relacionas con el modelo de datos

Introducción

Es muy común tener que acceder a tablas paramétricas o del sistema que no estén relacionadas con el modelo de datos. Para utilizar su información en expresiones XPath.

En esos casos, donde las entidades no se puedan acceder directamente a través de navegación XPath, se debe utilizar la función entity-list. La función retorna una colección de ítems. Tendrá que iterar sobre la colección para acceder a información específica (i.e Los valores de un ítem).

 

note_pin

Es muy importante entender que entity-list solamente debe ser utilizado para tomar y trabajar con información que no está relacionada con el caso y que no puede ser accedida directamente a través de la navegación XPath.

 

Para utilizar la función entity-list tenga en cuenta la siguiente sintaxis.

 

Me.getXPath("entity-list('Entity','Filter')");

 

La función tiene dos parámetros obligatorios:

El parámetro Entity es el nombre de la entidad a la cual se va a acceder.

El parámetro Filter es utilizado bajo su criterio y puede estar vacío. Este parámetro filtra la entidad de acuerdo a ciertas condiciones.

Usted puede configurar Xpaths dentro de sus filtros, i.e., Entity-list('Customer', 'city.country.code =\"ES\"').

 

Los siguientes son operadores que se pueden utilizar durante la búsqueda,

 

OPERADOR

NOMBRE

EJEMPLO

=

Igual a

"Client =" +<Request.Client>

<>

Diferente

"ClientName <> \"John\""

>      >=

Mayor que/ Mayor o igual que

"Balance >= 600"

<      <=

Menor que/ Menor o igual que

"Balance <= 600"

AND

Y

"Minimum <= " + <Request.BorrowingCapacity> + " and Maximum >= " + <Request.BorrowingCapacity>

OR

O

"Minimum <= " + <Request.BorrowingCapacity> + " or Maximum >= 1000"

BETWEEN

Entre

"Balance BETWEEN 200 AND 500"

IN ()

En

"Balance in (500, 600, 700)"

IS NULL

Igual a nulo

"CityName IS NULL"

IS NOT NULL

Diferente de nulo

"CityName IS NOT NULL"

 

note_pin

Cuanto utilice valores de tipo texto, tenga en cuenta poner esté valore entre diagonales invertidas y comillas dobles, i.e Name = \"John\".

 

La función entity-list se encuentra en la categoría Navegación de Datos.

 

EntityManager1

 

¿Cómo acceder a la información de la entidad?

Recordemos que la entidad es retornada como una colección de ítems. La colección de la entidad debe ser guardada dentro de una variable para poder recorrerla.

Para identificar cuantos elementos tiene la colección se debe utilizar el comando size().

 

Recorra la colección utilizando un ciclo for de la siguiente manera:

 

 //Obtenga el identificador del registro

 var Entity = Me.getXPath("entity-list('Entity','Filter')");

 for(var Counter=0; Counter< Entity.size(); Counter++)

 {

         //Obtenga el valor del atributo del registro

         var Surrogate= Entity[Counter].getXPath("Id");

         var Value= Entity[Counter].getXPath("AttributeOfTheEntity");

 }

 

Ejemplo sin filtros

El proceso de Ingreso de Personal requiere que el solicitante se realice algunos exámenes médicos antes de firmar el contrato.

Los exámenes son guardados en una entidad paramétrica y posteriormente cargados a una colección cuando lo requiera el proceso.

 

El siguiente es el Modelo de Datos del proceso de Ingreso de Personal.

 

EntityManager3

 

La siguiente imagen muestra la lista de exámenes médicos que deben ser cargados dentro de la colección.

 

EntityManager2

 

1.  En el paso cuatro del Asistente, agregue una expresión al entrar de la tarea donde se cargan los exámenes.

 

2. Escriba el código de la regla de negocio para incluir los exámenes dentro de la colección.

Seleccione la función Get entity with entity-list de la categoría Navegación de Datos para acceder a las entidades paramétricas.

 

EntityManager4

 

//Evalúe si la colección tiene elementos

if(<count(Request.Applicant.ApplicantTests)> == 0)

{

 //Use la función entity-list para obtener todos los exámenes que han sido agregados a la colección        

 RequiredTest = Me.getXPath("entity-list('MedicalTest','')");

 //Itere la variable en la que se almacenen los exámenes

 for(var Counter=0; Counter < RequiredTest.size(); Counter++)

 {

         //Agregue cada examen a la colección

         NewTest = Me.newCollectionItem("Request.Applicant.ApplicantMedicalTests");

         NewTest.setXPath("MedicalTest",RequiredTest[Counter].getXPath("Id"));

 }

}

 

Ejemplo con filtro sencillo

Vamos a continuar utilizando el Proceso de Ingreso de Personal, donde un nuevo empleado debe practicarse algunos exámenes médicos antes de firmar el contrato.

Los exámenes son guardados en una entidad paramétrica y posteriormente cargados a una colección cuando lo requiera el proceso. Solamente los exámenes obligatorios deben ser incluidos dentro de la colección y el atributo Requerido debe ser marcado como verdadero.

 

El siguiente es el Modelo de Datos del proceso de Ingreso de Personal.

 

EntityManager3

 

La siguiente imagen muestra la lista de exámenes médicos que deben ser cargados dentro de la colección, aquellos marcados como requeridos.

 

EntityManager2

 

1.  En el paso cuatro del Asistente cree una acción al Entrar de la actividad donde se cargan los exámenes.

 

2. Escriba el código de la regla de negocio para incluir los exámenes dentro de la colección.

Seleccione la función Get entity with entity-list de la categoría Navegación de Datos para acceder a las entidades paramétricas.

 

EntityManager5

 

//Evalúe si la colección tiene elementos

if(<count(Request.Applicant.ApplicantTests)> == 0)

{

//Use la función entity-list para obtener todos los exámenes que serán agregados a la colección. Filtre los registros por el estado requerido

 RequiredTest = Me.getXPath("entity-list('MedicalTest','Required = true')");

//Itere la variable en la cual se almacenan los Exámenes.

 for(var Counter=0; Counter < RequiredTest.size(); Counter++)

 {

//Agregue cada examen a la colección.

         NewTest = Me.newCollectionItem("Request.Applicant.ApplicantMedicalTests");

         NewTest.setXPath("MedicalTest",RequiredTest[Counter].getXPath("Id"));

         NewTest.setXPath("Delivered",RequiredTest[Counter].getXPath("Required"));

 }

}

 

Ejemplo con un filtro complejo

Un banco solicita ciertos documentos durante el estudio de un crédito, de acuerdo a los ingresos del solicitante y su trabajo.

Los documentos que aplican para cada caso se guardan en una entidad llamada Documentos para el solicitantes. En cada caso, una regla debe analizar las propiedades del solicitante e incluir dentro de la colección los documentos que apliquen.

La entidad Documentos por solicitante no hace parte del modelo de datos del proceso. Por lo que es necesario utilizar la función entity-list para acceder a la información de la tabla y agregas los registros dentro de una entidad del Modelo de Datos.

 

A continuación se encuentra el Modelo de Datos para el caso.

 

EntityManager10

 

La siguiente es la entidad paramétrica que contiene la información a ser cargada.

 

EntityManager7

 

EntityManager8

 

EntityManager9

 

1.  En el paso cuatro del Asistente, cree una acción al Entrar de la actividad donde se cargan los documentos.

 

2. Escriba el código de la regla de negocio para incluir los documentos dentro de la colección.

Seleccione la función Get entity with entity-list de la categoría Navegación de Datos para acceder a las entidades paramétricas.

 

EntityManager6

 

//Cree un filtro para identificar el rol y la fuente de ingresos del solicitante

FilterDocs = "ApplicantRole = " + <Applicant.ApplicantRole.id> + " and IncomeSource = " +  <Applicant.IncomeSource.id>;

//Use la función entity-list para obtener los documentos que serán agregados a la colección. Filtre por el estado requerido.

DocsXApplicant = Me.getXPath("entity-list('DocumentXApplicant','"+FilterDocs+"')");

 

//Itere la variable en la que se almacenan los documentos

for(Count =0; Count < DocsXApplicant.size(); Count++)

{

 //Agregue cada documento a la colección

 IdDocument = DocsXApplicant[Count].getXPath("Document");

 ApplicantDocument = Me.newCollectionItem("Applicant.Documents");

 ApplicantDocument.setXPath("Document",IdDocument);

 ApplicantDocument.setXPath("Required",DocsXApplicant[Count].getXPath("Required"));

}

 

Ejemplo utilizando fechas en filtros

Una compañía dedicada a la producción de electrodomésticos utiliza Bizagi para gestionar las garantías de sus productos. Cuando un cliente reporta un problema con un electrodoméstico, un técnico evalúa y determina qué componente está causando la falla. Una vez identificado el componente defectuoso, la compañía procede a solicitar garantía al proveedor de dicho componente. Debido a que los proveedores cambian constantemente, se mantienen registros con el fin de identificar el período durante el cual, un determinado proveedor suministró un determinado componente. De esta manera, basados en la fecha de producción del electrodoméstico, la compañía mantiene una trazabilidad y puede identificar fácilmente a qué proveedor se debe solicitar la garantía.

 

A continuación se presenta el modelo de datos de este caso.

 

EntityManager11

Los registros históricos de los proveedores se almacenan en la entidad SuppliersTrace. Esta contiene el proveedor, el componente suministrado y el periodo de tiempo durante el cual ese proveedor suministró ese componente (a través de una fecha de inicio y fecha de fin del suministro).

 

Para obtener el proveedor que suministró un componente específico en una fecha específica, utilizaremos el método entity-list utilizando como parámetros la entidad SuppliersTrace y un filtro que identifica el componente y la fecha en la que este fue suministrado.

 

1.  En el paso cuatro del Asistente, cree una acción al Entrar de la actividad donde se identifica el proveedor.

 

2. Escriba el código de la regla de negocio para obtener el proveedor al que se debe solicitar garantía del componente.

Seleccione la función Get entity with entity-list de la categoría Navegación de Datos para acceder a las entidades paramétricas.

Observe cómo se define el filtro utilizando fechas.

 

EntityManager12

 

//Obtenga el componente y fecha de producción del electrodoméstico

var Component = <WarrantyRequest.Defectivecomponent>;
var ProductionDate = <WarrantyRequest.ProductionDate>;

//Convierta la fecha de producción a un string en el formato especificado

var ProductionDateStr = CHelper.FormatDate(ProductionDate, "yyyy-MM-dd");

//Construya el filtro

var Filter = "Component = "+ Component + " and SupplierFrom <= " + "\"" + ProductionDateStr + "\"" + " and SupplierTo > " + "\"" + ProductionDateStr + "\"";

//Utilice la función entity-list para obtener todos los proveedores que cumplen con el filtro. Esperamos solo un registro ya que solo un proveedor provee un componente en un periodo determinado.

var Suppliers = Me.getXPath("entity-list('SuppliersTraces','"+Filter+"')");

//Obtenga el registro del proveedor de la lista y guardelo en el atributo del proceso que identifica el proveedor al cual se solicita garantía

<WarrantyRequest.SupplierToClaim>=Suppliers[0].getXPath("Supplier");