Uso del seguimiento de cambios para sincronizar los datos con sistemas externos
La característica de seguimiento de Microsoft Dataverse proporciona una forma de mantener los datos sincronizados de forma eficiente detectando qué datos se han modificado desde que los datos se extrajeron inicialmente o se sincronizaron por última vez. Este artículo analiza cómo habilitar y recuperar los cambios de una tabla.
Habilitar seguimiento de cambios para una tabla
Antes de recuperar los cambios para una tabla, asegúrese de que el seguimiento de cambios está habilitado para esa tabla.
Puede verificar si esta característica está habilitada o habilitarla usando Power Apps. Seleccione Datos > Tablas y la tabla específica. Bajo Opciones avanzadas, encontrará la propiedad Seguir cambios.
Puede configurar esto programáticamente configurando la Propiedad EntityMetadata.ChangeTrackingEnabled como True
.
Nota
Una vez que se ha habilitado el seguimiento de cambios para una tabla, no es posible deshabilitarlo.
Para obtener más información sobre cómo usar Power Apps: Crear y editar tablas mediante Power Apps
Hay dos formas de verificar si el seguimiento de cambios está habilitado para una tabla usando la API web de Dataverse.
Puede consultar
EntityDefinitions
con la siguiente solicitudGET
:GET [Organization URI]/api/data/v9.2/EntityDefinitions?$select=SchemaName&$filter=ChangeTrackingEnabled eq true
Hay tablas del sistema con el seguimiento de cambios habilitado, por ejemplo Auditoría (Auditoría). Puede usar la siguiente consulta para ver la lista completa:
GET [Organization URI]/api/data/v9.2/EntityDefinitions?$filter=ChangeTrackingEnabled eq true and IsCustomEntity eq false&$select=LogicalName
Más información: Consultar definiciones de tabla mediante la API web
Encuentre esta información en el documento del servicio de $metadatos de la API web. La anotación
Org.OData.Capabilities.V1.ChangeTracking
se configura para los conjuntos de entidades que tienen habilitado el seguimiento de cambios.Para ver las anotaciones en el documento de servicio API web CDSL, use esta consulta de API web:
GET [Organization URI]/api/data/v9.2/$metadata?annotations=true
Los conjuntos de entidades que representan tablas en las que está habilitado el seguimiento de cambios tienen esta anotación:
<Annotation Term="Org.OData.Capabilities.V1.ChangeTracking"> <Record> <PropertyValue Property="Supported" Bool="true" /> </Record> </Annotation>
Más información: Anotaciones de metadatos.
Tablas no aptas para Change Tracking
Algunas tablas no se pueden habilitar para el seguimiento de cambios. Puede comprobar si una tabla es apta para el Change Tracking si comprueba el valor de la propiedad administrada EntityMetadata.CanChangeTrackingBeEnabled. Para ver qué tablas no se pueden habilitar para el seguimiento de cambios, use esta consulta de API web:
GET [Organization URI]/api/data/v9.2/EntityDefinitions?$select=SchemaName,ChangeTrackingEnabled&$filter=ChangeTrackingEnabled eq false and CanChangeTrackingBeEnabled/Value eq false
Más información:
- Definiciones de tablas de consulta usando la API web: use tipos complejos en operaciones de $filtro
- Propiedades administradas
Recuperar cambios de una tabla usando API web
Los cambios realizados en las tablas pueden seguirse mediante solicitudes de la API Web agregando el encabezado Prefer: odata.track-changes
. Este encabezado solicita que se devuelva un delta link que pueda usarse después para recuperar los cambios de la tabla.
Los vínculos diferenciales son vínculos opacos generados por servicios que el cliente utiliza para recuperar los cambios posteriores a un resultado. Se basan en una consulta de definición que describe el conjunto de resultados para los que se realiza un seguimiento de los cambios. Por ejemplo, la solicitud que generó los resultados que contienen el vínculo diferencial. El vínculo diferencial codifica el conjunto de tablas cuyos se están siguiendo, junto con un punto de partida desde el que desea realizar un seguimiento de los cambios. Más información: Oasis OData Versión 4.0 - Vínculos diferenciales
Ejemplo de recuperación de cambios en tablas usando la API Web
En este ejemplo se muestra cómo recuperar los cambios realizados para la tabla de cuentas mediante la API web.
Solicitud:
GET [Organization URI]/api/data/v9.0/accounts?$select=name,accountnumber,telephone1,fax HTTP/1.1
Prefer: odata.track-changes
OData-Version: 4.0
Content-Type: application/json
Respuesta:
HTTP/1.1 200 OK
OData-Version: 4.0
Preference-Applied: odata.track-changes
{
"@odata.context":"[Organization URI]/api/data/v9.0/$metadata#accounts(name,accountnumber,telephone1,fax)",
"@odata.deltaLink": "[Organization URI]/api/data/v9.0/accounts?$select=name,accountnumber,telephone1,fax&$deltatoken=919042%2108%2f22%2f2017%2008%3a10%3a44",
"value":[
{
"@odata.etag":"W/\"915244\"",
"name":"Monte Orton",
"accountnumber":null,
"telephone1":"555000",
"fax":"10101",
"accountid":"60c4e274-0d87-e711-80e5-00155db19e6d"
}
]
}
Puede usar el Uri @odata.deltaLink
devuelto en el ejemplo anterior para capturar cambios en tablas. En este ejemplo, se ha creado una cuenta y se ha eliminado una cuenta existente. El vínculo diferencial devuelto desde la solicitud anterior recopila estos cambios, tal como se muestra en el ejemplo siguiente.
Solicitud:
GET [Organization URI]/api/data/v9.0/accounts?$select=name,accountnumber,telephone1,fax&$deltatoken=919042%2108%2f22%2f2017%2008%3a10%3a44
OData-Version: 4.0
Content-Type: application/json
Respuesta:
HTTP/1.1 200 OK
OData-Version: 4.0
{
"@odata.context":"[Organization URI]/data/v9.0/$metadata#accounts(name,telephone1,fax)/$delta",
"@odata.deltaLink":"[Organization URI]/api/data/v9.0/accounts?$select=name,telephone1,fax&$deltatoken=919058%2108%2f22%2f2017%2008%3a21%3a20",
"value":
[
{
"@odata.etag":"W/\"915244\"",
"name":"Monte Orton",
"telephone1":"555000",
"fax":"10101",
"accountid":"60c4e274-0d87-e711-80e5-00155db19e6d"
},
{
"@odata.context":"[Organization URI]/api/data/v9.0/$metadata#accounts/$deletedEntity",
"id":"2e451703-c686-e711-80e5-00155db19e6d",
"reason":"deleted"
}
]
}
La respuesta para el vínculo diferencial devuelto en la solicitud de seguimiento de cambio inicial contiene otro vínculo diferencial. Este vínculo diferencial ayuda a recuperar todos los cambios posteriores de tablas. Si no hay cambios de tabla realizados después de la solicitud de seguimiento de cambio inicial invocada, se recibe una respuesta JSON vacía.
Recuperar el número de cambios efectuados en tablas usando la API Web
$count
puede agregarse al vínculo diferencial devuelto en la primera solicitud de cambio inicial, como se muestra en el ejemplo siguiente, para obtener el número de los cambios efectuados.
Solicitud:
GET [Organization URI]/api/data/v9.0/accounts/$count?$deltatoken=919042%2108%2f22%2f2017%2008%3a10%3a44
OData-Version: 4.0
Content-Type: application/json
Opciones de la consulta no admitidas en la solicitud de la API Web de seguimiento de cambios
Las opciones de consulta del sistema $filter
, $orderby
, $expand
y $top
no se admiten cuando se utiliza el encabezado Prefer: odata.track-changes
en una solicitud de la API web. El mensaje de error The \"${filter|orderby|expand|top}\" query parameter isn't supported when Change Tracking is enabled.
se devuelve al usar estas opciones de consulta en la solicitud de la API web.
Recuperar cambios de una tabla usando .NET SDK
Cuando el seguimiento de cambios está habilitado para una tabla, puede usar el mensaje RetrieveEntityChanges
con la clase RetrieveEntityChangesRequest para recuperar los cambios para esa tabla.
La primera vez que se usa este mensaje devuelve todos los registros de la tabla y que los datos se pueden usar para rellenar el almacenamiento externo. El mensaje también devuelve un número de versión que se enviará con el uso siguiente del mensaje RetrieveEntityChanges
de modo que solo se devolverán los datos de los cambios que se han producido desde esa versión.
Debe conocer las siguientes restricciones para recuperar los cambios de una tabla:
- Solo se realiza el seguimiento de una tabla en recuperación de cambios. Si
RetrieveEntityChanges
se ejecuta sin la versión o token, el servidor lo trata como la versión mínima del sistema, devolviendo todos los registros como nuevos. Los objetos eliminados no se devuelven. - Los cambios se devuelven si el último token se encuentra dentro de un valor predeterminado de 7 días. Esta duración está controlada por el valor de la columna ExpireChangeTrackingInDays de la tabla de organización y se puede cambiar. Si hay cambios sin procesar anteriores al valor configurado, el sistema lanza una excepción.
- Si un cliente tiene un conjunto de cambios para una tabla, supongamos la versión 1, un registro se crea y elimina antes de la siguiente consulta cambios, este obtendrá el elemento eliminado incluso aunque no tuviera el elemento para empezar.
- Los registros se recuperan en el orden determinado por la lógica del lado del servidor. Normalmente, el llamador obtendrá todos los registros nuevos o actualizados primero (clasificados por número de versión) seguidos de los registros eliminados. Si hay 3000 registros creados o actualizados y 2000 registros eliminados, Dataverse devuelve una colección de 5000 registros, que tienen las primeras 3000 entradas formadas por registros nuevos o actualizados y las 2000 últimas entradas de registros eliminados.
- Si la colección de registros nuevos o actualizados es superior a 5000, el usuario puede desplazarse entre las páginas de la colección.
- El usuario que llama debe tener acceso de lectura en el nivel de organización a la tabla. Si el usuario tiene acceso de lectura limitado, el sistema arroja un error de verificación de privilegios.
Código de muestra .NET SDK
El fragmento de código siguiente muestra cómo el mensaje de RetrieveEntityChanges
se usa para recuperar los cambios de una tabla. Para ver el ejemplo completo, vea Sincronizar datos con sistemas externos utilizando seguimiento de cambios.
string token;
// Initialize page number.
int pageNumber = 1;
List<Entity> initialrecords = new List<Entity>();
// Retrieve records by using Change Tracking feature.
RetrieveEntityChangesRequest request = new RetrieveEntityChangesRequest();
request.EntityName = _customBooksEntityName.ToLower();
request.Columns = new ColumnSet("sample_bookcode", "sample_name", "sample_author");
request.PageInfo = new PagingInfo() { Count = 5000, PageNumber = 1, ReturnTotalRecordCount = false };
// Initial Synchronization. Retrieves all records as well as token value.
Console.WriteLine("Initial synchronization....retrieving all records.");
while (true)
{
RetrieveEntityChangesResponse response = (RetrieveEntityChangesResponse)_serviceProxy.Execute(request);
initialrecords.AddRange(response.EntityChanges.Changes.Select(x => (x as NewOrUpdatedItem).NewOrUpdatedEntity).ToArray());
initialrecords.ForEach(x => Console.WriteLine("initial record id:{0}", x.Id));
if (!response.EntityChanges.MoreRecords)
{
// Store token for later query
token = response.EntityChanges.DataToken;
break;
}
// Increment the page number to retrieve the next page.
request.PageInfo.PageNumber++;
// Set the paging cookie to the paging cookie returned from current results.
request.PageInfo.PagingCookie = response.EntityChanges.PagingCookie;
}
Consulte también
Definir claves alternativas para una tabla
Usar una clave alternativa para hacer referencia a un registro
Actualizar Dynamics 365 con datos externos usando Upsert
Consultar definiciones de tabla con la API web
Nota
¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)
La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).