2009年11月6日 星期五

.NET Client-Side Report

相信很多人都不知道什麼是Client-Side Report,不過卻有很多人已經在用它了,在微軟的.NET 2.0之後,出現了一個叫做ReportViewer的元件,如下圖



不管你是使用網站開發ASP.NET程式,還是使用Windows Applicatioion專案,在左邊的工具箱都可以找到這個元件的圖示。
或許有些人寫過Reporting Services的也有機會用到這個元件,因為這個元件不單單可以顯示Client-Side Report,也可以遠端連結到已經撰寫好放在Reporting Services中的Report(這種模式稱作:Remote Report),不過這篇文章會把重點擺放在Client-Side Report。
為使大家了解何謂Client-Side Report,請先參考底下的架構圖



開發者使用Visual Studio的IDE來開發報表定義檔,其中會定義該報表中的所有元件,但在RDLC中,並不會定義資料來源(這與Reporting Services中的RDL不同),在RDLC中只會定義報表資料格式(後續的章節會再在介紹),而資料來源則需要於Client端的應用程式,於Run Time的時候再匯入,使用者所看到的結果,其實是由報表定義檔+資料所呈現的結果。

其實RDLC的Report非常好開發,可攜性也非常高,如架構圖所示,它只需要.NETFramework Run Time即可以驅動,不像Reporting Services的Report,需先啟動Reporting Service才可,所以如果只是要純開發報表的話,不需要Reporting Service的額外功能,例如:排程、寄送Email、Cache Reports等等功能的話,使用RDLC開發報表是一項不錯的選擇,而開發RDLC需要確三個步驟
  1. 程式撰寫建立資料來源連結
  2. 設計報表版面
  3. 將資料匯入報表
底下針對三個步驟一一介紹
1.程式撰寫建立資料來源連結
使用RDLC定義的資料需使用Strongly Type DataTable才可以,所以我們先於專案中新增一個Strongly Typed DataTable(這裡不再對ADO.NET相關技術再做介紹,有興趣可以參考 Building a DAL using Strongly Typed TableAdapters and DataTables in VS 2005 and ASP.NET 2.0 )


成功加入後,VS會出現之畫面如下圖


接下來我們建立一個TableAdapter(使用此技巧新增TableAdapter會順便建立Strong Typed DataTable),如下圖


選擇TableAdapter(T)...,選擇資料來源,這裡我們使用微軟的範例資料庫北風Northwnd

選擇【使用SQL陳述式(S)】

 填入如下所示之SQL程式碼,點選【下一步】

 使用預設設定即可,點選【完成】

完成上述步驟之後,出現如下圖所示之Strongly Type DataTable Employees


2.設計報表版面 
接下來我們新增一個ReportViewer元件,所以使用Visual studio新增一個aspx頁面(這裡使用Web Application方式),然後拉入ReportViewer元件,如下圖所示

此時的原始檔如下

可看到,ReportViewer定義標籤(注意:有時候可能需要觀看定義的標籤,來確定使用UI設定是否有問題),然後再新增一個RDLC報表

出現畫面如下,此為報表設計畫面


由於我們先前已經建立的Strongly Typed DataTable,所以在左邊的【報表資料來源】會出現我們剛剛所建立的Employees的DataTable,請先切換左邊的視窗到工具箱如下圖

此時拖曳【資料表】元件到設計畫面中

接下來,把左邊的視窗切換到【報表資料來源】,並拖曳欄位Title、FirstName、LastName、BirthDate到【資料表】元件的【詳細資料】欄位中,如下

此時我們已經設計好報表版面,將畫面切換到aspx(Default.aspx)設計畫面中,然後於ReportViewer元件中,設定報表為Report1.rdlc(此為我們剛剛所設計之報表版面)


3. 將資料匯入報表
將報表版面設定完畢之後,最後便是撰寫程式將資料匯入報表,我們進入Default.aspx的後置程式碼部分Default.aspx.cs,撰寫程式如下

注意,我們需要先引用Microsoft.Reporting.WebForms 命名空間,程式13~16行會呼叫我們剛剛所定義的SQL程式碼,並把資料匯入Strongly Typed DataTable 變數為 EmployeeDT中,程式19行定義報表來源物件,20行定義該來源名稱(注意:此名稱在剛剛設計報表版面的時候,Visual Studio便已自動產生,且會有一定的命名規則,如不確定,可進入RDLC的報表定義檔中,使用可觀看XMl的編輯器,確定該名稱為何)

程式 21行設定該資料來源的資料,22行將資料來源物件加入ReportViewer的DataSources中,最後我們觀看該頁面結果

設樣便簡單的完成我們第一個Client-Side Report。

1 則留言:

Unknown 提到...

你好, 非常感謝您的這篇教學文章
讓我釐清一些觀念
知道可以不用透過 reporting services產生報表
也解決了 "尚未提供資料來源 'DataSet1' 的資料來源執行個體。" 這個問題

但最後還是無法成功
在網頁上瀏覽時 report viewer 會一直出現正在載入的訊息
遲遲無法出現報表

如圖
http://www.flickr.com/photos/84780185@N04/7763219794/in/photostream

不知道您有沒有遇過這樣的問題呢??