none
运行一个报表所碰到的查询问题 RRS feed

  • 问题

  • 在做一个报表(有很多条报表记录)的时候,如果在查询语句的最后加上Where条件判断,只取一条记录,则运行报表时,报表展示得很快;如果不加条件判断,取出所有的记录,则始终在加载中,永远看不到报表结果。

    我的IE版本是6.0,CRM 4.0。

    2010年7月7日 9:00

答案

全部回复

  • CRM的报表是要加筛选条件的,不加筛选条件,严重影响使用

    还有就是如果是分析报表建议用独立的数据库,不要用操作中的数据库

    • 已标记为答案 Slowlau 2010年7月8日 7:03
    2010年7月7日 9:21
  • CRM的报表是要加筛选条件的,不加筛选条件,严重影响使用

    还有就是如果是分析报表建议用独立的数据库,不要用操作中的数据库

    筛选条件的添加是在报表的“编辑数据集”中添加吗?还是在用那个CRMAF_?

    两者分别是什么含义呢?

    谢谢小宁。

    • 已标记为答案 Slowlau 2010年7月8日 7:03
    • 取消答案标记 Slowlau 2010年7月8日 7:03
    2010年7月7日 9:29
  • 在报表中使用筛选器

    以下引自sdk

    在报表中使用筛选器

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

    除了 Reporting Services 支持的数据筛选外,Microsoft Dynamics CRM 还支持数据预筛选。您可以使用数据预筛选实现以下目的:

    • 缩小报表的范围,使其返回更具相关性的数据,使报表成为上下文相关报表。
    • 更快地检索并显示结果集,因为只返回更具相关性的数据。
    • 允许使用“高级查找”功能筛选报表。

    对报表启用数据预筛选

    对 Microsoft Dynamics CRM 报表启用数据预筛选有两种方法:自动预筛选和显式预筛选。下面各部分介绍了这两种预筛选。

    自动预筛选

    要对报表启用自动数据预筛选,您可以使用以“CRMAF_”开头的别名在查询中对实体表使用别名。

    自动数据预筛选适合简单的查询。例如,下表显示如何对简单的查询进行修改,以对“客户”实体启用预筛选功能。

    不具有预筛选功能的查询 启用了自动预筛选功能的已修改查询
    SELECT <column1>, <column2>, <columnN>

    FROM FilteredAccount;

    SELECT <column1>, <column2>, <columnN>

    FROM FilteredAccount AS CRMAF_FilteredAccount;


    使用“CRMAF_”前缀启用自动数据预筛选功能时,Microsoft Dynamics CRM 会修改查询,使其在上载到 Microsoft Dynamics CRM 时包含参数(例如 P1),如下表所示。

    具有自动预筛选功能的查询 Microsoft Dynamics CRM 修改后的查询
    SELECT <column1>, <column2>, <columnN> FROM FilteredAccount AS CRMAF_FilteredAccount; SELECT <column1>, <column2>, <columnN> FROM (@P1) AS CRMAF_FilteredAccount;

    Microsoft Dynamics CRM 将根据报表的筛选方式向 P1 参数传递一个查询。换句话说,自动数据预筛选充当现有查询的子查询。

    下列示例演示 Microsoft Dynamics CRM 如何根据不同的筛选要求向参数 (P1) 传递查询。在这些示例中,假定您正在从 Microsoft Dynamics CRM 的“报表” 区域运行报表,并且正在运行数据筛选选项。

    示例 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>')
    
    
    A
    
    S CRMAF_FilteredAccount

    示例 3 :如果您正在查看三个所选客户列表,并且选择了针对所选记录运行报表的选项,最终查询将如下所示:

    SELECT <column1>, <column2>, <columnN>
    FROM (SELECT FilteredAccount.* FROM FilteredAccount WHERE AccountId in ('<1stAccountId>', '<2ndAccountId>', '<3rdAccountId>')
    
     
    AS CRMAF_FilteredAccount

    如果对任何实体表名使用别名,则在 Microsoft Dynamics CRM 中运行部署的报表时,会在该报表中自动包含“高级查找”用户界面。

    要在查询生成器中对实体表名使用别名,请右键单击报表中的每个表,然后单击快捷菜单中的“属性” ,并在表单 CRMAF_FilteredEntity 中输入别名值,例如 CRMAF_FilteredAccount。

    自动预筛选的限制

    使用“CRMAF_”前缀启用自动预筛选时,Microsoft Dynamics CRM 必须在查询中添加参数。对于较为复杂的查询(如使用 UNION 语句的查询),这样做可能会产生意外后果,因为 Microsoft Dynamics CRM 可能只向第一个查询添加参数。

    例如,下面所示的包含 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 CRM 只能使用参数筛选第一个查询。这样会导致筛选不能应用于第二个查询:

    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 CRM 的“报表” 区域运行报表并选择年收入大于 1,000,000 作为筛选器时,Microsoft Dynamics CRM 将向 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 CRM 下载报表,并在 Visual Studio 中将其打开,您可以看到上载到 Microsoft Dynamics CRM 的报表的原始版本。如果直接从 SQL Server Reporting Services 下载报表,您将注意到 Microsoft Dynamics CRM 已修改了查询,但是没有按照您所需的方式添加参数。

    对于此类复杂查询,必须使用显式预筛选。

    显式预筛选

    对于复杂查询(如使用 UNION 语句的查询),可能需要对数据使用显式预筛选。与自动预筛选不同,将报表上载到 Microsoft Dynamics CRM 后,显式预筛选期间 Microsoft Dynamics CRM 不会通过向参数传递值来重写报表查询。您必须通过以下方式对报表显式进行所需的更改:向报表添加预筛选参数,然后在查询中引用该参数。然后可以使用动态 SQL 执行查询。

    如果使用动态 SQL,可以通过创建名为 CRM_FilteredEntity 的隐藏参数(例如 CRM_FilteredAccount)并在动态 SQL 查询表达式中使用该参数来启用通过“高级查找”进行筛选功能。此参数对从指定的筛选视图中获取的表数据启用筛选功能。

    下表使用的示例与上文中用于重点说明自动预筛选限制的示例相同,此处通过该示例说明如何将具有自动预筛选功能的查询修改为具有使用动态 SQL 进行显式预筛选的查询。本示例同样假定正在从 Microsoft Dynamics CRM 的“报表” 区域运行报表,并且已将年收入大于 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'

    DECLARE @SQL nvarchar(4000)

    DECLARE @CRM_FilteredAccount nvarchar(2000)

    Set @CRM_FilteredAccount = 'Select FilteredAccount.* FROM FilteredAccount where AnnualRevenue > 1000000'

    SET @SQL = 'SELECT <column1>, <column2>, <columnN>

    FROM ('+@CRM_FilteredAccount+') AS FA where address1_stateorprovince = ''FL''

    UNION

    SELECT <column1>, <column2>, <columnN>

    FROM ('+@CRM_FilteredAccount+') as CA where address1_stateorprovince  = ''CA'' '

    EXEC (@SQL)


    注意 :大多数标准 Microsoft Dynamics CRM 报表使用显式预筛选选项。

    在筛选摘要中传递筛选器

    筛选摘要显示运行报表时使用的筛选器的值。在标准 Microsoft Dynamics CRM 报表中,它显示为报表页眉中包含筛选器文本值的 Textbox 报表项。用户运行报表时,报表查看器显示“编辑筛选器” 按钮。单击该按钮时,用户可以定义数据筛选器。Microsoft Dynamics CRM 附带的“用户摘要”报表中提供了筛选摘要示例。

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

    1. 创建名为 CRM_FilterText 的隐藏字符串参数。
    2. 向报表中添加 Textbox 报表项,并按如下方式设置其 Value 属性:=Parameters!CRM_FilterText.Value。

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

    默认筛选器

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

    2010年7月7日 9:44
  • 首先建议升级IE,6.0有很多问题,如果是SQL查询的性能问题,可以在表里添加相应的index索引。

     


    Jim Wang - MVP Dynamics CRM - http://jianwang.blogspot.com, http://www.mscrm.cn
    • 已标记为答案 Slowlau 2010年7月8日 7:04
    2010年7月7日 10:58
    版主
  • 百会CRM  上海    www.baihui.com     www.netfarmer.com.cn  13917256114
    2010年7月13日 9:35