在使用VB自帶的報表過程中,我遇到了處理動態分組報表的問題。一般要使用分組報表要在VB中建立一個DataEnvironment,并在其中建立數據庫聯接和命令對象,在命令對象中設置分組字段,最后將這些分組字段加入到報表中。但是這種方法只能適應靜態的數據源,當遇到數據表中的字段不固定,或數據表不能預先知道的情況時,這種方法就無能為力了。經過查閱各種資料,發現我們可以通過使用Data Shaping來動態創建分組信息。下面就詳細介紹一下如何動態創建分組信息,并應用于VB報表。
要使用Data Shaping,程序必須使用ActiveX Data Object (ADO)連接數據庫,解決問題的關鍵是使用Data Shaping的驅動程序代替通常使用的各種OLE DB的驅動程序,它的用法跟使用其它驅動程序類似,對于已有的數據訪問代碼不用作任何修改,只是簡單的修改一下連接代碼就可以支持Data Shaping了。具體做法如下:
將連接參數中的
Provider設置成"MSDataShape" 即
ConnectionString = "Provider=MSDataShape;Data Provider=通常的驅動程序;Data Source=…;其它的參數"
然后就可以和平常一樣進行數據連接和各種數據操作了。如此連接的數據源出了具有用普通方法的所有特性以外,同時具有了我們即將使用的Data Shaping功能,下面就可以建立自己的分組信息了:
將用于打開記錄集的SQL語句寫成如下形式:
SHAPE {select 字段1, 字段2, 字段3,…, 字段n from 現有的表} AS 新的名稱1
COMPUTE新的名稱1 AS新的名稱2 BY 分組字段1, 分組字段2,…, 分組字段n
上面的語句中,需要注意的是分組字段必須同時在Select 中出現,否則運行時將報錯。用該SQL語句打開的記錄集中包含若干個字段,它們是:新的名稱2、分組字段1-n。在使用時,將打開的記錄集rs作為報表的DataSource,在報表的分組部分可以直接且只能使用分組字段1-n以及各種統計函數,在正文中使用字段1-n時,應將對應編輯框的DataMenber設置為”新的名稱
MyReport.Sections("GroupHeader").Controls("Text1").DataField =”分組字段
MyReport.Sections("GroupFooter").Controls("Function1").DataMember = "新的名稱2"
MyReport.Sections("GroupFooter").Controls("Function1").DataField = "字段1"
MyReport.Sections("PageContent").Controls("Text2").DataMember = "新的名稱2"
MyReport.Sections("PageContent").Controls("Text2").DataField =”字段
按照以上的方法就可以對帶有分組的報表進行動態數據綁定了,這對于那些操作臨時表的情況十分有用,因為臨時表是無法用設計器設計分組的。
關于Data Shaping的詳細介紹可以去參考MSDN在線資源,在一般情況下我們可以用設計器去設計一個類似的結構,然后查看VB設計器生成的代碼,這樣就可以套用我們自己表了。
原文轉自:http://www.anti-gravitydesign.com