Life is Like a Boat

忘備録や投資日記、プログラミングに関するメモやtipsなど

Dataverseのテーブルレコードが変更された時、変更前と変更後の値が欲しい

例えば、商談テーブルのステータスが何かから「商談成立」に変更になった時、Teamsの全体チャネルに対して「おめでとうございます!」的なお祝いメッセージを送りたい、とします。

Power AppsのCommunityサイトではテーブルのステータス項目とは別に、前の値を保持するための項目を作り、変更されるたびにPower Automateから二つの項目を見て、新しい値で保持用項目を更新というなんとも面倒臭い解決策が提案されていたのですが、この方法を採用すると変更を追いたい項目が2つや3つ増えた時にかなり不便です。

最近、Audit logを見る機会があり、Dataverse Web APIのRetrieveAuditDetails関数を使って前後の値を取得する方法があることを知ったのでその方法をシェアします。

まず、前提としてテーブルのAuditがONになっている必要があります(メッセージにもあるように組織全体のAuditもONになっている必要があります)

次に、Dataverse Web APIを使ってある特定のレコードのAudit Idを取得します。curlコマンドを使っていますが、Power AutomateのHTTPアクションを使って同じことができます。

curl "{Your Org URI}/api/data/v9.2/audits?$filter=_objectid_value%20eq%20{object_id}" \
     -H 'Authorization: Bearer ***** Hidden credentials *****' \
     -H 'Accept: application/json' \
     -H 'Content-Type: application/json; charset=utf-8' \
     -H 'Odata-Version: 4.0' \
     -H 'OData-MaxVersion: 4.0' 

filter=_objectid_value eq {object_id}

でOData filterを使ってObject Idを指定する必要があります。 レスポンスにAudit Idが含まれています。変更履歴が複数ある場合(通常複数あると思います)、最も最新のAudit Idを取得するようにします。

さらに、肝心の変更内容を取得するにはRetrieveAuditDetails関数を使ってこのように取得します。

curl "{Your Org URI}/api/data/v9.2/audits({audit_id})/Microsoft.Dynamics.CRM.RetrieveAuditDetails()" \
     -H 'Authorization: Bearer ***** Hidden credentials *****' \
     -H 'Accept: application/json' \
     -H 'Content-Type: application/json; charset=utf-8' \
     -H 'Odata-Version: 4.0' \
     -H 'OData-MaxVersion: 4.0'

NewValueとOldValueをキーにしたJSONのレスポンスが来るはずです。(スクリーンショットでは変更前はブルボン、変更後がカルビーとなっています。お菓子のことを考えていたからですw)

サンプルで使ったレコードは商談テーブルではないのですが、このやり方で「NewValueが『商談成立』の場合のみに」という条件を作ることができました。