<< Clic para mostrar Tabla de Contenidos >> CEntityManager |
Este artículo ofrece una descripción general de los objetos CEntityManager y CEntity, que se emplean en la creación de reglas de negocio script para acceder a la información de la entidad sin depender de XPaths. El objeto CEntityManager resulta beneficioso para recuperar registros e información general directamente almacenados en las entidades de Bizagi. Al mismo tiempo, el objeto CEntity proporciona funciones para realizar operaciones con información de la entidad.
Las funciones del objeto CEntityManager utilizadas para obtener o modificar entidades y sus atributos son:
FUNCIÓN |
DESCRIPCIÓN |
SINTAXIS |
---|---|---|
Comprueba si hay una instancia de entidad basándose en un nombre de entidad determinado sEntName y el ID de instancia de entidad (valor de llave Surrogate) oSurrogateKeyValue. La función devuelve un valor booleano, verdadero si se encuentra la instancia y falso en caso contrario. |
CEntityManager.ExistsEntityInstance(sEntName, oSurrogateKeyValue)
•sEntName: String que contiene el nombre de la entidad. •oSurrogateKeyValue: Entero que contiene el ID de la instancia. |
|
GetEntity (objeto vacío) |
Obtiene un objeto CEntity vacío de la entidad sEntName especificada, que se puede utilizar al agregar nuevos registros. |
CEntityManager.GetEntity(sEntName)
•sEntName: String que contiene el nombre de la entidad. |
GetEntity |
Obtiene una instancia de entidad con un nombre de entidad sEntName y el ID de instancia de entidad (valor de llave Surrogate) oSurrogateKeyValue. La función devuelve un objeto CEntity con valores, que se pueden utilizar al actualizar o eliminar la instancia. |
CEntityManager.GetEntity(sEntName, oSurrogateKeyValue)
•sEntName: String que contiene el nombre de la entidad. •oSurrogateKeyValue: Entero que contiene el ID de la instancia. |
Obtiene una instancia de entidad dada una ruta de atributo sEntPath y el ID de instancia de entidad (valor de llave Surrogate) oSurrogateKeyValue. La función devuelve un objeto CEntity, que se puede utilizar al actualizar o eliminar la instancia. |
CEntityManager.GetEntityFromPath(sEntPath, oSurrogateKeyValue)
•sEntPath: String que contiene la ruta al atributo considerando el contexto actual. •oSurrogateKeyValue: Entero que contiene el ID de la instancia. |
|
Configura un atributo sAttribName con un nuevo valor oAttribValue dada una instancia de entidad sEntityName y el ID de instancia de entidad (valor de llave Surrogate) oSurrogateKeyValue. |
CEntityManager.setAttrib(sEntityName, oSurrogateKeyValue, sAttribName, oAttribValue)
•sEntityName: String que contiene el nombre de la entidad. •oSurrogateKeyValue: Entero que contiene el ID de la instancia. •sAttribName: String con el nombre del atributo a configurar. •oAttribValue: Objeto con el nuevo valor de atributo. |
|
Obtiene el valor de un atributo de una entidad dado el nombre de la entidad sEntityName, el ID de instancia de entidad (valor de llave Surrogate) oSurrogateKeyValue y el nombre del atributo sAttribName. La función devuelve un objeto con el valor del atributo. |
CEntityManager.getAttrib(sEntityName, oSurrogateKeyValue, sAttribName)
•sEntityName: String que contiene el nombre de la entidad. •oSurrogateKeyValue: Entero que contiene el ID de la instancia. •sAttribName: String con el nombre del atributo a obtener. |
Las funciones setAttrib y getAttrib también están disponibles en el objeto CHelper. |
Las funciones del objeto CEntity utilizadas para realizar operaciones con información de entidades son:
FUNCIÓN |
DESCRIPCIÓN |
SINTAXIS |
---|---|---|
Agrega una nueva instancia de entidad. |
oEntity.Add() |
|
Actualiza valores de propiedad que hayan cambiado para una instancia de entidad en la base de datos. |
oEntity.Update() |
|
Elimina una instancia de entidad. |
oEntity.Delete() |
|
Configura un valor oNewValue para el último atributo de una ruta determinada sPath. |
oEntity.SetAttribValue(sPath, oNewValue)
•sPath: String con la cadena de atributos relacionados utilizados para llegar a la entidad del atributo. •oNewValue: Objeto con el nuevo valor del atributo.
Nota: El objeto oEntity no debe estar vacío y ya debe estar instanciado, ya sea mediante la función CEntityManager.GetEntity, CEntityManager.GetEntityFromPath o Add. |
|
Obtiene el valor del último atributo de una ruta determinada sPath. La función devuelve un objeto con el valor del atributo. |
oEntity.GetAttribValue(sPath)
•sPath: String con la cadena de atributos relacionados utilizados para llegar a la entidad del atributo.
Nota: El objeto oEntity no debe estar vacío y ya debe estar instanciado, ya sea mediante la función CEntityManager.GetEntity, CEntityManager.GetEntityFromPath o Add. |
|
Obtiene una lista de registros para la entidad especificada. La lista se puede filtrar especificando el nombre del atributo sFilterAttrib y su valor correspondiente oFilterValue, o proporcionando un texto de filtro sFilterText. Además, la lista se puede ordenar especificando el nombre del atributo sOrderAttrib. La función devuelve un array CEntity que contiene los registros encontrados. |
oEntity.GetEntityList(sFilterAttrib, oFilterValue, sFilterText, sOrderAttrib)
•sFilterAttrib: String que contiene el nombre del atributo usado para filtrar. •oFilterValue: Objeto con el valor usado para filtrar. •sFilterText: String cque contiene el filtro utilizando el formato de cláusula WHERE (es decir, WHERE <condiciones>). •sOrderAttrib: String que contiene el nombre del atributo usado para ordenar. |
|
Obtiene el número de registros de una entidad, dado un filtro específico sFilterText. |
oEntity.GetEntityListCount(sFilterText)
•sFilterText: String cque contiene el filtro utilizando el formato de cláusula WHERE (es decir, WHERE <condiciones>). |
Esta sección ofrece una serie de ejemplos que ilustran cómo utilizar las diversas funciones CEntityManager explicadas anteriormente.
Para verificar la existencia de un registro o instancia de entidad dentro de la entidad Maestra mLiability Master en función de un valor de llave Surrogate determinado (1356), emplee la siguiente sintaxis:
var bEntityInstanceCheck = CEntityManager.ExistsEntityInstance("mLiability", 1356);
Después de la ejecución, el resultado es true si existe una instancia con SurrogateKeyValue = 1356; de lo contrario, devuelve false.
Alternativamente, puede realizar esta validación usando la función entity-list:
var oLiabObject = Me.getXPath("entity-list('mLiability','idmLiability = 1356')");
var ObjectSize = oLiabObject.size();
Si el valor de ObjectSize es mayor que cero, significa que la instancia existe.
Usted debe acceder a la entidad Maestra mLiability mediante el XPath mLiabilityCollect.kmSingleLiability.
La función requiere el Id (SurrogateKeyValue) de la entidad raíz (es decir, mLiabilityCollect).
La sintaxis es la siguiente:
var iLiabSGTKValue = <mLiabilityCollect.Id>;//SurrogateKeyValue de la entidad raíz
//Para obtener el objeto mLiability vinculado a la entidad raíz
var oEntFrmPathObjct = CEntityManager.GetEntityFromPath("mLiabilityCollect.kmSingleLiability", iLiabSGTKValue);
//Para obtener el monto del objeto mLiability vinculado a la entidad raíz
var cLiabilityAmount = oEntFrmPathObjct.Attributes["cAmount"].Value;
//Para obtener el valor de la llave Surrogate del objeto mLiability vinculado a la entidad raíz
var iLiabilitySGKV = oEntFrmPathObjct.SurrogateKeyValue;
En la entidad Maestra mLiability, usted debe actualizar el valor almacenado en el atributo sLiabilityStatus de un registro, utilizando el valor de llave Surrogate del registro (idmLiability = 901). El valor actual es Pending Collection y debe actualizarlo a Collected.
La sintaxis es la siguiente:
CEntityManager.setAttrib("mLiability", 901, "sLiabilityStatus", "Collected");
La función setAttrib no es soportada por la función Me.getXPath("entity-list()"). |
Alternativamente, si el ID del registro de entidad está disponible o se ha obtenido previamente, puede usar la función CHelper.setAttrib de la siguiente manera:
CHelper.setAttrib("mLiability", 901, "sLiabilityStatus", "Collected");//Configura un valor en el atributo sLiabilityStatus para el registro con idmLiability = 901
En la entidad Maestra mLiability, debe obtener el valor almacenado en el atributo DebtorID para un registro, utilizando el valor de llave Surrogate del registro (idmLiability = 901).
La sintaxis es la siguiente:
var DebtorID = CEntityManager.getAttrib("mLiability", 901, "iDebtorID");
Como alternativa, puede utilizar la función entity-list:
var oLiability = Me.getXPath("entity-list('mLiability', 'idmLiability = 901')");
for(var j = 0; j < oLiability.size(); j++){
var oLiabRecord = oLiability.get(j);
var DebtorID = oLiabRecord.getXPath("iDebtorID");
}
Asimismo, si el Id del registro de la entidad está disponible o se ha obtenido previamente, puede utilizar la función CHelper.getAttrib de la siguiente manera:
var DebtorID = CHelper.getAttrib("mLiability", 901, "iDebtorID");//Obtiene el DebtorID para el registro con idmLiability = 901
Esta sección ofrece una serie de ejemplos que ilustran cómo utilizar las diversas funciones de CEntity explicadas anteriormente:
Usted debe iterar sobre los registros de la entidad mPendingLiability que se han seleccionado para procesamiento. El criterio de filtrado se basa en un único atributo bSelect4Processing.
Para obtener todos los registros que coinciden con los criterios de filtrado, debe utilizar la función GetEntityList. La sintaxis es la siguiente:
var oPndngLblty = CEntityManager.GetEntity("mPendingLiability").GetEntityList("bSelect4Processing","true", "","");
Alternativamente, puede recuperar los registros utilizando la función entity-list:
var oPndngLblty = Me.getXPath("entity-list('mPendingLiability','bSelect4Processing = true')");
Cuando se utiliza un filtro con más de un criterio:
La sintaxis debe ser la siguiente:
var oEntEntityNameList = CEntityManager.GetEntity("mLiability").GetEntityList("", "", "dDueDate BETWEEN '2023-05-01' AND '2023-06-30' AND iUncollected = 1", "");
También puede obtener los registros utilizando la función entity-list:
var oPndngLblty = Me.getXPath("entity-list(mLiability,' dDueDate BETWEEN '2023-05-01' AND '2023-06-30' AND iUncollected = 1')");
Puede contar la cantidad de registros existentes en una entidad utilizando la función GetEntityListCount. Utilice condiciones de filtrado para contar el número de registros coincidentes o no incluya criterios de filtrado para obtener el número total de registros.
Opción 1 – con filtros
var oLiabCllct = CEntityManager.GetEntity("mLiabilityCollect");
var iLiabCollectCount = oLiabCllct.GetEntityListCount("bLiabDataLoad = true");
Opción 2 – sin filtros
var oLiabCllct = CEntityManager.GetEntity("mLiabilityCollect");
var iLiabCollectCount = oLiabCllct.GetEntityListCount("");
Filtros
Al construir filtros, puede utilizar operadores y fechas de la siguiente manera:
Operadores
Puede utilizar los siguientes operadores en los filtros:
OPERADOR |
NOMBRE |
EJEMPLO |
---|---|---|
= |
Igual a |
idClient = <idClient> |
<> |
Diferente |
ClientName <> 'John' |
> |
Mayor que |
balance > 600 |
< |
Menor que |
balance < 600 |
>= |
Mayor o igual que |
balance >= 600 |
<= |
Menor o igual que |
balance <= 600 |
AND |
Y |
balance >= 600 AND idClient = <idClient> |
OR |
O |
balance = 600 OR balance = 100 |
BETWEEN |
Entre |
balance BETWEEN 200 AND 500 |
IN () |
En |
balance IN (600, 650, 700) |
IS NULL |
Igual a nulo |
CityName IS NULL |
IS NOT NULL |
Diferente de nulo |
CityName IS NOT NULL |
Fechas
Las fechas guardadas en el modelo de datos a través del Portal de Trabajo se almacenan en la base de datos con minutos y segundos, dado que todas las fechas se registran como Fecha-Hora. Por lo tanto, al acceder a estas fechas usando CEntityManager, debe convertir la fecha a un formato que se pueda leer fácilmente.
Para ilustrar este escenario, consideremos un proceso de Solicitud de compra en el que las órdenes de compra se generan una vez que se elige un proveedor. Todos los detalles de la orden de compra, incluidas las fechas de pago, se ingresan en el Portal de Trabajo.
Ahora, imagine otro proceso llamado Cuentas por pagar, donde necesita identificar todas las órdenes de compra pendientes programadas para pagar la próxima semana. Para lograr esto, debe utilizar CEntityManager para seleccionar de la entidad Órdenes de compra todos los pedidos que permanecen sin pagar y tienen una fecha de pago próxima.
El código requerido para la expresión que selecciona de la entidad especificada (es decir, la entidad Órdenes de compra) y filtra por fecha es:
FirstDate = Convert.ToDateTime(<Process.Date1>);
DateToFilter = CHelper.FormatDate(Date, "yyyy-MM-dd HH:mm:ss");
ListOfRecords =
CEntityManager.GetEntity("EntityToFilter").GetEntityList("","","DateAttribute = '" + DateToFilter + "'","");
3. Agregar nuevo(s) registro(s)
El uso de funciones CEntityManager para agregar o modificar registros de entidades Paramétricas no es recomendado. Este proceso debe realizarse exclusivamente a través de Bizagi Studio, el Portal de Trabajo (Admin>Administración de Procesos>Entidades), o la API de Bizagi.
Como buena práctica, se debe abordar la adición de registros a entidades Maestras para una persistencia inmediata en la base de datos después de un análisis exhaustivo de los escenarios de casos de negocios. Este análisis debe considerar todos los impactos potenciales, ya sean positivos o negativos, en los datos y comportamientos posteriores en actividades, reglas, formas, integraciones, etc. Se recomienda agregar registros a entidades Maestras utilizando formas de Actividad o Evento, reglas de negocio (expresiones), al recibir una respuesta de un sistema externo a través de una invocación de servicio web, o cuando un sistema externo invoca OData o a la Capa SOA de Bizagi.
Puede haber escenarios en los que se considere necesario agregar registros a entidades Maestras mediante expresiones (por ejemplo, debido a consideraciones de desempeño o escenarios de negocio complejos). En tales casos, estos escenarios deben ser revisados meticulosamente por el equipo del proyecto.
Ejemplo A
Usted debe crear nuevos registros en dos entidades Maestras diferentes, considerando la relación uno a muchos previamente configurada. La entidad mLiabilityCollect se puede asociar con varios registros (uno o varios) de la entidad mPendingLiability.
Para crear los nuevos registros y vincularlos, siga los siguientes pasos:
•Paso 1: Agregue el nuevo registro en la entidad mLiabilityCollect y almacene el SurrogateKeyValue del nuevo registro.
//Paso 1
var oLiabCllctEntity = CEntityManager.GetEntity("mLiabilityCollect");
oLiabCllctEntity.Attributes["bLiabDataLoad"].Value = false;
oLiabCllctEntity.Attributes["bDeleteBadCorrupt"].Value = false;
oLiabCllctEntity.Add();
var iLiabCllctSgtKeyValue = oLiabCllctEntity.SurrogateKeyValue;
•Paso 2: Agregue el nuevo registro en la entidad mPendingLiability.
//Paso 2
var oPndngLblty = CEntityManager.GetEntity("mPendingLiability");
oPndngLblty.Attributes["bSelect4Processing"].Value = false;
•Paso 3: Vincule el registro recién creado en mPendingLiability con el nuevo registro en mLiabilityCollect asignando el SurrogateKeyValue almacenado en el Paso 1 al atributo kmLiabilityCollect_FK. Este atributo debe configurarse durante la creación de la relación de uno a muchos entre estas dos entidades.
//Paso 3
oPndngLblty.Attributes["kmLiabilityCollect_FK"].Value = iLiabCllctSgtKeyValue;
oPndngLblty.Add();
Ejemplo B
Usted debe crear registros en dos entidades maestras diferentes, mLiabilityCollect y mLiability, que están vinculadas a través de una relación 1:1, como se ilustra en el modelo de datos a continuación:
Para crear los nuevos registros y vincularlos, siga los siguientes pasos:
•Paso 1: Agregue el nuevo registro en la entidad mLiability y almacene el SurrogateKeyValue del nuevo registro en una variable temporal (iLiabilitySgtKeyValue).
//Paso 1
var oPndngLblty = CEntityManager.GetEntity("mLiability");
oPndngLblty.Attributes["cAmount"].Value = 1250;
oPndngLblty.Attributes["iUncollected"].Value = 1;
oPndngLblty.Attributes["sLiabilityStatus"].Value = "Uncollected";
oPndngLblty.Attributes["dRegistrationDate"].Value = DateTime.Today;
oPndngLblty.Add();
var iLiabilitySgtKeyValue = oPndngLblty.SurrogateKeyValue;
•Paso 2: Agregue el nuevo registro en la entidad mLiabilityCollect y vincule el nuevo registro mLiability del Paso 1.
//Paso 2
var oLiabCllctEntity = CEntityManager.GetEntity("mLiabilityCollect");
oLiabCllctEntity.Attributes["bLiabDataLoad"].Value = false;
oLiabCllctEntity.Attributes["bDeleteBadCorrupt"].Value = false;
oLiabCllctEntity.Attributes["kmSingleLiability"].Value = iLiabilitySgtKeyValue;//Link new mLiability record
oLiabCllctEntity.Add();
Ejemplo C
Considere la entidad Maestra mLiability como ejemplo. Antes de ejecutar el proceso de negocio automatizado diseñado para cobrar pasivos (consulte la imagen a continuación), es necesario poblar sus valores. Para ello se utiliza una hoja de Excel que contiene toda la información pertinente. Un proceso de Bizagi le permite cargar el archivo de Excel y, al enviar la creación del caso, se genera un nuevo registro en la entidad mLiability para cada fila de la hoja de Excel.
La sintaxis es la siguiente:
var bFileExists = <exists(mLiabilityCollect.uExcelDataLoad1)>;
if(BAIsTrue(bFileExists)){
oDataFile = Chelper.GetValueAsCollection(<mLiabilityCollect.uExcelDataLoad1>);
for(f = 0; f < oDataFile.size(); f++){
oFile = oDataFile.get(f);
oFileData = oFile.getXPath("Data");
FileContent = Chelper.GetDataTableFromWorkSheetAsString(oFileData, 0);
iRowsCount = FileContent.Rows.Count;
for(g=0; g < iRowsCount; g++){
oCEntLiability = null;
var oExcelRow = FileContent.Rows[g]; //Objeto que contiene los datos de fila del Excel
var oCEntLiability = CentityManager.GetEntity("mLiability");//Devuelve un objeto vacío
//Configuración de valores para el nuevo registro mLiability
oCEntLiability.Attributes["cAmount"].Value = Chelper.ToInt( oExcelRow["cAmount"]);
oCEntLiability.Attributes["iUncollected"].Value = oExcelRow["iUncollected"];
oCEntLiability.Attributes["iDebtorID"].Value = oExcelRow["iDebtorID"];
oCEntLiability.Attributes["sLiabilityStatus"].Value = oExcelRow["sLiabilityStatus"];
oCEntLiability.Add();//Llamada a función para crear el nuevo registro mLiability
}
}
}
La adición de registros en entidades no es soportada por la función entity-list. |
Usted debe actualizar todos los registros con una fecha de registro vacía en la entidad mLiability con la fecha actual (DateTime.Today). Para lograr esto, necesita obtener un objeto que contenga todos los registros existentes que cumplan con esta condición específica, iterar sobre este objeto y ejecutar la función de actualización para cada registro.
La sintaxis es la siguiente:
var dToday = DateTime.Today;
var oLiability = CEntityManager.GetEntity("mLiability");
oLiabRecords = oLiability.GetEntityList("", "", "dRegistrationDate is null", "");//Returns object with records matching the filtering criteria
for(u = 0; u < oLiabRecords.Length; u++){
var oRecord2Update = oLiabRecords [u];
oRecord2Update.Attributes["dRegistrationDate"].Value = dToday;
oRecord2Update.Update();//Llamada a función para actualizar el registro
}
Considere que en la entidad mLiability existen registros que carecen de fechas de registro o vencimiento. En consecuencia, usted debe eliminar estos registros de la entidad. Para realizar esta tarea, puede:
•Utilizar la función GetEntity para obtener todos los registros de la entidad.
•Utilizar la función GetEntityList con un filtro para mantener solo los registros con fechas vacías.
•Utilizar la función GetEntityListCount para contar los registros a eliminar. Este recuento se utiliza luego para definir el número de iteraciones.
•Utilizar la función Delete para eliminar cada registro que coincida con los criterios de filtrado.
La sintaxis es la siguiente:
var oLiability = CEntityManager.GetEntity("mLiability");
Filter = "dDueDate is null OR dRegistrationDate is null";//Filtrar para recuperar registros de mLiability con fechas vacías
var oBadRecords = oLiability.GetEntityList("", "", Filter, "");//Devuelve un objeto con registros que coinciden con los criterios de filtrado
var iRecordCount = oLiability.GetEntityListCount(Filter);
for(var r = 0; r < iRecordCount; r++){
oRecord2Delete = oBadRecords[r];
oRecord2Delete.Delete();//Llamada a función para eliminar registro
}
•IMPORTANTE: La acción Delete() no se puede revertir una vez ejecutada. Debe asegurarse de que se hayan realizado todas las validaciones de negocio necesarias antes de utilizar esta función para eliminar cualquier registro de entidad. •La eliminación de registros en entidades no es soportada por la función entity-list. |
Usted debe actualizar el valor de Amount en la entidad mLiability utilizando el XPath mLiabilityCollect.kmSingleLiability.
La función requiere el Id (SurrogateKeyValue) de la entidad raíz (es decir, mLiabilityCollect).
La sintaxis es la siguiente:
var idLiabCllct = <mLiabilityCollect.Id>;
var oDbtrRcrds = CEntityManager.GetEntity("mLiabilityCollect", idLiabCllct);//Obtiene el registro específico de mLiabilityCollect según el SurrogateKeyValue proporcionado
oDbtrRcrds.SetAttribValue("kmSingleLiability.cAmount", 560);//Actualiza el valor de Amount
Usted debe obtener el valor de DebtorID en la entidad mLiability utilizando el XPath mLiabilityCollect.kmSingleLiability.
La función requiere el Id (SurrogateKeyValue) de la entidad raíz (es decir, mLiabilityCollect).
La sintaxis es la siguiente:
var idLiabCllct = <mLiabilityCollect.Id>;
var oDbtrRcrds = CEntityManager.GetEntity("mLiabilityCollect", idLiabCllct);//Obtiene el registro específico de mLiabilityCollect según el SurrogateKeyValue proporcionado
//Obtiene el valor de DebtorID en el registro mLiability relacionado
var iDbtrID = oDbtrRcrds.GetAttribValue("kmSingleLiability.iDebtorID");
Last Updated 12/22/2023 2:12:33 PM