Dynamics 365 変更履歴 と SDK を利用したデータ同期の方法
みなさん、こんにちは。
先日、2017年5月16日に『uSonar アダプタ for ASTERIA WARP』をリリース致しました!
当製品は、ランドスケイプ社が提供する日本最大(820万件)の企業データベース『LBC』を搭載したデータ統合ツール『 uSonar(ユーソナー)』と連携し、顧客データの一元化を行なうことができます。ASTERIAの既存の豊富なアダプターを選択して組み合わせて利用することで、『uSonar』と外部システムとの連携は柔軟に対応できるようになり、顧客情報の正確性の向上・メンテナンスコストの削減を実現します。
と、リリース作業に追われてました(言い訳ですwww)
さて、今回はSDKを利用したデータ連携について少し書いてみようかと思います。
Dynamics CRM 2015 Update 1 で追加された機能のひとつである「変更履歴」機能があります。この機能追加に伴いSDKにも「RetrieveEntityChanges」が追加されました。この機能を利用してリアルタイム性の高いデータ連携をご紹介します。
エンティティに対する変更の追跡を有効化
[設定]->[カスタマイズ]->[システムのカスタマイズ] の順に移動します。エンティティを選択し、データ サービス で、[変更履歴] チェック ボックスをオンにします。
上記を行ったら忘れずに、公開してください。
エンティティの変更の取得
サンプルコードでご説明します。
// ここに前回取得したDataTokenを保持
string token = null;var records = new List<Entity>();
// 今回の目玉クラス
var request = new RetrieveEntityChangesRequest();
request.EntityName = "account";
request.Columns = new ColumnSet(true);
// ここ重要!
request.DataVersion = token;
var response = client.Execute(request) as RetrieveEntityChangesResponse;
records.AddRange(response.EntityChanges.Changes.Select(x => (x as NewOrUpdatedItem).NewOrUpdatedEntity).ToArray());
records.ForEach(x => Console.WriteLine("initial record id:{0}", x.Id));
token = response.EntityChanges.DataToken;// 次回実行用のDataTokenを保持
ここでミソとなるのが、RetrieveEntityChangesRequest.DataVersion に入れている token 変数です。ここに前回取得時の RetrieveEntityChangesResponse.EntityChanges.DataTokenを設定することで前回取得時以降に変更されたデータのみを対象とすることができます。
短いスパンで定期的に実行するような同期バッチの場合には、この方法が有効なのではないでしょうか?
エンティティの変更の取得の制限
以下の制限に注意ください。
- 変更の取得では、1 つのエンティティのみが追跡されます。 トークンなしで変更の取得が実行された場合、すべてのレコードを新規として返します。 削除済みのレコードは返されません。
- 最後のトークンが既定値の 90 日以内である場合は変更レコードは返されます。 それが 90 日 を超えている場合は、すべてのレコードが返されます。
- 新規または更新された レコードが 5000 件を超える場合は複数ページ返されます。
- レコードは、サーバー側ロジックによって決定される順序で取得されます。 常に、新規、または、更新されたすべてのレコード (バージョン番号で並べ替え) を取得し、それに続く削除されたレコードを取得します。
- レコードは、変更の取得の前にレコードが作成され、削除された場合、削除されていてもレコードは取得されます。
※ 記事の内容は個人発信の参考情報です。記事内容のご利用は、ご自身の判断でお願いします。