El historial de auditoría es una excelente característica lista para usar en aplicaciones basadas en modelos. Sin embargo, consultar el historial de auditoría es un poco complicado. Desafortunadamente, los mecanismos de consulta comúnmente utilizados, como los conectores CDS de Power Automate, LinQ o simplemente FetchXml, no lo admiten. Esta publicación analizará las opciones que tenemos y el código de muestra para ello. Opciones Uso de mensajes SDK, RetrieveRecordChangeHistoryRequest y RetrieveRecordChangeHistoryResponse, cubiertos en esta publicación Uso del kit de herramientas de integración de Kingswaysoft para D365 (no cubierto en esta publicación) Escenario Consultaré el historial de auditoría para los registros de entidades de contacto y leeré los detalles de auditoría para su atributo de dirección de correo electrónico. Los detalles de la auditoría están disponibles en estos cuatro encabezados: Fecha de cambio Campo modificado Valor anterior Valor nuevo Si la auditoría está habilitada, este código funcionará para casi cualquier entidad y atributo. Cómo funciona Necesitamos identificadores (GUID) de entidades y, al utilizarlos, consultaremos el historial de auditoría. Estoy usando una consulta fetchxml para recuperar identificadores, pero puede ser un mecanismo de su elección según la implementación y los requisitos. var targetEntites_query = @»
«; Generalmente sabemos que FetchXml puede devolver un máximo de 5000 entidades, pero este código manejará y devolverá incluso si hay más de 5000 registros en el resultado. Lista pública RetrieveAllRecords(búsqueda de cadena) { var moreRecords = false; int página = 1; var cookie = cadena.Vacío; Lista Entidades = nueva lista(); hacer { var xml = string.Format(fetch, cookie); colección var = CrmClient.RetrieveMultiple(new FetchExpression(xml)); if (colección.Entidades.Count >= 0) Entidades.AddRange(colección.Entidades); másRegistros = colección.MásRegistros; if (másRegistros) { página++; cookie = string.Format(«paging-cookie=»{0}» page=»{1}»», System.Security.SecurityElement.Escape(collection.PagingCookie), página); } } mientras (másRegistros); Entidades de retorno; } Consejo: la consulta FetchXml debe tener {0} si la consulta devolverá más de 5000 registros. Se pueden agregar columnas adicionales en la búsqueda si es necesario. A continuación, recorro estos identificadores y leo el historial de auditoría de los registros usando este código: public AuditDetailCollection GetAuditHistory(stringentityLogicalName, Guid recordId) { var changeRequest = new RetrieveRecordChangeHistoryRequest(); changeRequest.Target = new EntityReference(entityLogicalName, recordId); var changeResponse = (RetrieveRecordChangeHistoryResponse)this.CrmClient.Execute(changeRequest); devolver changeResponse.AuditDetailCollection; } La función anterior devuelve AuditDetailCollection que tiene una colección de AuditDetails. Un detalle de auditoría representa una entrada en el historial de auditoría. Tenga en cuenta que los registros del historial de auditoría están en el mismo orden en que aparecen en la interfaz de usuario (descendente). Cada registro de detalles de auditoría tendrá una fecha modificada y una colección de valores nuevos y antiguos con nombres de campos que necesitaremos recorrer y leer. A continuación se muestra el código para lograr esto: //Colección de entidades para las cuales vamos a leer el historial de auditoría var AllTargetEnteties = this.RetrieveAllRecords(targetEntites_query); foreach (var targetComplaint in AllTargetEnteties) { //Ahora pase el id(guid) del registro con el nombre de la entidad para recuperar el historial de auditoría var audit_history_entries = this.GetAuditHistory(targetComplaint.LogicalName, targetComplaint.Id); foreach (AuditDetail auditDetail in audit_history_entries.AuditDetails) { if ((auditDetail.GetType())?.Name == «AttributeAuditDetail») { // El siguiente código dice Fecha de cambio var changeDate = auditDetail.AuditRecord.GetAttributeValue(«creado en»); var newValueEntity = ((AttributeAuditDetail)auditDetail)?.NewValue; if (newValueEntity.Attributes.Count > 0) { { foreach (var attrNewValue in newValueEntity?.Attributes) { //Aquí necesitaremos hacer coincidir el nombre del atributo para leer el nuevo valor. //En este caso estoy leyendo emailaddress1 if (attrNewValue.Key == «emailaddress1») { var newEmailAddress = attrNewValue.Value; //Lógica personalizada para el nuevo valor aquí } } } } var oldValueEntity = ((AttributeAuditDetail)auditDetail)?.OldValue; if (oldValueEntity.Attributes.Count > 0) { foreach (var attrOldValue in oldValueEntity?.Attributes) { //Aquí necesitaremos hacer coincidir el nombre del atributo para leer el valor anterior. //En este caso estoy leyendo emailaddress1 if (attrOldValue.Key == «emailaddress1») { var oldEmailAddress = attrOldValue.Value; // La lógica personalizada para el valor anterior estará aquí } } } } } } Conectemos CodeProject Así: Me gusta Cargando…
Source link
Deja una respuesta