Chi*_*rag 7 sql-server crm dynamics-crm dynamics-crm-2013
我想按照MS CRM格式显示所有审核历史数据.
我已将AuditBase表中的所有记录从CRM导入到另一个数据库服务器表.
我希望这个表记录使用Dynamics CRM格式的SQL查询(如上图所示).
到目前为止我已经完成了
select
AB.CreatedOn as [Created On],SUB.FullName [Changed By],
Value as Event,ab.AttributeMask [Changed Field],
AB.changeData [Old Value],'' [New Value] from Auditbase AB
inner join StringMap SM on SM.AttributeValue=AB.Action and SM.AttributeName='action'
inner join SystemUserBase SUB on SUB.SystemUserId=AB.UserId
--inner join MetadataSchema.Attribute ar on ab.AttributeMask = ar.ColumnNumber
--INNER JOIN MetadataSchema.Entity en ON ar.EntityId = en.EntityId and en.ObjectTypeCode=AB.ObjectTypeCode
--inner join Contact C on C.ContactId=AB.ObjectId
where objectid='00000000-0000-0000-000-000000000000'
Order by AB.CreatedOn desc
Run Code Online (Sandbox Code Playgroud)
我的问题是AttributeMask是一个逗号分隔值,我需要与MetadataSchema.Attribute表的columnnumber字段进行比较.以及如何从该实体获得新价值.
我已经检查了这个链接:Sql查询从机会实体的审计历史中获取数据,但它没有给我[新值].
注意:我不能使用"RetrieveRecordChangeHistoryResponse",因为我需要在sql表(非CRM数据库)的外部网页中显示这些数据.
Paw*_*cki 10
好吧,基本上Dynamics CRM没有使用SQL查询创建这个审核视图(你在CRM中看到它的方式),所以如果你成功这样做,微软可能会从你那里购买它,因为它会比它目前的方式快得多处理:)
但实际上 - 它当前的工作方式,SQL仅用于获取所有相关的审计视图记录(没有任何与属性元数据或其他任何匹配),然后,所有解析和与元数据的匹配都在.NET应用程序中完成.逻辑非常复杂,有很多不同的情况要处理,我相信在SQL中重新创建它不仅需要一些简单的"选择"查询,而且实际上是一些非常复杂的过程(并且仍然可能还不够,因为并非CRM中的所有内容都保存在数据库中,有些内容只是简单地编译到应用程序库中,而且一个人可能需要几周甚至几个月才能完成(当然,我认为,也许某些T-SQL大师会证明我错了) .
所以,我会采用不同的方式 - 使用RetrieveRecordChangeHistoryRequest
(在某些答案中已经提到)使用某种.NET应用程序获取所有审计详细信息(已经解析并可以使用)(可能是定期运行,或者可能是由插件触发)在CRM等)并以用户友好的格式将它们放在一些数据库中.然后,您可以使用所需的任何外部应用程序使用此数据库.
另外我不明白你的评论:
我不能使用"RetrieveRecordChangeHistoryResponse",因为我需要从sql表(非CRM数据库)在外部网页中显示这些数据
什么样的应用程序无法调用外部服务(您可以创建自定义服务,不必使用CRM服务)来获取一些数据,但可以访问外部数据库?您不应该直接从数据库中读取,更好的方法是准备一个Web服务,返回您想要的审计(使用CRM SDK)并通过外部应用程序调用此服务.除非你的外部应用程序当然只能读取数据库,不能运行任何自定义Web服务......
无法仅从AuditBase表重建完整的审计历史记录.对于当前值,您仍然需要正在审计的表.
您需要构建的查询很复杂,并且如果它RetrieveRecordChangeHistoryRequest
也是合适的选项,则可以避免编写它们.(另请参阅如何在SO上使用FetchXML获取审计记录详细信息.)
注意
这个答案是在原始问题被延长之前提交的,表明
RetrieveRecordChangeHistoryRequest
不能使用.
正如我在评论中所说,审计表将具有旧值和新值,但没有当前值。下次更新时,当前值将作为新值推送。
在您的 OP 查询中,ab.AttributeMask
将返回逗号","
分隔的值并将AB.changeData
返回波浪号"~"
分隔的值。阅读更多
我假设您可以将"~"
分隔值作为Old Value
列,想要显示New Value
列中字段的当前值。当启用多个字段进行审核时,这将不起作用。您必须将Attribute mask
字段值拆分为 CRM 字段才能AttributeView
使用ColumnNumber
并获得所需的结果。
我建议从下面的参考博客开始,一旦获得预期结果,您可以在 SQL 中或在前端使用 C# 使用额外查询来提取当前字段值。但是您应该再次连接"~"
for 值以保持格式。
https://marcuscrast.wordpress.com/2012/01/14/dynamics-crm-2011-audit-report-in-ssrs/
更新:
从上面的博客中,您可以使用字段调整 SP 查询,然后将最后一个 select 语句转换为“select into”,为您的存储创建一个新表。
修改存储过程以获取基于上次运行的增量。配置 sql 作业和计划每天左右运行,以填充表。
然后按照您想要的方式选择并显示数据。我在 3 天内在 PowerBI 中做了同样的事情。
优点/缺点:显然,此要求是出于报告目的。全局报告要求将通过复制或其他方式镜像数据库,并且不会通过注入插件或任何按需临时服务调用来中断 Prod 用户和异步服务器。此外,您可以访问数据库而不是在线 CRM。最好不要重新发明轮子并推进可用的解决方案。这是我的拙见,基于 Microsoft 内部项目实施。