之前 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 目錄下不行,誰知道原因?