Запрос на удаленные объекты в Dynamics 365 XRM Tooling SDK
Я пишу общую интеграцию, которая должна использовать базу данных в Dynamics 365 для взаимодействия с клиентами в качестве системы записей. Я буду время от времени опрашивать его, чтобы обновлять данные в других вспомогательных системах. Конечно, я могу узнать, когда записи изменились, проверив атрибут "updatedon". Я могу создать запрос: "дайте мне все записи, которые изменились с момента последнего запроса". Однако было бы оптимальным иметь возможность узнать, какие записи были УДАЛЕНЫ с момента последнего запроса. У меня аналогичная интеграция с Salesforce, и это тривиально для API SalesForce, но я не понимаю, как это сделать с помощью Dynamics 365 API.
Похоже, что единственный вариант для меня может состоять в том, чтобы сохранить список всех первичных ключей записей в моей интеграции и загружать при каждом опросе ВСЕ записи, существующие в CRM, а затем самостоятельно определять удаленные из них по их отсутствию. Это довольно уродливо и неэффективно, хотя.
Есть идеи или советы?
1 ответ
MS ввела отслеживание изменений для этой цели.
Функция отслеживания изменений в Dynamics 365 для взаимодействия с клиентами. Взаимодействие с клиентами предоставляет способ обеспечить синхронизацию данных эффективным способом, обнаруживая, какие данные изменились с момента первоначального извлечения или последней синхронизации.
Пример веб-запроса API ниже:
GET [Organization URI]/org1/api/data/v9.0/accounts?$select=name,accountnumber,telephone1,fax HTTP/1.1
Prefer: odata.track-changes
Ответ будет иметь дельта-ссылку с дельта-токеном:
"@odata.deltaLink": "[Organization URI]/api/data/v9.0/accounts?$select=name,accountnumber,telephone1,fax&$deltatoken=919042%2108%2f22%2f2017%2008%3a10%3a44"
Когда вы используете вышеуказанный URI, вы можете получить изменения, включая удаленные записи.
{
"@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"
}
]
}
Пример: синхронизация данных с внешними системами с использованием отслеживания изменений
Я хотел бы внести свой вклад в этот вопрос, который дал мне отличный совет, в каком направлении двигаться. Хотя эта мощная функция плохо задокументирована в официальном документе Dynamics и не упоминается, где объясняется отслеживание изменений, она также доступна в Soap API:
- https://docs.microsoft.com/en-us/dotnet/api/microsoft.xrm.sdk.messages.retrieveentitychangesrequest?view=dynamics-general-ce-9
- https://docs.microsoft.com/en-us/dotnet/api/microsoft.xrm.sdk.messages.retrieveentitychangesresponse?view=dynamics-general-ce-9
Я надеюсь, что это помогает кому-то.