Skip to content

Reemplazar el servicio Data Export con código

Reemplazar el servicio Data Export con código

Introducción

Data Export era un servicio complementario disponible como solución de Microsoft Dataverse que agregaba la capacidad de replicar datos de Dataverse a un almacén de base de datos SQL de Microsoft Azure en una suscripción de Microsoft Azure propiedad del cliente.

Data Export sincronizaba de forma inteligente todo el esquema y los datos de Dataverse inicialmente y luego se sincronizaba de forma continua a medida que se producen cambios (cambios delta) en Dataverse.

El servicio Data Export fue deprecado en noviembre de 2022. Para reemplazar el funcionamiento de este servicio proponemos una implementación idéntica mediante el desarrollo de plugins (asíncronos), replicando los datos de Dataverse a una BBDD SQL, de una forma sencilla, fiable y muy rápida, (casi en tiempo real, mucho más rápida que el propio servicio Data Export). Podemos decir también que se trata de una solución barata, ya que no requiere ninguna nueva subscripción ni ningún pago por uso de la solución.

Estructura General

La solución propuesta se basa en 3 plugins asíncronos; pluginPostEntityCreate, que se lanza cada vez que se crea un registro en una entidad de Dataverse, pluginPostEntityUpdate, que se lanza cada vez que se modifica un registro, pluginPostEntityDelete, que se lanza cada vez que se elimina un registro en una entidad sincronizada en Dataverse.

La estructura de estos 3 plugins es la misma, tanto en los parámetros necesarios como en el código que ejecutan:

  • Parámetros. Solo son necesarios los siguientes datos de la Entidad (Entity):
    • Nombre de la Entidad: nombre de la entidad de Dataverse
    • Guid de la Entidad: guid del registro de esa entidad de Dataverse
  • Código. En los 3 plugins se realizan las siguientes operaciones:
    • Abrir la conexión a la BBDD SQL: openSqlConnection
    • Creación del comando SQL: se crea el comando SQL para crear, actualizar o borrar los datos en la tabla de la BBDD SQL de sincronización, según el cambio que se produce en la entidad correspondiente de Dataverse.
    • Ejecución del comando SQL: executeSqlCommand
    • Cerrar la conexión SQL: closeSqlConnection
    • Control de errores: se ha implementado un control de errores, tanto de errores controlados como no controlados, de forma que ante cualquier error que se produzca en la ejecución de estos plugins, la correcta sincronización de los datos entre Dataverse y la BBDD de réplica esté garantizada.

Se ha desarrollado un cuarto plugin, pluginPostEntityAssociateDisassociate, que sincroniza los cambios que se producen en las relaciones N:N, tanto en la asociación como la disociación de registros entre entidades.

Para sincronizar una nueva entidad con la BBDD, basta con registrar un nuevo paso (asíncrono) en cada uno de los 3 plugins de creación (Mensaje: Create), actualización (Mensaje: Update) y borrado (Mensaje: Delete).

El plugin pluginPostEntityAssociateDisassociate, que sincroniza las relaciones N:N entre entidades de Dataverse, solo es necesario registrar inicialmente el paso para el mensaje Associate, que provocará que se ejecute el plugin, también de forma asíncrona cada vez que se crea una relación N:N entre dos entidades cualesquiera de Dataverse, y el paso para el mensaje Disassociate, que hace lo propio cuando se elimina una relación N:N entre dos entidades cualesquiera de Dataverse.

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

Plugin de creación (pluginPostEntityCreate)

Cada vez que se crea un registro en una de las entidades de Dataverse que se desea sincronizar con la BBDD, se lanza este plugin de forma asíncrona. Como hemos dicho, en los 3 plugins se realizan las mismas operaciones: se abre la conexión SQL, se crea el comando SQL correspondientes, en este caso de creación del registro, se ejecuta el comando SQL y se cierra la conexión SQL.

Este es el código que crea el comando SQL en el caso de una creación de un registro en Dataverse, identificado con el objeto Entity (Entidad) del registro en Dataverse:

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

Como se puede observar en este código, se crea un comando INSERT INTO en la tabla correspondiente, con la lista de todos los campos (atributos) y los valores correspondientes, teniendo en cuenta los tipos de datos y la conversión del valor de cada atributo.

Plugin de actualización (pluginPostEntityUpdate)

Cada vez que se actualiza un registro en una de las entidades de Dataverse que se desea sincronizar con la BBDD, se lanza este plugin de forma asíncrona. Este es el código que crea el comando SQL en el caso de una actualización de un registro en Dataverse, identificado con el objeto Entity (Entidad) del registro en Dataverse:

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

De igual forma que en el código del anterior plugin, se crea el comando SQL, en este caso UPDATE en la tabla correspondiente, con la lista de todos los campos (atributos) y los valores correspondientes, teniendo en cuenta las conversiones de valores en función de los tipos de datos.

Plugin de borrado (pluginPostEntityDelete)

Cada vez que se elimina un registro en una de las entidades de Dataverse que se desea sincronizar con la BBDD, se lanza este plugin de forma asíncrona. Este es el código que crea el comando SQL en el caso del borrado de un registro en Dataverse, identificado con el objeto Entity (Entidad) del registro en Dataverse:

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

El comando SQL es, en este caso, DELETE en la tabla correspondiente.

Otros plugins

Plugin relaciones N:N (pluginPostEntityAssociateDisassociate)

Este plugin, también asíncrono, replica las relaciones N:N entre entidades de Dataverse. Como hemos comentado, está registrado un paso para el mensaje Associate, que se lanzará, cada vez que se crea una relación N:N entre dos entidades de Dataverse, y otro paso para el mensaje Disassociate, que se lanza cuando se elimina una relación N:N.

Los parámetros de este plugin son la entidad objeto (targetEntity) y la entidad relacionada (relatedEntity), así como el mensaje (Associate / Disassociate), en función de los cuales se crea el comando SQL para crear o eliminar la relación N:N.

Reemplazar el servicio Data Export con código

En el caso del mensaje Associate, se crea un registro en la tabla de relación N:N con el comando SQL INSERT INTO, mientras que en el caso del mensaje Disassociate, se elimina el registro correspondiente en la tabla de relación con el comando SQL DELETE.

Entidades

Entidad ActivityParty (Tipo de dato: Microsoft.Xrm.Sdk.EntityCollection)

La entidad ActivityParty se encuentra relacionada con otras entidades a través de un atributo del tipo Microsoft.Xrm.Sdk.EntityCollection. Como se puede observar en el código que crea los comandos SQL, tanto para la creación como para la actualización de los registros, en el caso de que la entidad a sincronizar tenga este tipo de atributo, se llama al método de forma recursiva.

Reemplazar el servicio Data Export con código

Atributos

Atributo ActivityParty (Tipo de dato: Microsoft.Xrm.Sdk.EntityReference)

El antiguo servicio Data Export creaba en la BBDD de sincronización dos campos por cada atributo del tipo EntityReference; uno (Id) para almacenar del guid del registro de la entidad relacionada en Dataverse y otro (Name), para almacenar su nombre. Estos plugins replican exactamente este mismo comportamiento cuando nos encontramos con este tipo de atributo en una de las entidades a sincronizar:

Reemplazar el servicio Data Export con código

Listas

Listas de Marketing y Miembros de la Lista (List y ListMembers)

A la hora de replicar la entidad de Dataverse de Miembros de Lista en la BBDD de sincronización, que incluye los contactos que forman parte de una Lista de Marketing, hemos tenido problemas, ya que no salta ninguno de los mensajes disponibles a través de los plugins registrados cada vez que se incluye o se elimina algún miembro de la lista. Lo que sí hemos podido comprobar es que la entidad Lista de Marketing correspondiente sí se modifica (atributo modifiedon) cada vez que se añade o se borra algún miembro de la lista. Por tanto, y aprovechando este cambio, hemos creado un proceso ad hoc que sincroniza esta entidad.

Replicas

Nueva entidad a replicar

Como ya hemos comentado anteriormente, para replicar una nueva entidad de Dataverse en la BBDD, basta con añadir el paso correspondiente en el plugin de creación, pluginPostEntityCreate, el de modificación, pluginPostEntityUpdate y en el de eliminación pluginPostEntityDelete.

Lógicamente, en la BBDD de datos de destino de la réplica no existe aún la tabla correspondiente a esta entidad de Dataverse y, por tanto, se producirá un error del tipo Invalid object name. En este caso, hemos implementado el código para crear la estructura de la tabla correspondiente en la BBDD de SQL y sincronizar los datos existentes en el momento de primera sincronización. La tabla se replica con la función createTableEntity:

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

Este código genera el comando SQL CREATE TABLE, que crea la estructura de la tabla en la BBDD correspondiente a la entidad (Entity) de Dataverse.

Por otro lado, la carga inicial de los datos de una Entidad (Entity) en Dataverse en la tabla correspondiente de la BBDD SQL de sincronización se realiza con el siguiente proceso incluido en la función loadDataEntity:

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

Nuevo atributo a replicar

Igual que el antiguo servicio Data Export, esta solución de plugins replica todos los atributos de las entidades de Dataverse a sincronizar en sus respectivos campos de la BBDD SQL de sincronización. Sin embargo, cuando se crea un nuevo atributo en una entidad de Dataverse que ya se sincroniza con la BBDD SQL, será también necesario crearlo en la BBDD de destino. Sin embargo, esto, igual que en el apartado anterior, cuando se replica una nueva entidad y automáticamente se crea la tabla de en la BBDD, aquí tampoco es necesario ninguna intervención, ya que el código crea el campo en la tabla correspondiente de forma automática.

Al lanzarse la primera ejecución del plugin posterior a la creación del atributo en la entidad de Dataverse, se producirá un error del tipo Invalid columna name. En este caso, hemos implementado el código para chequear toda la estructura de la tabla correspondiente en la BBDD de SQL, crear los campos que no existan o modificar los ya existentes. La tabla se chequea con la función checkTableEntity:

Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código
Reemplazar el servicio Data Export con código

Este código genera el comando SQL ALTER TABLE, que crea o modifica el campo de la tabla en la BBDD correspondiente a cada atributo de la entidad (Entity) de Dataverse.

Control de errores

El código que se ha implementado en estos plugins contempla un proceso exhaustivo de control de errores, para conseguir que la correcta replica de los datos entre Dataverse y la BBDD SQL esté asegurada. Para ello es necesario tratar tanto los errores controlados como los errores no controlados. Estos últimos pueden ser debidos a múltiples causas que pueden originar un error en la ejecución del plugin. En este caso, queda registrado el plugin que ha fallado y podemos recogerlo con el siguiente Fetch y volver a relanzarlo:

Reemplazar el servicio Data Export con código

En cuanto a los errores controlados en la ejecución de los plugins, lo que hemos hecho es crear una entidad personalizada en Dataverse (Logs), en el que queda registrado el nombre del plugin que ha fallado, el nombre de la entidad y el guid del registro, de forma que tenemos también la forma de volver a relanzarlo y mantener así una sincronización correcta asegurada.

Además, el código implementa un sistema de alerta, que ante cualquier incidencia que se produzca en la sincronización, se envíe un correo electrónico a las personas responsables informándoles del error en la sincronización.

Conclusión

La implementación a través de plugins para reemplazar el servicio Data Export deprecado, copia fielmente el funcionamiento de este, replicando datos de Dataverse en una BBDD SQL de una forma sencilla y aplicable a cualquier estructura Dataverse.

Una vez registrados los plugins, no se requiere ningún tipo de intervención manual, salvo indicar las entidades a replicar en los pasos de ejecución de los plugins.

También debemos destacar que, dado que la ejecución de estos plugins es asíncrona, no hemos tenido ningún tipo de problema o interferencia con la ejecución de otros plugins en las entidades de Dataverse que se están replicando.

La solución también es flexible, en el sentido de que en el caso de que el proceso de sincronización requiera alguna transformación o procesamiento de datos, sería posible implementarlo desarrollando en el código correspondiente.

Además de tratarse de una solución sencilla, fiable y rápida, también es barata para el cliente, ya que no requiere ninguna nueva subscripción ni ningún pago por uso.

Nos atrevemos a afirmar, después de tener desplegada esta solución desde hace más de un año en producción y en una estructura de Dataverse relativamente compleja, que la sincronización implementada con estos plugins es más rápida y también más fiable que la que implementaba el antiguo servicio Data Export.

Con estas novedades, Microsoft no solo mejora la experiencia de los usuarios individuales, sino que también eleva el estándar para la inteligencia artificial en el ámbito empresarial. Ya sea que estés explorando la versión gratuita, actualizando a Copilot Pro, o implementando Copilot para Microsoft 365 en tu empresa.

Solicitar información

En Infoavan seguimos al día de todas las novedades de Microsoft sobre las nuevas tendencias, funcionalidades y noticias que afectan a las principales soluciones de su ecosistema. 

Si quieres conocer cómo Infoavan puede ayudarte a explotar y mejorar estas nuevas capacidades, reemplazar el servicio Data Export con código o ayudarte con las licencias de Microsoft 365, no dudes en ponerte en contacto con nosotros. Uno de nuestros consultores expertos analizará tu petición y contactará contigo a la mayor brevedad posible. 

Post relacionados