CRM 2011自定义基于SQL的报告错误"表别名在所有顶级表和联接别名中不是唯一的

时间:2014-03-12 09:01:14

标签: dynamics-crm-2011

每当我尝试修改基于SQL的报告的标准过滤器时,我经常会收到此错误。出现此错误的原因是,在修改过滤器时,联接中的表别名设置为某个非唯一值。

我花了很多时间为它寻找任何解决方案但失败了。然后为我自己找到了解决方法。

打开数据库OrganizationName_MSCRM并执行以下查询

从dbo.ReportBase中选择DefaultFilter,其中Name ='基于我的SQL的报告名称'

复制默认过滤器的值并在XML文件中打开。你会发现alias =" a_3513cef8db754312b0db555339f05c9a"在XML中。使用其他一些GUID更改别名中的GUID,并更新ReportBase表的DefaultFilter值。

运行报告,它将起作用。

2 个答案:

答案 0 :(得分:1)

如果您想避免直接针对您的CRM数据库运行更新(正如@Alex所述,不支持),您可以修改RDL本身的默认过滤器。

首先,您必须下载RDL并将其作为XML或文本文件打开。您可以在任何文本编辑器中执行此操作(如果RDL不在BIDS报表服务器项目中,则可以在VS.NET中执行此操作)。

在底部附近,您会找到类似于以下内容的部分:

    <CustomProperties><CustomProperty><Name>Custom</Name><Value>&lt;MSCRM
     xmlns="mscrm"&gt;&amp;lt;ReportFilter&amp;gt;&amp;lt;ReportEntity 
     paramname="P1"&amp;gt;&amp;lt;fetch version="1.0" output-format="xml-platform" 
     mapping="logical" distinct="false"&amp;gt;

Value是RDL的默认过滤器。 Value是XML编码的两次,但如果你通过解码器运行它,就像http://coderstoolbox.net/string/#!encoding=xml那样,你会得到更具可读性的东西:

第一次解码

     <MSCRM xmlns="mscrm">&lt;ReportFilter&gt;&lt;ReportEntity 
     paramname="P1"&gt;&lt;fetch version="1.0" output-format="xml-platform" 
     mapping="logical" distinct="false"&gt;

2nd Decode

    <ReportFilter><ReportEntity 
     paramname="P1"><fetch version="1.0" output-format="xml-platform" 
     mapping="logical" distinct="false">

通过结束</Value>包含所有内容,您将获得定义默认过滤器的FetchXML。

更改guid,或删除包含别名的<LinkEntity>部分。只要您拥有有效的FetchXML,您就应该能够将该文件作为新报告上传。

重新编码(x2)XML并将其放回RDL中。首先对获取XML进行编码,然后将其包装在<MSCRM xmlns="mscrm"></MSCRM>元素中,并对该字符串进行编码。请确保您的编码器不会将"替换为&quot;。 coderstoolbox.net上的那个,但CRM在编码XML时不会这样做。

您必须将RDL上传为新报告。在我的测试中,CRM在更新现有报告时不会使用RDL中的过滤器更新数据库中的defaultfilter列。

我知道这有很多箍跳,我不能说是否正式支持这种类型的定制。就个人而言,我觉得通过CRM Web UI上传RDL比使用针对数据库运行更新语句的开放式SSMS终端更安全。

答案 1 :(得分:1)

我遵循了与Scott Stone类似的解决方案 - 但只导出了报告,搜索了'违规'加入,修改了GUID,并且正如Scott提到的那样,删除然后重新上传报告。 (而不是简单地将修改后的RDL重新上传到现有报告中。)