MSCRM中报表开发一:创建基于SQL报表
1. 新建报表项目。打开SQL Server Business Intelligence Development Studio,点击 文件 > 新建 > 项目,项目类型选择 商业智能项目 中的 报表服务器项目,为该项目命个名字。
2. 添加报表,我这里命名为 OppSQLReport.rdl 。
3. 添加数据源。类型要选择 Microsoft SQL Server,点击连接字符串旁边的 编辑 按钮,在弹出的连接属性对话框中,在服务器名称中输入SQL Server所在的服务器名称,登录到服务器使用默认的 使用Windows 身份验证,连接到一个数据库则选择你要发布到到的组织对应的数据库,一般是组织名称加上下划线在加上MSCRM。然后点击 确定 按钮就会自动生成连接字符串。在数据源的凭据中则使用第一个选项 使用Windows身份验证不变。



4. 添加数据集。右击刚才添加的数据源,选择 添加数据集 ,在 查询下面的文本框中输入你准备好的SQL语句,我这里是输入 SELECT name, estimatedclosedate, estimatedvalue FROM FilteredOpportunity 。然后点击本对话框的确定按钮。

5. 制作报表。从工具箱中拖动出来一个表,将三列拖动到表中,并且预览下没有问题。注意格式化的问题,可以参考文章 设置报表内容格式 ,如果是设置基础货币的显示格式,对应的筛选视图中有个列名叫crm_moneyformatstring,将货币类型字段的Format属性设置为这个字段即可。其他的格式化信息则通过 SELECT * FROM dbo.fn_GetFormatStrings() 新建一个DataSet,可以将这个DataSet命名为DSNumandCurrency,然后将显示字段的Format设置为类似如下之一即可:
First(Fields!DateFormat.Value, "DSNumandCurrency")
First(Fields!TimeFormat.Value, "DSNumandCurrency")
First(Fields!NumberFormat_0_Precision.Value, "DSNumandCurrency")
First(Fields!NumberFormat_2_Precision.Value, "DSNumandCurrency")
First(Fields!CurrencyFormat_2_Precision.Value, "DSNumandCurrency")

6. 为报表启用预筛选。因为这个是很简单的报表,我就用一种简单的办法来启用预筛选。就是SDK中说的 Automatic Pre-Filtering 方法。双击数据集,将FilteredOpportunity后面增加 AS CRMAF_FilteredOpportunity,如下图所示,然后点击确定。这个命名有讲究,就是要以 CRMAF_ 开头。

7. 发布报表。导航到 工作区 > 报表,设置属性如下图所示。然后点击保存并关闭按钮。

8. 测试报表。到 销售 > 商机 界面,选择一些记录,点击 运行报表 ,一会儿报表效果如下图所示,我后来为报表加了饼状图。


9. 使用显式预筛选。因为自动预筛选有些局限性,仅限于简单的报表,所以我这里也说明一下显示预筛选。显式开启预筛选功能,需要用到一个CRM参数CRM_FilteredEntity,因为是针对Opportunity实体,所以这个参数名称应该名为为CRM_FilteredOpportunity。增加的参数属性如下,除了名称外,最好将选择参数可见性更改为隐藏。将其默认值设置为 select FilteredOpportunity0.* from FilteredOpportunity as FilteredOpportunity0 。当然,不要在查询语句中使用 * ,一般应该指明要使用的查询列名,我这里是演示,所以从简了,也可以使用 select name, estimatedclosedate, estimatedvalue from FilteredOpportunity 更好。


10. 增加参数。更改数据集的属性,双击它,增加一个参数,名称为 @CRM_FilteredOpportunity ,值为 [@CRM_FilteredOpportunity] ,并将查询的SQL更改为类似如下:这样就完成使用显示预筛选的更改了。
DECLARE @SQL NVARCHAR(4000);
SET @SQL = 'SELECT name, estimatedclosedate, estimatedvalue FROM (' + @CRM_FilteredOpportunity + ') AS Filtered';
EXEC(@SQL);


如果碰到关联多个实体来显示数据的话,需要为要启用预筛选的实体创建一个参数,和前面的增加参数的类似。比如另外一个例子是 客户和联系人实体关联,显示客户和联系人两个实体的字段,我需要在客户上启用预筛选,那么我需要增加一个报表参数,名称为 CRM_FilteredAccount,这个参数的默认值我可以设置为简单的 select name,accountid from FilteredAccount ,并将这个参数设置为隐藏。
然后我还要修改数据集,增加一个参数,参数名为 @CRM_FilteredAccount ,参数值为 [@CRM_FilteredAccount] ,然后修改数据集的SQL类似如下:
DECLARE @SQL NVARCHAR(4000);
SET @SQL = 'select Filtered.Name,FilteredContact.FullName FROM (' + @CRM_FilteredAccount + ') AS Filtered ';
SET @SQL = @SQL + ' inner join FilteredContact on Filtered.AccountId = FilteredContact.AccountId';
EXEC(@SQL);
SET @SQL = 'select Filtered.Name,FilteredContact.FullName FROM (' + @CRM_FilteredAccount + ') AS Filtered ';
SET @SQL = @SQL + ' inner join FilteredContact on Filtered.AccountId = FilteredContact.AccountId';
EXEC(@SQL);
这样就可以做到多实体关联的预筛选了。
值得注意的是,若之前报表没有启用预筛选,后来启用的,需要删除原来的报表,重新上传,囧。还有报表会有个默认的筛选条件,我们删除的话,去 报表 界面编辑默认筛选器,将条件去掉并保存即可。
引用来源:http://luoyong0201.blog.163.com/blog/static/1129305201311193338296/
注明:基于SQL的报表只能应用于On-Premise的CRM中,不能应用于Online版本的CRM中。