之前 OEA 一直用著一個 Delphi 開發的報表,所以兩年來我一直就想在 OEA 中構建一個純 .NET 的報表模組,但是一想到要開發複雜的報表引擎和設計器就覺得麻煩。所以這事一直拖著。最近開始研究一些成熟的報表引擎,經過對比,還是發現微軟的 RLDC 報表已經能滿足我大多數需求。其中包括表格、矩陣、圖表 等複雜控制項,同時同樣的報表格式在 B/S 模式下也可以直接使用,最新的 Tablix 控制項非常靈活,能實現大多數表格樣式。所以我決定不再費時費力去造一個輪子,而是直接把微軟的 RDLC 報表整合進來。最終整合到 OEA 中,只花了不到一周的時間。雖然現在還處在第一版,沒有給客戶使用的設計器。不過就目前的開發效率來看,開發人員開發一個報表,速度已經比較快了。
接下來,我就基於之前已經發布的進銷存樣本項目(JXC),來示範一下,基於 OEA 架構,是如何開發一個報表模組的。
報表開發樣本
第一步,我們需要開發一個一般的列表模組。
這樣,可以在使用報表前把後台資料相關的實體、資料層代碼都開發完成,並檢驗資料是否正確。這一部分的內容與報表無關,我就直接使用 JXC 之前的單據查詢模組中採購入庫單介面:
把這個頁簽的代碼拷貝成一個新的頁簽,
紅線中代碼是直接拷貝上一行並修改了顯示名稱,此時效果如下:
此時,就算已經完成了一個全新的列表查詢結果介面的開發。那麼,我們如何把這個傳統的列表介面轉換為報表顯示介面呢?
第二步,在彙總塊申明中,這個介面塊申明為報表介面塊,代碼如下:
new SurrounderBlock(typeof(OrderStorageInBill), QueryObjectView.ResultSurrounderType){ KeyLabel = "採購入庫單 - 報表", BlockType = BlockType.Report},
然後為 OrderStorageInBill 類對應的這個視圖配置中,申明需要使用的報表名稱(該名稱在系統所有報表名稱中必須是唯一的)。如下:
internal class OrderStorageInBillConfig : EntityConfig<OrderStorageInBill>{ protected override void ConfigView() { View.UseReport("採購入庫單報表統計.rdlc");
再次開啟介面,我們會發現該頁簽對應的介面塊,已經變成了一個報表介面,並同時帶上了報表介面的兩個重要功能:“重新整理 RDLC 欄位”及“報表資料”。
到此,所有的代碼已經完成,接下來的過程也不再需要關閉程式或者重新編譯。
第三步,可以開始設計報表了。
注意到,由於到現在還沒有建立並設計 RDLC 報表檔案,所以中的報表顯示控制項所有按鈕都是停用。點擊“重新整理 RDLC 欄位”按鈕,彈出以下介面:
點擊確定後,架構自動產生相關的 RDLC 檔案到指定目錄(該目錄可在設定檔中進行配置),重新整理報表顯示控制項,並彈出如下提示:
點擊確定,可把該路徑拷貝到剪貼簿中。
注意到,此時報表控制項的按鈕已經可用,說明相應的 RDLC 檔案已經產生:
所以我們需要使用設計器對其進行設計,由於目前還沒有開發單獨的 RDLC 設計器,所以暫時用 VS2012 進行設計。在 VS 中直接開啟該檔案(路徑已經在剪貼簿中了),VS 將啟動對應的報表設計介面:
架構在產生此檔案時,已經自動產生了相關的資料來源節點(本樣本中只有一個簡單的實體資料來源,更多的資料來源可以使用代碼設定),而且這些欄位的名稱已經帶上了介面顯示的中文名稱,方便報表設計。
所以我們接下來只需要對這些資料進行報表設計即可,如何設計 RDLC 報表的內容,網上有較多內容,這是我最後設計出來的報表:
剛才說到在設計過程中是不需要關閉程式的,在對 RDLC 檔案進行任何修改並儲存後,可以點擊報表控制項上的重新整理按鈕,即可直接預覽當前效果。這是最終產生的報表介面:
另外,設計過程中,也可以點擊“報表資料”按鈕查看當前報表背後顯示的列表資料,方便理解後台資料。
在以後的時間裡,我可能還需要想辦法搞一個 RDLC 的設計器方便客戶使用。這也是個麻煩事……
不過整合報表這個心結有兩年時間了,現在總算是大致解決,可以在 OEA 中比較快地開發報表了,可喜可賀!
附:RDLC 資料繫結類型定義圖
補充:沒有安裝 VS2012 的電腦,需要安裝 http://www.microsoft.com/en-us/download/details.aspx?id=27230
ReportViewer 控制項後才能查看報表,直接拷貝 dll 到 Debug 目錄下不行,誰知道原因?