利用 SQL Server Reporting Services 從應用程式產生方便使用的報表 發布日期: 09/03/2004 | 更新日期: 09/03/2004
John C. Hancock
本文討論: |
• |
Reporting |
• |
設計和部署報表 |
• |
使用 Reporting Services 的 Web 服務 |
• |
保證報表的安全 |
|
本文使用下列技術: SQL Server、ASP.NET、Visual Basic .NET 代碼下載: SQLServerReportingServices.exe(222KB) |
本頁內容
|
Reporting Services 概述 |
|
設計第一個報表 |
|
部署和測試 |
|
將報表添加到 Web 應用程式 |
|
將報表嵌入到 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 網站或應用程式中。
圖 1 Reporting Services 體繫結構
可以將報表參數化,這樣使用者可以在查看報表時從挑選清單中進行挑選;它們還可以匯出為多種格式,例如,MicrosoftExcel、PDF 和 XML。儘管即時報表提供最新的資料,也可以將報表緩衝一段時間以提高效能並減少資料來源上的負載。對於商務智能應用程式,報表可以訪問 Analysis Services OLAP Cube,而且 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 選項卡。
圖 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 檔案夾來測試樣本報表。
圖 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 IfEnd 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 NextEnd 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 Agent作業。您可以通過開啟 Enterprise Manager,展開 Management、SQL Server Agent 和 Jobs 檔案夾來查看這個作業。該訂閱作業將具有“Report Server”類別,並以由 Reporting Services 用來跟蹤該作業的 GUID 命名。按右鍵該作業並選擇 Start Job,如果您已正確地設定了您報表的方方面面,您的報表將會寄送電子郵件給您。
返回頁首
接下來該怎麼做?
您可以用來嚮應用程式中添加重要報表產生功能的兩個其他 Reporting Services 功能包括 Data Driven Subscriptions 和 Snapshots,前者使您可以設定使用者的郵件清單並以電子郵件形式將特定參數化的報表發送給他們,後者是在計劃點的報表視圖,同時還可以提供報錶的歷史視圖。Reporting Services 是使用模組化的體繫結構構建的,如果您需要更強大的功能,它可以使您使用自己喜好的、以 .NET 為目標的語言來添加功能強大的新擴充。
John C. Hancock 是 Microsoft 的進階顧問,致力於商務智能和 .NET 開發。他現在定居在多倫多,要聯絡他,請訪問 http://www.johnchancock.net。
摘自 2004 年 8 月刊的 MSDN Magazine。
您可以在本地報刊亭購買或者最好 訂閱。
Figure 4 Report Server rs: Parameters
Parameter |
Description |
Values |
rs:Command |
The action to apply to the path, such as render a report or list all of the items in a folder. Defaults to Render for reports. |
Render, ListChildren, GetResourceContents, GetDataSourceContents |
rs:Format |
The format in which to render the report, such as HTML4.0 or PDF. Defaults to the appropriate HTML supported by the browser. |
HTML3.2, HTML4.0, HTMLOWC, MHTML, IMAGE, EXCEL, CSV, PDF, XML (can also include custom rendering extensions if available) |
rs:Snapshot |
Renders a report snapshot, which uses report data captured at a specific point in time and stored in the reporting server database. |
Timestamp of snapshot梖or example, 2004-03-30T15:45:02 |
rs:SessionID |
Identifies an established active session between the browser and the report server. This is used when the report server has been configured to not use session cookies. |
Existing session id |
rs:ClearSession |
Forces the client browser to clear its cached copy of the report and retrieve a new copy. |
True |
Figure 5 Commonly Used rc: Parameters for HTML Format
Parameter |
Description |
Values |
rc:Toolbar |
Shows or hides the toolbar, including the parameters area. Defaults to true. |
true, false |
rc:Parameters |
Shows or hides the parameters area of the toolbar. Defaults to true. |
true, false |
rc:Zoom |
Zoom factor to zoom in or out on a report. Defaults to 100. (Note that this setting only works with Internet Explorer 5.0 and above) |
Page width, whole page, or an integer percentage such as 75. |
rc:Section |
The page number to render. The default value is 1. |
Integer |
rc:LinkTarget |
The target name for hyperlinks in the report. |
The name of a window or another valid target name such as _blank, _self, _parent, or _top. |