使用筛选器,提高报表的性能

返回大型数据集的报表可能难以使用并且会引发性能问题。 若要限制在报表中显示的数据,请使用数据筛选器。

除了 Reporting Services 支持的数据筛选外,Microsoft Dynamics 365 Customer Engagement (on-premises) 还支持数据预筛选。 可以使用数据预筛选实现以下目的:

  • 缩小报表的范围,使其返回更具相关性的数据,从而使报表成为上下文相关报表。

  • 更快地检索并显示结果集,因为只返回更具相关性的数据。

  • 允许使用高级查找功能筛选报表。

重要提示

目前,使用分层运算符的报表查询,例如 Under 运算符,无法用于报表筛选。 当您尝试运行使用分层运算符的报表时,报表不会呈现。

在基于 Fetch 的报表中启用数据预筛选

基于 Fetch 的报表仅支持自动数据预筛选。 一个报表可以具有多个数据集和多个 FetchXML 查询。 一个数据集支持一个 FetchXML 查询。 若要在基于 Fetch 的报表中对主要实体或链接的实体启用预筛选,则必须将 enableprefiltering 参数的值设置为“1”并在 prefilterparametername 属性中指定参数名。 参数名应该以“CRM_”开头以指定其为隐藏参数。 对于基于 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>  
  1. 同样,也可以对链接的实体启用预筛选。 还可以在 FetchXML 查询中为链接的实体指定其他预筛选条件,方法是在 prefilterparametername 属性中指定其他唯一名称作为参数名。

    如果要手动修改基于 Fetch 的报表定义来对主要实体和链接的实体启用预筛选,而不使用报表向导或 SQL Server Data Tools,请确保执行以下操作:

    <fetch distinct="false" mapping="logical">  
    <entity name="account" enableprefiltering="1" refilterparametername="CRM_FilteredAccount">  
    
  2. 使用为 prefilterparametername 属性指定的同一名称创建相应的查询参数。 确保参数名以 CRM_ 开头以指定其为隐藏参数。

    <QueryParameters>  
    <QueryParameter Name="CRM_FilteredAccount">  
    <Value>=Parameters!CRM_FilteredAccount.Value</Value>  
    </QueryParameter>  
    
  3. 使用同一名称创建相应的报表参数。

    <ReportParameters>  
    <ReportParameter Name="CRM_FilteredAccount">  
    <DataType>String</DataType>  
    <Prompt>CRM Filtered Account</Prompt>        
    </ReportParameter>  
    </ReportParameters>    
    

在基于 SQL 的报表中启用数据预筛选(仅 Dynamics 365 On-premises)

您可以通过以下两种方式在基于 SQL 的 Microsoft Dynamics 365 报表上启用数据预筛选:自动和显式。

自动预筛选​

自动数据预筛选适合简单的查询。 若要对报表启用自动数据预筛选,您可以在查询中对实体表使用别名。 您可以使用以 CRMAF_ 开头的别名来执行此操作。

例如,以下示例显示了两个简单的查询,其中一个已修改以对客户实体启用预筛选。

没有预筛选的查询。

   SELECT <column1>, <column2>, <columnN>
   FROM FilteredAccount; 

使用 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 运行部署的报表时,会在该报表中自动包含“高级查找”用户界面。

若要在查询生成器中对实体表名使用别名,请右键单击报表中的每个表,选择属性,然后在窗体 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 的客户,以及加利福尼亚州的所有客户,这不是您想要的结果。 您想查看佛罗里达州和加利福尼亚州年收入超过 $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 中的报表区域运行报表时,已应用年收入大于 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'

备注

大多数基于 SQL 的标准 Dynamics 365 报表使用显式预筛选选项。

传递筛选摘要中的筛选器

筛选摘要显示运行报表时使用的筛选器的值。 在报表中,它在报表标题中显示为包含筛选器文本值的文本框报表项。 用户运行报表时,报表查看器显示编辑筛选器按钮。 单击该按钮时,用户可以定义数据筛选器。 Customer Engagement (on-premises) 附带的“用户摘要”报表中提供了筛选摘要示例。

若要向报表中添加筛选摘要,请按照下列步骤操作:

  1. 创建名为 CRM_FilterText 的隐藏字符串参数。

  2. 向报表中添加文本框报表项,并按如下方式设置其 Value 属性:
    =Parameters!CRM_FilterText.Value.

    报表运行时,系统会将 CRM_FilterText 参数的值设置为当前筛选器的文本。

默认筛选器

发布报表时,可以设置默认筛选器。 对于使用报表向导创建的所有报表,如果未设置默认筛选器,则它会自动设置为在过去 30 天内修改的实体的所有记录。 有关定义默认报表筛选器的过程,请参阅发布报表

另请参见

报告和分析指南
Dynamics 365 for Customer Engagement (on-premises) 报告注意事项