使用筛选器,提高报表的性能
发布日期: 2017年1月
适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online
返回大型数据集的报表可能难以使用并且会引发性能问题。 若要限制在报表中显示的数据,请使用数据筛选器。
除了 Reporting Services 支持的数据筛选外,Microsoft Dynamics 365 还支持数据预筛选。 可以使用数据预筛选实现以下目的:
缩小报表的范围,使其返回更具相关性的数据,从而使报表成为上下文相关报表。
更快地检索并显示结果集,因为只返回更具相关性的数据。
允许使用“高级查找”功能筛选报表。
重要
目前,使用分层运算符的报表查询,例如 Under 运算符,无法用于报表筛选。 当您尝试运行使用分层运算符的报表时,报表不会呈现。
本主题内容
在基于 Fetch 的报表中启用数据预筛选
在基于 SQL 的报表中启用数据预筛选(仅 Dynamics 365 本地)
传递筛选摘要中的筛选器
默认筛选器
在基于 Fetch 的报表中启用数据预筛选
基于 Fetch 的报表仅支持自动数据预筛选。 一个报表可以具有多个数据集和多个 FetchXML 查询。 一个数据集支持一个 FetchXML 查询。 若要在基于 Fetch 的报表中对主要实体或链接的实体启用预筛选,则必须将 enableprefiltering 参数的值设置为“1”并在 prefilterparametername 属性中指定参数名。 参数名应该以”CRM_“开头以指定其为隐藏参数。 对于基于 Microsoft SQL Server 的报表,FetchXML 查询中指定的此参数用作 FetchXML 查询中的子查询,可使用运行报表时用户在“高级查找”区域中指定的值构造该子查询。
下面的示例显示如何在 FetchXML 查询中对主要实体启用预筛选。
<CommandText
<fetch distinct="false" mapping="logical">
<entity name="account" enableprefiltering="1" prefilterparametername="CRM_FilteredAccount">
<attribute name="name" />
<attribute name="accountid" />
</entity>
</fetch>
</CommandText>
<DataSourceName>CRM</DataSourceName>
同样,也可以对链接的实体启用预筛选。 还可以在 FetchXML 查询中为链接的实体指定其他预筛选条件,方法是在 prefilterparametername 属性中指定其他唯一名称作为参数名。
如果要手动修改基于 Fetch 的报表定义来对主要实体和链接实体启用预筛选,而不使用 Microsoft Dynamics 365 Web 应用程序或 SQL Server Data Tools 中的报表向导,请确保执行以下操作:
同样,也可以对链接的实体启用预筛选。 还可以在 FetchXML 查询中为链接的实体指定其他预筛选条件,方法是在 prefilterparametername 属性中指定其他唯一名称作为参数名。
如果要手动修改基于 Fetch 的报表定义来对主要实体和链接实体启用预筛选,而不使用 Microsoft Dynamics 365 Web 应用程序或 SQL Server Data Tools 中的报表向导,请确保执行以下操作:
<fetch distinct="false" mapping="logical"> <entity name="account" enableprefiltering="1" prefilterparametername="CRM_FilteredAccount">
使用为 prefilterparametername 属性指定的同一名称创建相应的查询参数。 确保参数名以 CRM_ 开头以指定其为隐藏参数。
<QueryParameters> <QueryParameter Name="CRM_FilteredAccount"> <Value>=Parameters!CRM_FilteredAccount.Value</Value> </QueryParameter>
使用同一名称创建相应的报表参数。
<ReportParameters> <ReportParameter Name="CRM_FilteredAccount"> <DataType>String</DataType> <Prompt>CRM Filtered Account</Prompt> </ReportParameter> </ReportParameters>
在基于 SQL 的报表中启用数据预筛选(仅 Dynamics 365 本地)
对 Microsoft Dynamics 365基于 SQL 报表启用数据预筛选有两种方法:自动和显式。
自动预筛选
自动数据预筛选适合简单的查询。 要对报表启用自动数据预筛选,您可以在查询中对实体表使用别名。 为此,您需要使用以 CRMAF_ 开头的别名。
例如,下表显示如何对简单的查询进行修改,以对 Account 实体启用预筛选功能。
不具有预筛选功能的查询 |
启用了自动预筛选功能的已修改查询 |
---|---|
|
|
使用 CRMAF_ 前缀启用自动数据预筛选功能时,Microsoft Dynamics 365 修改查询以在将其上载到 Microsoft Dynamics 365 时包括一个参数(例如 P1),如下表所示。
具有自动预筛选功能的查询 |
由 Microsoft Dynamics 365 修改 |
---|---|
|
|
Microsoft Dynamics 365 将根据报表的筛选方式向 P1 参数传递一个查询。 换句话说,自动数据预筛选充当现有查询的子查询。
下列示例演示 Microsoft Dynamics 365 如何根据不同的筛选要求向参数 (P1) 传递查询。 在这些示例中,假定您正在从 Microsoft Dynamics 365 的“报表”区域运行报表,并且正在使用数据筛选选项。
示例 1:如果仅查看活动客户,最终查询将如下所示:
SELECT <column1>, <column2>, <columnN>
FROM (SELECT FilteredAccount.* FROM FilteredAccount WHERE statecode = 0)
AS CRMAF_FilteredAccount
示例 2:如果您正在查看特定客户并运行了报表,最终查询将如下所示:
SELECT <column1>, <column2>, <columnN>
FROM (SELECT FilteredAccount.* FROM FilteredAccount WHERE AccountId = '<CurrentAccountId>')
AS CRMAF_FilteredAccount
示例 3:如果您正在查看三个所选客户列表,并且选择了针对所选记录运行报表的选项,最终查询将如下所示:
SELECT <column1>, <column2>, <columnN>
FROM (SELECT FilteredAccount.* FROM FilteredAccount WHERE AccountId in ('<1stAccountId>', '<2ndAccountId>', '<3rdAccountId>')
AS CRMAF_FilteredAccount
如果对任何实体表名使用别名,则在 Microsoft Dynamics 365 中运行部署的报表时,会在该报表中自动包含“高级查找”用户界面。
若要在查询生成器中对实体表名使用别名,请右键单击报表中的各个表格,选择“属性”,然后在窗体 CRMAF_FilteredEntity 中输入别名值,例如 CRMAF_FilteredAccount。
自动预筛选的限制
当使用 CRMAF_ 前缀启用自动预筛选时,Microsoft Dynamics 365 会在查询中添加一个参数。 对于较为复杂的查询(如使用 UNION 语句的查询),这样做可能会产生意外后果,因为 Microsoft Dynamics 365 可能只向第一个查询添加参数。
例如,下面所示的包含 UNION 语句的查询:
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = ‘FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'
上载报表时,Microsoft Dynamics 365 只能使用参数筛选第一个查询。 这样会导致筛选不能应用于第二个查询:
SELECT <column1>, <column2>, <columnN>
FROM (@P1) AS CRMAF_FilteredAccount WHERE address1_stateorprovince = 'FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'
在上面的示例中,从 Microsoft Dynamics 365 的”报表“区域运行报表并选择年收入大于 1,000,000 作为筛选器时, Microsoft Dynamics 365 将向 P1 参数传递查询,如下所示:
SELECT <column1>, <column2>, <columnN>
FROM (SELECT FilteredAccount.* from FilteredAccount where AnnualRevenue > 1000000) AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'FL'
UNION
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount
WHERE address1_stateorprovince = 'CA'
这意味着查询仅返回佛罗里达州年收入大于 $1,000,000 的客户和加利福尼亚州的所有客户,这并不是您想要的结果。 您希望查看佛罗里达州和加利福尼亚州年收入大于 $1,000,000 的所有客户。
如果从 Microsoft Dynamics 365 下载报表,并在 Microsoft Visual Studio 中将其打开,您可以看到上载到 Microsoft Dynamics 365 的报表的原始版本。 如果直接从 Microsoft SQL Server Reporting Services 下载报表,您将注意到 Microsoft Dynamics 365 已修改了查询,但是没有按照您所需的方式添加参数。
对于此类复杂查询,必须使用显式预筛选。
显式预筛选
对于复杂查询(如使用 UNION 语句的查询),可能需要使用显式预筛选。 与自动预筛选不同,将报表上载到 Microsoft Dynamics 365 后,显式预筛选期间 Microsoft Dynamics 365 不会通过向参数传递值来重写报表查询。 您必须通过以下方式对报表明确进行所需的更改:向报表添加预筛选参数,然后在查询中引用该参数。 然后可以使用动态 SQL 执行查询。
如果使用动态 SQL,可以通过创建名为 CRM_FilteredEntity 的隐藏参数(例如 CRM_FilteredAccount)并在动态 SQL 查询表达式中使用该参数来启用通过“高级查找”的筛选功能。 此参数对从指定的筛选视图中获取的表数据启用筛选功能。
下表使用的示例与上文中用于重点说明自动预筛选限制的示例相同,此处通过该示例说明如何将具有自动预筛选功能的查询修改为具有使用动态 SQL 进行显式预筛选的查询。 该示例同样假定正在从 Microsoft Dynamics 365 的“报表”区域运行报表,并且已将年收入大于 1,000,000 作为筛选器应用。
具有自动预筛选功能的查询 |
修改为使用显式预筛选的查询 |
---|---|
|
|
备注
大多数标准 Microsoft Dynamics 365基于 SQL 报表使用显式预筛选选项。
传递筛选摘要中的筛选器
筛选摘要显示运行报表时使用的筛选器的值。 在 Microsoft Dynamics 365 报表中,它在报表标题中显示为包含筛选器文本值的文本框报表项。 用户运行报表时,报表查看器显示“编辑筛选器”按钮。 单击该按钮时,用户可以定义数据筛选器。Microsoft Dynamics 365 附带的“用户摘要”报表中提供了筛选摘要示例。
若要向报表中添加筛选摘要,请按照下列步骤操作:
创建名为 CRM_FilterText 的隐藏字符串参数。
向报表中添加文本框报表项,并按如下方式设置其 Value 属性:
=Parameters!CRM_FilterText.Value.
报表运行时,系统会将 CRM_FilterText 参数的值设置为当前筛选器的文本。
默认筛选器
发布报表时,可以设置默认筛选器。 对于使用报表向导创建的所有报表,如果未设置默认筛选器,则它会自动设置为在过去 30 天内修改的实体的所有记录。 有关定义默认报表筛选器的过程,请参阅发布报表。
另请参阅
使用 Dynamics 365 报告和分析
Microsoft Dynamics 365(联机)报告注意事项
© 2017 Microsoft。 保留所有权利。 版权