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中。