利用 SQL Server Reporting Services 從應用程序生成用戶友好的報表

本頁內容
Reporting Services 概述 Reporting Services 概述
設計第一個報表 設計第一個報表
部署和測試 部署和測試
將報表添加到 Web 應用程序 將報表添加到 Web 應用程序
將報表嵌入到 Web 應用程序中 將報表嵌入到 Web 應用程序中
保證報表的安全 保證報表的安全
使用 Reporting Services Web 服務 使用 Reporting Services Web 服務
訂閱報表 訂閱報表
接下來該怎麼做? 接下來該怎麼做?

靈活的報表功能是大多數業務應用程序的一個要求,這些報表功能在集成到 Web 應用程序中之後用途更加廣泛。利用 SQL Server® 2000 Reporting Services 的最新版本,您可以輕鬆地具有來自各種數據源的報表生成功能。在本文中,我將介紹使用 Visual Studio® 和 Reporting Services 來編寫報表,並演示如何將報表集成到 Web 應用程序中。


Reporting Services 是基於服務器的報表生成平臺,該平臺構建在 .NET Framework 上並與 SQL Server 2000 集成在一起,因此您可以使用一個擴展的基於 Web 服務的 API 將豐富的報表生成功能集成到應用程序中。儘管報表服務器使用 SQL Server 作爲報表的儲存庫,但利用 OLE DB、ODBC 或 ADO.NET 提供程序的任何數據源都可以用來爲報表提供數據,這就使得 Reporting Services 成爲在各種企業環境中生成報表的極佳工具。


Reporting Services 是作爲 SQL Server 2000 的一部分而授權的,因此如果您有已授權的 SQL Server 的副本,則可以在同一服務器上運行 Reporting Services 而無需支付額外的許可證費用。如果您決定在獨立的、尚未經 SQL Server 授權的計算機(例如,Web 服務器)上運行 Reporting Services,您將需要購買額外的 SQL Server 許可證。


要開始使用 Reporting Services,您可以下載位於 SQL Server 2000 Reporting Services 的 120 天試用版軟件,它還包括有關如何獲得該產品的安裝媒體的說明。在安裝該產品時,請確保選中包括示例報表的選項,因爲我要將這些報表集成到本文的 Web 應用程序中。



Reporting Services 概述


Reporting Services 報表設計使用新的 Visual Studio .NET 2003 報表設計器,在安裝有 Visual Studio 的同一計算機上安裝了 Reporting Services 後,該設計器就可以使用。設計器以新的基於 XML 報表定義語言 (RDL) 輸出報表佈局和數據訪問的說明,而 RDL 文件會發布到報表服務器。如果您希望爲用戶提供創作功能,也可以使用第三方的報表設計器。


管理員可以使用基於 Web 的報表管理器來管理已發佈的報表,並且可以執行一些任務,例如,保證某些用戶組報表的安全或更改已部署報表的數據源連接字符串。用戶也可以使用報表管理器來瀏覽和查看報表;但是很多公司傾向於使用 URL 請求或 Reporting Services Web 服務,將報表查看直接集成到它們現有的內部 Web 站點或應用程序中。



USissues0408SQLServerReportingServicesfig01

1 Reporting Services 體系結構



可以將報表參數化,這樣用戶可以在查看報表時從選擇列表中進行挑選;它們還可以導出爲多種格式,例如,Microsoft®Excel、PDF 和 XML。儘管實時報表提供最新的數據,也可以將報表緩存一段時間以提高性能並減少數據源上的負載。對於商務智能應用程序,報表可以訪問 Analysis Services OLAP 多維數據集,而且 Reporting Services 甚至可以導入現有的 Microsoft Access 報表,儘管由於這兩種技術間存在差異,它並不能支持所有的 Access 功能。有關 Reporting Services 體系結構的詳細情況,請參見 1



設計第一個報表


儘管我介紹的重點在於將報表集成到應用程序中而不是創作報表,但熟悉 Reporting Services 的最好辦法就是立即着手創建一個新的報表項目。爲此,請打開 Visual Studio 並使用 Report Project Wizard 創建一個新的項目,該向導位於 Business Intelligence Projects 部分。爲您的項目指定一個名稱,單擊“OK”,然後將顯示報表嚮導對話框。在您選擇數據源的這一步驟中,單擊“Edit”按鈕,以便指定連接到您數據庫服務器上的 AdventureWorks2000,單擊“OK”,然後選中使其成爲共享數據源的選項。


單擊“Next”進入到“Design the Query”步驟,指定簡單的 SQL 語句(例如,“SELECT * FROM Product”),然後單擊“Next”。Reporting Services 支持顯示一組固定列的標準表格式 (Tabular) 報表,也支持使用帶有動態列的交叉表樣式視圖的矩陣式 (Matrix) 報表,因此爲該報表選擇 Tabular,然後單擊“Next”。


將某些列(例如,ProductID 和 Name)拖到 Details 部分並單擊“Next”。選擇默認的 Bold 樣式,單擊“Next”,然後指定您的報表服務器的虛擬目錄的 URL,例如,http://MyServer/ReportServer。現在,單擊“Next”。最後一步,您可以爲您的第一個報表指定名稱,例如,Products Report;然後單擊“Finish”。


該向導將會創建該項目,同時還創建一個可以由多個報表共享 AdventureWorks2000 數據源,以及一個在設計器中打開的有關 Products 數據的報表(請參見 2)。默認情況下,顯示使您可以修改報表設計的 Layout 選項卡。



USissues0408SQLServerReportingServicesfig02

2 Visual Studio 報表設計器




Data 選項卡用於指定報表的查詢,包括設置參數以便在執行報表時提示用戶提供值。單擊“Preview”選項卡來測試報表顯示給用戶的方式。


現在,您可以將附加的報表添加到該項目,或者通過添加附加列、將數據分組、添加彙總、甚至是添加能夠顯示來自其他查詢的數據的附加表來修改 Products 報表。與很多報表設計器不同,Reporting Services 使用帶外設計,這使得它可以輕鬆地創建將各種源的數據集中在同一個位置的報表。


您剛剛創建的報表項目由當前駐留在您的開發計算機上的一組文件組成。爲了將這些報表發佈給用戶,您需要將該項目部署到報表服務器。



部署和測試


在部署報表項目之前,需要指定將項目部署到哪一個服務器。如果您最初使用該向導創建了報表項目,那麼您可能已經指定了目標服務器。


要檢查該設置或指定一個新服務器,請選擇“Project | Properties”來顯示 Project Properties 對話框。進行該設置使您可以指定項目的文件夾名和 Reporting Services Web 服務的 URL。在菜單上選擇“Build | Deploy Solution”將構建報表項目,然後將其部署到服務器。


在部署報表項目後,您就可以進行測試了。已部署到服務器的每個報表都具有唯一的路徑,該路徑可以用於在瀏覽器中顯示報表。例如,要顯示您創建的第一個報表,請打開瀏覽器並導航到 http://MyServer/ReportServer?/Report+Project1/Products+Report。這會以 HTML 格式呈現報表並在頁面的頂端顯示一個工具欄,以便使您可以對報表進行翻頁、更改縮放比例,甚至以各種其他格式(例如,PDF)查看報表。


您還可以通過導航到服務器上的以下 URL,來瀏覽已部署到服務器的所有報表項目的列表:http://MyServer/ReportServer。報表服務器提供使您可以查看已部署的報表類型和查看報表的最小的用戶界面。


報表管理器是一個更加友好、功能更豐富的工具,可以通過簡單地導航到本地服務器上的以下 URL 來訪問該工具:http://MyServer/Reports

將報表添加到 Web 應用程序


既然您知道如何設計、部署和測試報表,就讓我們將這些報表集成到應用程序中吧!很多 Web 應用程序都包括針對每個用戶的自定義主頁,通常稱爲“儀表板”。這個頁面通常提供針對用戶量身定做的摘要式信息並作爲跳轉點來訪問應用程序的其他功能。


我將使用 Reporting Services 附帶的示例報表構建一個儀表板來演示報表集成,如圖 3 所示。如果您在安裝過程中安裝了示例報表,您可以打開該報表項目(安裝到 /Reporting Services/Samples/Reports)並將其部署到測試服務器。您可以使用報表管理器工具通過瀏覽到 SampleReports 文件夾來測試示例報表。



USissues0408SQLServerReportingServicesfig03

3 儀表板 Web 應用程序




爲用戶提供從應用程序訪問報表的權限的最簡單方法就是使用超級鏈接。如您已經看到的那樣,每個報表都具有唯一的、用於在瀏覽器中顯示報表的路徑。對於儀表板應用程序,報表應該在單獨的窗口中打開,因此我將爲該超級鏈接指定一個目標。到目前爲止,這是非常簡單的,但是對於具有參數報表的報表(例如,Employee Sales Summary 報表)來說,情況又如何呢?要真正地將報表集成到應用程序中,您通常需要爲參數指定某些值,以便用戶不會被經常提示。


Reporting Services 使這項任務非常簡單:報表參數的值可以指定爲 URL 的一部分。例如,Employee Sales Summary 報表具有 ReportYear、ReportMonth 和 EmpID 參數,因此顯示編號爲 24 的員工在 11 月份的銷售額的超級鏈接可以是:

<a href="http://MyServer/ReportServer?/SampleReports/Employee Sales   
   Summary&ReportMonth=11&EmpID=24" target="_blank">November Sales Summary
</a>

不具有在 URL 中指定的值的參數將使用在報表設計器中設置的默認值,因此剛纔展示的示例銷售彙總報表使用的 ReportYear 值是 2003。Reporting Services 還有一組用於控制報表顯示方式的內置參數。這些參數通過加上前綴“rs:”來區別您自己的報表參數。


其中最有用的一個參數就是 rs:Format 參數,它用於指定呈現報表的格式。這使您可以包括不需要顯示在 HTML 中的報表,還可以使用諸如 PDF 甚至是 XML 的格式。其他常用參數是 rs:Command,指示出要應用到您所指定的路徑的操作。例如,rs:Command=Render 將呈現一個報表,而 rs:Command=ListChildren 將列出文件夾中所有項。


如果您沒有指定命令,Reporting Services 將查看您指定的路徑並計算出要採取的適當操作,例如,呈現報表。圖 4 顯示了 rs:parameters 的列表。
另一組內置參數控制各種輸出格式的行爲並使用 rc:prefix。每個報表格式都具有其自己特定的一組參數。例如,要以沒有標題行的逗號分隔值 (CSV) 格式呈現報表,您應該使用 rc:NoHeader 參數:

<a href="http://MyServer/ReportServer?/SampleReports/Company Sales
   &rs:Command=Render&rs:Format=CSV&rc:NoHeader=true">Company Sales
</a>

HTML 格式具有非常多的 rc:parameters,在將報表集成到 Web 應用程序中時爲您提供很多的靈活性。如果應用程序將報表參數選擇傳遞到報表,那麼您可能要通過將 rc:Parameters 設置爲 false 來避免提示用戶,甚至可以通過將 rc:Toolbar 設置爲 false 來關閉整個工具欄。有關常用 HTML rc:parameters 的列表的詳細信息,請參見圖 5


如果您的 Web 應用程序使用框架來顯示報表(比如說,在左側窗格中顯示報表列表,在右側窗格中顯示報表內容),您將需要使用 rc:LinkTarget 參數來指定內容框架的名稱。否則,當用戶點擊報表中的任意嵌入鏈接時,瀏覽器就會使用整個窗口來重新顯示報表,而不是保留導航窗格和內容窗格的框架。


您可以使用我介紹過的 URL 參數來添加“快速啓動”區域,該區域包含使用戶可以打開常用報表的超級鏈接的列表(請參見圖 3)。每個超級鏈接將其目標設置爲 _blank 以在獨立的瀏覽器窗口中打開報表,並使用諸如 rs:Format=EXCEL 這樣的參數來控制報表在瀏覽器中的顯示方式。


將報表嵌入到 Web 應用程序中


如果在用戶查看報表時,不再使用彈出新的瀏覽器窗口,您可能希望實際地將報表嵌入到自己的 Web 頁中。最簡單的方法就是在 Web 頁上使用 IFRAME,並使用我介紹過的基於 URL 的相同技術來設置 SRC 屬性。如果您使用這種技術,切記要將 rc:LinkTarget 參數設置爲 IFRAME 的名稱,以避免當用戶單擊報表的鏈接時在框架外彈出任意一個框架。


如果您以前設計過 ASP.NET 的服務器控件,您可能會認爲 IFRAME 技術並不十分完美,因爲它要求 Web 開發人員理解 Reporting Services 的 URL 參數語法才能構建適當的 SRC 字符串。構建一個封裝有所有參數並使開發人員可以簡單地設置諸如 ReportPath 和 Zoom 之類的參數的服務器控件難道不是一個更好的想法嗎?


Reporting Services 非常方便地附帶了名爲 ReportViewer 的示例(安裝到 /Reporting Services/Samples/Applications/ReportViewer 目錄),它可以實現這個想法。該控件封裝了 IFRAME 和 URL 訪問參數邏輯,並提供了一個更簡單的用於將報表嵌入到應用程序中的方法。要使用該控件,請打開並構建 ReportViewer 解決方案,然後通過瀏覽到 ReportViewer 解決方案的 bin 目錄中的 ReportViewer.dll,切換到您的 Web 應用程序並將該控件添加到工具箱中。
您可以使用該控件將嵌入報表添加到儀表板應用程序中。將控件添加到 Web 頁,設置高度和寬度屬性並添加以下代碼以便在頁面中顯示一個報表:

Private Sub Page_Load(ByVal sender As System.Object, ByVal _
                      e As System.EventArgs) Handles MyBase.Load
    If Not IsPostBack Then
        ReportViewer1.ServerUrl = "http://MyServer/ReportServer"
        ReportViewer1.ReportPath = "/SampleReports/Sales Order" & _
            "Detail&SalesOrderNumber=so8153" 
        ReportViewer1.Toolbar = ReportViewer.multiState.False
        ReportViewer1.Zoom = "75"
    End If
End Sub

保證報表的安全


Reporting Services 安全性使用熟悉的基於角色的模型。用戶和組可以分配給諸如 System Administrator 或 Browser 之類的角色,特定角色的所有成員都將允許執行爲該角色定義的操作。


報表管理器用於執行與安全性相關的任務,例如,分配用戶角色或修改項(例如,報表)的權限等。默認情況下,Administrators Windows 組同時是所有文件夾的 System Administrator 和 Content Manager 的成員。爲了擴展報表訪問到其他用戶,用戶帳戶或組必須添加到諸如 Browser 的角色中。這通常是在文件夾級設置的,同時也可以針對單獨的報表進行重寫。


除了保護對報表的訪問外,管理員還必須決定如何將報表連接到源數據庫。可以配置數據源使用集成的安全性,以便可以使用當前的用戶帳戶進行數據庫連接。此外,還可以定義 Windows? 或 SQL Server 用戶名和密碼,並將其安全地存儲在報表服務器數據庫中。這種方法要求報表運行在無用戶交互(例如,訂閱所涉及的交互)的情況下。


使用 Reporting Services Web 服務


到目前爲止,我一直使用的 URL 訪問方法提供了一種快速便捷的方式來查看報表並指定參數,但是它不能提供對所有可用的報表管理功能的訪問。Reporting Services 還附帶了一個具有豐富功能的 API,爲您提供通過 Web 服務對高級功能的訪問。例如,該 Web 服務包括用於管理報表的數據源信息的方法或者枚舉某個文件夾中所有項的方法。


我將使用 Web 服務將報表的動態列表添加到儀表板應用程序中。爲此,您將需要使用 Add Web Reference 將一個 Web 服務引用添加到應用程序中。指定到 Web 服務的路徑,如下所示:

http://MyServer/ReportServer/ReportService.asmx

在添加引用後,您可以創建 ReportingService 代理類的一個實例,並調用該服務上的一個方法,就像我在此處完成的一樣:

Private Sub LoadSampleReports()
    Dim rs As New ReportingService
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials

    Dim item As CatalogItem
    For Each item In rs.ListChildren("/SampleReports", False)
        If item.Type = ItemTypeEnum.Report Then
            DropDownList1.Items.Add(New ListItem(item.Name, item.Path))
        End If
    Next
End Sub

如果您正在一個 Intranet 環境中部署應用程序,您要通過將 添加到應用程序的 web.config 文件中來啓用模擬。您還要將客戶端登錄憑據傳遞到該服務,如前面的示例所示。


ListChildren 方法返回 CatalogItem 對象的數組,該數組表示用戶有權查看的項,包括報表、文件夾和數據源。Path 屬性提供了到項的唯一路徑,例如,/SampleReports/Sales Order Detail,Type 屬性使您可以區別報表和其他類型的項。


既然我已經將報表名稱加載到了下拉列表中,我必須決定如何在儀表板應用程序內顯示報表。我決定擴展我早期編寫的 ReportViewer 代碼並且只要用戶選擇某個報表並點擊“Go”按鈕就更改 ReportPath 屬性。您還可以使用 IFRAME 並將 SRC 設置爲適當的 URL(併爲報表的名稱加上前綴“http://MyServer/ReportServer?”)。


除了報表管理功能外,Web 服務提供的其他主要功能就是報表呈現。大多數應用程序(包括報表管理器應用程序)都使用 Web 服務功能來列出報表或更改設置,並使用我介紹過的 URL 方法來顯示報表。但是,如果您想要完全控制報表內容在應用程序中處理的方式,可以使用 ReportingService 類的 Render 方法。該方法返回一個可以在以後保存到輸出文件的字節數組;取決於請求的格式,輸出文件可以是圖形文件或 Excel 電子表格。如果您要以 HTML 格式呈現報表,可能會更加複雜一些,因爲您將需要使用 RenderStream 方法來分別呈現圖像或其他資源。


儘管本文的討論重點在於 Web 應用程序,您也可以使用相同的技術將報表生成功能添加到基於 Windows 的應用程序中。最簡單的方法仍是使用 URL 訪問,或者從應用程序啓動用戶的瀏覽器,或者包括 Microsoft WebBrowser ActiveX? 控件並使用 Navigate 方法來加載適當的 URL。當您想要更好地控制某些操作(例如,在圖片框中顯示結果或將文件直接保存到磁盤的操作)時,Web 服務的 Render 方法是一個很好的備選方法。


信息工作者通常必須處理兩種類型的報表:當他們需要收集信息時他們想要獲得的類型以及每週都出現在他們桌面上或他們電子郵件中的類型。至此,我已重點闡述了用戶獲取他們自己的報表的過程,但 Reporting Services 還包括一種非常強大的稱爲訂閱的功能,它使您可以將報表“推”給客戶。


訂閱報表


Reporting Services 訂閱功能讓用戶按照計劃接收報表。報表通常會通過電子郵件發送到用戶,但 Reporting Services 同時還讓您將報表生成到一個文件共享甚至可以編寫自己的提交擴展。這使您可以輕鬆地完成分發任務,例如,向每個銷售代表以電子郵件方式發送每週銷售統計報表,或者設置每月財政報表在每個月的最後一天運行,並將其作爲一個 PDF 寫出到公司文件共享。


在設置訂閱前,您需要考慮報表將如何連接到數據庫以檢索其數據。因此,訂閱的報表將不會由用戶直接執行,您無法爲數據源使用集成的安全性,但在報表運行時必須指定要使用的用戶名和密碼。如果您試圖爲使用集成安全性的報表設置訂閱,Reporting Services 將會返回一個錯誤。


要更改示例報表的數據源,請打開“Report Manager | Sample Reports”,然後單擊 AdventureWorks 數據源。該數據源由所有示例報表共享,因此對它所做的任何更改將會影響所有報表。選中“Credentials stored securely in the report server”選項,指定一個具有訪問 AdventureWorks 數據庫權限的帳戶的有效域用戶名和密碼,選中“Use as Windows credentials when connecting to the data source option”,然後單擊“Apply”按鈕。請注意,這種更改意味着指定的帳戶將始終用於連接該數據庫,不管實際上是哪個用戶運行該報表。


因此,您已經準備好深入研究並查看提供對訂閱訪問的 Web 服務 API。使用 Web 服務的這一部分比使用 List 或 Render 方法要多一些挑戰,主要原因在於可用選項的數量。我將要使用的方法是 CreateSubscription,它也屬於 ReportingService 類。有關該方法的參數的詳細說明,請參閱 ReportingService 類,但最基本的是您需要指定要訂閱的報表、生成計劃(例如,每週一早晨或每月的最後一個週五)、電子郵件選項(包括電子郵件地址)以及所有報表參數值。


我已經將名爲 EmailSubscriber 的實用工具類包括在本文的示例代碼中,該示例代碼摘要了某些複雜的內容。儀表板應用程序使用該類允許用戶指定他們的電子郵件地址並使 Employee Sales Summary 報表通過電子郵件每週一發送給他們。在產品應用程序中,您可以調整每個用戶的報表,例如,當您創建訂閱時,可以根據員工的 Windows 用戶帳戶檢索他們的員工 ID,然後適當地設置報表參數。


如果您不希望等到下週一才測試您的訂閱,它有助於您瞭解有關 Reporting Services 如何處理訂閱計劃的更多信息。當您創建一個訂閱時,Reporting Services 會創建一個根據要求的計劃執行的 SQL Server 代理作業。您可以通過打開 Enterprise Manager,展開 Management、SQL Server Agent 和 Jobs 文件夾來查看這個作業。該訂閱作業將具有“Report Server”類別,並以由 Reporting Services 用來跟蹤該作業的 GUID 命名。右鍵單擊該作業並選擇 Start Job,如果您已正確地設置了您報表的方方面面,您的報表將會發送電子郵件給您。


接下來該怎麼做?


您可以用來嚮應用程序中添加重要報表生成功能的兩個其他 Reporting Services 功能包括 Data Driven Subscriptions 和 Snapshots,前者使您可以設置用戶的郵件列表並以電子郵件形式將特定參數化的報表發送給他們,後者是在計劃點的報表視圖,同時還可以提供報錶的歷史視圖。Reporting Services 是使用模塊化的體系結構構建的,如果您需要更強大的功能,它可以使您使用自己喜好的、以 .NET 爲目標的語言來添加功能強大的新擴展。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=338003

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章