返回大型数据集的报表可能难以使用,并可能导致性能问题。 要限制报表中显示的数据,请使用数据筛选器。
除了 Reporting Services 支持的数据筛选之外,Microsoft Dynamics 365 Customer Engagement (on-premises) 还支持数据预筛选。 您可以使用数据预筛选来:
通过缩小报表的范围以返回更相关的数据,使报表与上下文相关。
检索和显示结果集速度更快,因为只返回最相关的数据。
允许使用 Advanced Find 功能筛选报表。
重要
目前,带有分层运算符 (如运算符) Under
的报表查询不能与报表筛选一起使用。 当您尝试运行使用分层运算符的报表时,报表不会呈现。
在基于 Fetch 的报表中启用数据预筛选
基于 Fetch 的报表仅支持自动数据预筛选。 一个报表可以有多个数据集和多个 FetchXML 查询。 一个数据集支持一个 FetchXML 查询。 要在基于 Fetch 的报表中为主实体或链接实体启用预筛选,您必须将参数的值 enableprefiltering
设置为“1”,并在属性 prefilterparametername
中指定参数名称。 参数名称应以 “CRM_” 开头,以将其指定为隐藏参数。 与基于 SQL Server 的报表一样,在 FetchXML 查询中指定的此参数充当 FetchXML 查询中的子查询,子查询是使用用户在运行报表时在 Advanced Find 区域中指定的值构建的。
以下示例演示如何在 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>
同样,您可以为链接实体启用预筛选。 您还可以通过在属性中
prefilterparametername
为参数名称指定不同的唯一名称,为 FetchXML 查询中的链接实体指定不同的预筛选条件。如果要手动修改基于 Fetch 的报表定义来对主要实体和链接的实体启用预筛选,而不使用报表向导或 SQL Server Data Tools,请确保执行以下操作:
<fetch distinct="false" mapping="logical"> <entity name="account" enableprefiltering="1" refilterparametername="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 会修改查询以在将查询上传到 Dynamics 365 时包含参数(例如 P1),如以下示例所示。
具有自动预筛选的查询。
SELECT <column1>, <column2>, <columnN>
FROM FilteredAccount AS CRMAF_FilteredAccount;
Dynamics 365 将根据报表的筛选方式将查询传递给 P1 参数。 换句话说,自动数据预筛选充当现有查询中的子查询。
以下示例说明了 Dynamics 365 如何根据不同的筛选要求将查询传递给参数 (P1)。 在这些示例中,假定您从 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
当任何实体表名称为别名时,从 Dynamics 365 运行高级查找用户界面时,该界面将自动包含在已部署的报表中。
要在 Query Builder 中为实体表名称设置别名,请右键单击报表中的每个表,选择 Properties (属性),然后在表单 CRMAF_FilteredEntity 中输入别名值,例如 CRMAF_FilteredAccount。
自动预过滤的限制
当您使用 CRMAF_
前缀启用自动预筛选时,Dynamics 365 会在查询中添加一个参数。 对于更复杂的查询,例如使用 UNION 语句的查询,这可能会导致意外结果,因为 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'
上传报表时,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'
在前面的示例中,当从 Dynamics 365 的“报表”区域运行报表并选择年收入超过1,000,000的过滤器时,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 USD 的那些账户以及加利福尼亚州的所有账户,这不是您的预期。 您想要查看佛罗里达州和加利福尼亚州年收入超过 1,000,000 美元的所有账户。
如果您从 Dynamics 365 下载报表并在 Microsoft Visual Studio 中打开它,您将看到您上传到 Dynamics 365 的报表的原始版本。 如果您直接从 Microsoft SQL Server Reporting Services 下载报表,您将注意到 Dynamics 365 修改了查询,但未将参数放置在您希望它存在的位置。
对于此类复杂查询,您必须使用显式预筛选。
显式预过滤
对于复杂查询,例如使用 UNION 语句的查询,您可能需要使用显式预筛选。 与自动预筛选不同,当此类报表上载到 Dynamics 365 时,Dynamics 365 不会通过在显式预筛选期间将值传递给参数来重写报表查询。 您必须通过向报表添加预过滤参数,并在查询中引用该参数来显式地进行所需更改。 然后,您可以使用动态 SQL 执行查询。
使用动态 SQL 时,通过创建名为 CRM_FilteredEntity
(例如, CRM_FilteredAccount
) 的隐藏参数,并在动态 SQL 查询表达式中使用此参数,可以启用通过“高级查找”进行筛选。 此参数允许对从指定筛选视图中获取的表数据进行筛选。
采用与前面讨论的相同的示例来强调自动预筛选的限制,下表显示了一个查询,其中自动预筛选被修改为使用动态 SQL 的显式预筛选。 假设在 Dynamics 365 的 Reports 区域生成报表时,筛选条件已设置为年收入大于 1,000,000。
具有自动预筛选的查询。
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'
注释
大多数基于 Dynamics 365 SQL 的标准报表都使用显式预筛选选项。
传递筛选摘要中的筛选器
筛选器摘要显示运行报表时使用的筛选器的值。 在报表中,它显示为包含筛选器文本值的报表页眉中的文本框报表项。 当用户运行报表时,Report Viewer 将显示 Edit Filter 按钮。 单击该按钮时,它使用户能够定义数据过滤器。 筛选器摘要的示例可以在 Customer Engagement (on-premises) 附带的“用户摘要”报表中找到。
要向报表添加筛选器摘要,请执行以下步骤:
创建一个名为
CRM_FilterText
的隐藏字符串参数.向报表中添加文本框报表项并设置其
Value
属性,如下所示:
=Parameters!CRM_FilterText.Value.
运行报告时,系统会将参数的值
CRM_FilterText
设置为当前过滤器的文本。
默认筛选器
发布报表时,您可以设置默认筛选器。 对于使用报表向导创建的所有报表,如果未设置默认筛选器,则筛选器将自动设置为过去 30 天内修改的实体的所有记录。 有关定义默认报表筛选器的过程,请参阅 发布报表。