Microsoft數據報表設計器

Microsoft數據報表設計器(Microsoft Data Report designer)是一個多功能的報表生成器,以創建聯合分層結構報表的能力為特色。同數據源(如數據環境設計器(Data Environment designer))一起使用,可以從幾個不同的相關表創建報表。除創建可列印報表之外,也可以將報表導出到 HTML 或文本檔案中。

可能的用法

為在 Internet 立即發行而自動地以 HTML 格式創建導出的報表。

創建報表,顯示一天內所發生交易的合計。

特性

數據報表設計器有如下幾個特性:

1. 對欄位的拖放功能—把欄位從 Microsoft 數據環境設計器拖到數據報表設計器。當進行這一操作時,Visual Basic 自動地在數據報表上創建一個文本框控制項,並設定被放下欄位的DataMember和DataField屬性。也可以把一個Command對象從數據環境設計器拖到數據報表設計器。在這種情況下,對於每一個Command對象包含的欄位,將在數據報表上創建一個文本框控制項;每一文本框的DataMember和DataField屬性將被設定為合適的值。

2. Toolbox控制項—數據報表設計器以它自己的一套控制項為特色。當數據報表設計器被添加到工程時,控制項被自動創建在一個名為DataReport的新“工具箱”選項卡上。多數的控制項在功能上與 Visual Basic 內部控制項相同,並且包括Label、Shape、Image、TextBox和Line控制項。第六個控制項,即Function 控制項,自動地生成如下四種信息中的一種:Sum、Average、Minimum或Maximum。有關控制項的更詳細的信息,請參閱“添加一個 Function 控制項到 Data Report”。

3. 列印預覽—通過使用 Show 方法預覽報表。然後生成數據報表並顯示在它自己的視窗內。

注意 要在列印預覽方式中顯示報表,必須在計算機上安裝一台印表機。

4. 列印報表—通過調用 PrintReport 方法,以編程方式列印一個報表。當數據報表處於預覽方式,用戶也可以通過單擊工具列上的印表機圖示列印報表。

注意 要列印報表,必須在計算機上安裝一台印表機。

5. 檔案導出—使用 ExportReport 方法導出數據報表信息。導出格式包括 HTML 和文本。

6. 導出模板—可以創建一個檔案模板集合,以同 ExportReport 方法一起使用。這對於以多種格式(每種都報表類型剪裁)導出報表是很有用的。

7. 異步操作—DataReport 對象的 PrintReport 和 ExportReport 方法是異步操作。使用 ProcessingTimeort 事件可以監視這些操作的狀態,並取消任何花費時間過長的操作。

主題

數據報表部分

數據報表設計器由如下對象組成: 1. DataReport 對象—與 Visual Basic 窗體類似,DataReport 對象同時具有一個可視的設計器和一個代碼模組。可以使用設計器創建報表的布局。也可以向設計器的代碼模組添加代碼,以採用編程方式調整設計器中包含的控制項或部分的格式。

2. Section 對象—數據報表設計器的每一個部分由 Sections 集合中的一個 Section 對象表示。設計時,每一部分由一個可以單擊以選擇頁的標頭和可以放置和定位控制項的窗格表示。可以使用對象及其屬性在報表生成之前對其進行動態重新配置。

3. Data Report 控制項—僅包含可在數據報表設計器上工作的特殊控制項。(注意:不能在數據報表設計器上使用 Visual Basic 的內部控制項或任何 ActiveX 控制項)。這些控制項可以在Visual Basic Toolbox中找到,但是它們被放置在一個獨立的名為“數據報表”的選項卡上。

數據報表設計器的部分

預設的數據報表設計器包含如下這些部分: 報表標頭—包含顯示在一個報表開始處的文本,例如報表標題、作者或資料庫名。如果想把報表標頭作為報表的第一頁,設定它的 ForcePageBreak 屬性為 rptPageBreakAfter。

頁標頭—包含在每一頁頂部出現的信息,例如報表的標題。

分組標頭/註腳—包含數據報表的一個“重複”部分。每一個分組標頭與一個分組註腳相匹配。標頭和註腳對與數據環境設計器中的一個單獨的 Command 對象相關聯。

細節—包含報表的最內部的“重複”部分(記錄)。詳細部分與數據環境層次結構中最低層的 Command 對象相關聯。

頁註腳—包含在每一頁底部出現的信息,例如頁數。

報表註腳—包含報表結束處出現的文本,例如摘要信息或一個地址或聯繫人姓名。報表註腳出現在最後一個頁標頭和頁註腳之間。

數據報表控制項

當一個新的數據報表設計器被添加到一個工程時,下列控制項將自動地被放置在名為DataReport的“工具箱”選項卡中: TextBox 控制項(RptTextBox)—允許規定文本格式,或指定一個 DataFormat。

Label 控制項(RptLabel)—允許在報表上放置標籤、標識欄位或部分。

Image 控制項(RptImage)—使用戶能在報表上放置圖形。注意,該控制項不能被綁定到數據欄位。

Line 控制項(RptLine)—使用戶能在報表上繪製標尺,以進一步區分部分。

Shape 控制項(RptShape)—使用戶能在報表上放置矩形、三角形或圓形(橢圓型)。

Function 控制項(RptFunction)—一個特殊的文本框,報表生成時計算數值。

創建一個簡單數據報表

創建了一個簡單數據報表,該報表使用數據環境設計器作為數據源。數據環境設計器使用和 Visual Basic一起提供的 NorthWind 資料庫創建一個簡單的層次結構游標。該游標包含兩個表,Customers 和 Orders,並使用“CustomerID”欄位連結兩個表。完成的報表類似於下面的插圖。

簡單數據報表:客戶的訂單日期

Microsoft數據報表設計器 Microsoft數據報表設計器

在開始逐步處理之前,確保計算機上存在 Northwind 資料庫(Nwind.mdb)。如果不存在,從 Visual Basic CD 複製一份檔案到計算機的硬碟上。

要在數據環境設計器中創建一個簡單的層次結構游標,請按照下列步驟執行: 1、創建一個新的“ 標準 EXE”工程。

2、在“工程”選單上,單擊“ 添加 Data Enviroment”向工程中添加一個設計器。如果設計器沒有在“ 工程”選單上列出,則單擊“ 部件”。單擊“ 設計器”選項卡。並單擊“ 數據環境”把設計器添加到選單上。

注意 最初為項目載入的四種ActiveX設計器在“ 工程”選單上列出。如果載入了超過四個設計器,後面的設計器可以從“ 工程”選單的“ 更多 ActiveX 設計器”子選單中獲得。

3、在“ 數據連結屬性”對話框上單擊“ Microsoft Jet 4.0 OLE DB Provider”,這是為訪問 Jet 資料庫選擇正確的 OLE DB 供應商。

4、單擊“ 下一步”按鈕進入“連線”選項卡。

5、單擊第一個文本框旁邊的省略按鈕(…)。

6、用“ 選擇 Access 資料庫”對話框瀏覽到 nwind.mdb 檔案,它被安裝在 Program Files\Microsoft Visual Studio\Vb98 目錄下。

7、單擊“ 確定”關閉對話框。

8、右鍵單擊“ Connection1”圖示,單擊“ 重命名”,把圖示名改為“ Northwind”。

9、右鍵單擊“ Northwind”圖示,然後單擊“ 添加命令”顯示“ Command1”對話框。在對話框中,如下所示設定屬性:

屬性 設定值
Command Name Customers
Connection Northwind
DataBase Object Table
Object Name Customers

10、單擊“ 確定”結束對話框。

11、右鍵單擊“ Customers”命令,並單擊“ 添加子命令”顯示“ Command2”對話框。在對話框中,如下所示設定屬性:

屬性 設定值
Command Name Orders
Connection Northwind
DataBase Object Table
Object Name Orders

12、單擊“ 關聯”選項卡。應該選中“ 與父命令對象相關聯”複選框。“ ”框應該包含“ Customers”;“父欄位”和“子欄位/參數”框都應該包含“ CustomerID”。

在設計關係資料庫時,對於連結欄位,習慣上相關的表要使用相同的名字。在這種情況下,連結欄位都被命名為 CustomerID。數據環境設計器自動地在對話框中匹配這樣的對。

13、單擊“ 添加”。單擊“ 確定”關閉對話框。

單擊“添加”按鈕向 Command 對象添加關係。在關閉了對話框之後,數據環境設計器通過把兩個命令顯示為一個層次結構來反映關係。該層次結構將被用於創建數據報表。

14、根據下面的設定值設定工程和設計器的屬性,然後保存工程:

對象 屬性 設定值
Project Name PrjNwind
DataEnvironment Name DeNwind
Form Name FrmShowReport

創建數據報表

一旦創建了數據環境設計器,就可以創建一個數據報表。因為並不是數據環境中所有的欄位在一個數據報表中都有用,這一系列的主題創建一個受限制的報表,只顯示幾個欄位。

要創建一個新的數據報表,請按照下列步驟執行: 1、在“工程”選單上,單擊“添加 Data Report”,Visual Basic 將把它添加到您的工程中。如果設計器不在“工程”選單上,單擊“部件”。單擊“設計器”選項卡,並單擊“Data Report”把設計器添加到選單上。

注意 為工程載入的前四種 ActiveX 設計器在“工程”選單上列出。如果載入了多於四個設計器,後面的設計器可以從“工程”選單的“更多 ActiveX 設計器”子選單中獲得。

2、根據下面的表設定 DataReport 對象的屬性:

屬性設定值

NamerptNwind

CaptionNorthwind Data Report

3、在“屬性”視窗上,單擊“數據源”,然後單擊“deNwind”。然後單擊“DataMember”並單擊“Customers”。

重點 要把 DataSource 屬性設定為 deNwind,數據環境設計器必須為打開的。如果數據環境設計器是關閉的,按下 CTRL+R 鍵顯示“工程”視窗,然後雙擊數據環境圖示。

4、右鍵單擊數據報表設計器,並單擊“檢索結構”。

您已經向設計器添加了一個新的分組。每一個分組都同數據環境中的 Command 對象有“一對一”對應關係;在這種情況下,新的分組與客戶的 Command 對象相對應。同時也要注意分組標頭有一個與之匹配的分組註腳部分。

注意 如果某個 Command 對象有多於一個的子對象 — 相互“平行”的子 Command 對象,則 Data Environment 使您可以創建該 Command 對象的層次結構。Data Report 設計器,卻沒有那么靈活,在同一時間不能顯示多於一個的子對象。此時,當執行一個 Retrieve Structure Command命令時,Data Report 將只顯示第一個子 command,其他的都不顯示。所以,您應該避免創建帶有“平行”子 command的 Command 層次結構。

5、從數據環境設計器,把“CompanyName”欄位(在“Customers”命令下)拖到分組標頭(Customers_Header)部分。

分組標頭部分可以包含 Customers 命令的任何欄位,然而,出於演示目的,此時只顯示 Customer 名。

6、刪除名為“Label1”的 Label 控制項(rptLabel)。

如果不希望 Label 控制項包括在 TextBox 控制項中,可以在數據環境設計器的“選項...”對話框的“欄位映射”選項卡上撤消對“Drag and Drop Fields Caption”選項的選擇。

7、從數據環境設計器中,把“OrderDate”欄位(在Orders命令下)拖到細節(Orders_Detail)部分。刪除Label控制項。

細節部分表示最內層的“重複”部分,因而與數據環境層次結構(OrdersCommand對象)中最底層的 Command 對象相對應。

8、重新調整數據環境設計器部分的大小,使之與下面的插圖類似:

Microsoft數據報表設計器 Microsoft數據報表設計器

9、重新調整細節部分的高度,使它儘可能的矮是很重要的,因為高度將會與為每一個 CompanyName 返回的 OrderDate 相乘。OrderDate 文本框下面或上面的任何多餘位置將在最後的報表中導致不必要的空間。

10、保存工程。

使用 Show 方法預覽數據報表

既然數據環境和 Data Report 對象已經創建,就幾乎準備好運行工程了。還剩下一步:寫代碼以顯示數據報表。

要在運行時顯示數據報表,請按照下列步驟執行:

1、在“工程資源管理器”視窗上,雙擊“frmShowReport”圖示,顯示窗體設計器。

2、在“工具箱”上,單擊“通用”選項卡。

當把一個數據報表設計器添加到工程時,數據報表設計器的控制項被添加到名為“Data Report”的選項卡上。要使用標準的 Visual Basic 控制項,必須切換到“通用”選項卡。

3、單擊“CommandButton”圖示並在窗體上繪製一個“CommandButton”。

4、根據下面的表設定 Command1 控制項的屬性:

屬性 設定值

Name CmdShow

Caption Show Report

5、在按鈕的 Click 事件中,貼上下面的代碼。

Private Sub cmdShow_Click()

rptNwind.Show

End Sub

6、保存並運行工程。

7、單擊“顯示報表”,在列印預覽方式中顯示報表。

可選的—將數據報表作為啟動對象設定

在沒有代碼的情況下,也可以顯示報表。

1、在“工程”選單上,單擊“prjNwind”屬性。

2、在“啟動對象”框中,選擇“rptNwind”。

3、保存並運行工程。 注意 如果使用這種方法,可以從工程中把Form對象刪除。

導出一個數據報表

在編譯了一個報表之後,您或許希望重新使用它,要么作為一個大文檔的一部分,要么在 intranet 或 Internet 上發行。數據報表設計器的 ExportReport 方法使您能夠完成這些任務。使用 ExportReport 方法,可以將任何報表作為文本檔案或 HTML 檔案導出。此外,也可以使用任意的 ExportFormat 對象剪裁已導出的檔案的內容或外觀。

重點 ExportReport 方法不支持圖像或圖形形狀導出。

ExportFormat 對象

ExportReport 方法被設計為與 ExportFormat 集合一同使用。集合中的每個 ExportFormat 對象表示一個單獨的報表格式。例如,一個 intranet 發行格式的報表可能包含工作組或雇員的名字作為報表標頭的一部分;為 Internet 發行的報表,則那些名字將被清除或替換。因此要創建至少兩個 ExportFormat 對象,每一個要適應於不同的發行機制。然而,也可能不創建任何 ExportFormat對象就導出一個報表,因為已經為您提供了四個。

四個預設 ExportFormat 對象 預設情況下,ExportFormat 集合包含四個成員。下表列出了四個成員以及與其相關聯的檔案過濾器:

對象 檔案過濾器 描述
ExportFormats(1) *.htm, *.html HTML
ExportFormats(2) *.htm, *.html Unicode HTML
ExportFormats(3) *.txt Text
ExportFormats(4) *.txt Unicode Text

如果需要使用任何預設類型,也可以使用Key屬性指定預設的類型。Key屬性值和常數如下所示:

對象 關鍵字 常數
ExportFormats(1) key_def_HTML rptKeyHTML
ExportFormats(2) key_def_UnicodeHTML_UTF8 rptKeyUnicodeHTML_UTF8
ExportFormats(3) key_def_Text rptKeyText
ExportFormats(4) key_def_UnicodeText rptKeyUnicodeText

假定預設的成員符合您需要,通過使用四個成員之一,可以不創建另一個ExportFormat對象就導出一個報表。例如,要導出一個按日的HTML報表,可以使用下面的代碼:

DataReport1.ExportReport rptKeyHTML

顯示一個對話框是可選的

編程人員可以決定在導出一個報表時是否顯示一個對話框。例如,如果報表在每天早晨自動創建,並寫入同一個檔案以便在 intranet 上發行,就沒有必要顯示對話框。只要提供一個有效的檔案路徑和關鍵字,並將 Overwrite 參數設定為 True,則不顯示對話框。

' 作為HTML導出一個報表,覆蓋任何已經存在的檔案。 導出 ' 所有頁面到Daily_Report.htm檔案。 DataReport1.ExportReport rptKeyHTML, "C:\Temp\Daily_Report", True, , _ rptRangeAllPages 注意 在上面的代碼中,第二個參數看起來象個目錄,但實際上是一個檔案名稱。“Daily_Report.htm”是被寫的檔案名稱。ExportFormat 對象提供檔案擴展名(.htm),因此沒有必要把它寫在檔案名稱參數中。 ExportFormat 提供對話信息

ExportFormat 對象也包含用戶調用 ExportReport 方法時顯示的信息。特別的,FileFormatString 屬性設定在“導出”對話框的“Save As Type”框中顯示的文本。例如,構想一個公司有一個標準的 ExportFormat 對象要用於所有報表。下面的代碼將確保 ExportFormat 可以在“導出”對話框的格式類型列表中得到:

Dim strTemplate As String

' 首先為ExportFormat對象創建一個模板。

strTemplate = "MyCompany Daily Report" & vbCrLf & rptTagBody

' 添加一個ExportFormat對象。FileFormatString決定

Microsoft數據報表設計器 Microsoft數據報表設計器

' 將在“導出”對話框中顯示什麼內容。DataReport1.ExportFormats.Add _

Key:="StandardReport", _

FormatType:=rptFmtText, _

FileFormatString:="Standard Report (*.txt)", _

FileFilter:="*.txt", _

Template:=strTemplate

' 調用ExportReport方法指定要使用的

' 名為StandardReport的ExportFormat。

DataReport1.ExportReport "StandardReport", , False, True, _ rptRangeFromTo, 1, 10

被調用時,“導出”對話框類似這樣:

模板代碼

ExportFormat 對象的核心是它的模板。

一個模板只是一個字元串,

其中包括您想要顯示的文本以及表示數據報表多個部分的常數。

常數、值和描述如下表所示:

常數 描述
rptTagTitle <!--MSDBRPT_Template_Title--> 表示報表的標題,可在Title屬性中找到。
rptTagBody <!--MSDBRPT_Template_Body--> 表示報表體。

要創建一個只包括作者名,然後是報表體的簡單數據報表,其模板類似這樣:

Dim strT As String strT = "Author: " & InputBox("Your name") & vbCrLf & rptTagBody drpNwind.ExportFormats.Add "AuExp", rptFmtText, _ "Author Only Text File", "*.txt", strT

列印一個數據報表

列印一個數據報表可以使用下面兩種方法之一。用戶可以單擊“列印預覽”中數據報表上的“列印”按鈕(使用 Show 方法),也可以通過使用 PrintReport 方法編程列印。如果列印過程中發生錯誤,將在 Error 事件中捕獲。

選擇顯示一個“列印”對話框

當編程列印一個報表時,有兩種選擇:通過顯示“列印”對話框列印,或不顯示對話框列印。

要顯示“列印”對話框,請按照下列步驟執行: 將一個 CommandButton 添加到窗體。

在按鈕的 Click 事件中,放置下面的代碼: DataReport1.PrintReport True“列印”對話框允許用戶選擇一個印表機、列印到檔案、選擇要列印的頁面範圍並指定要列印的份數。

注意 要顯示印表機選擇,印表機必須安裝在計算機上。

不顯示對話框列印

在有些情況下,您可能希望不需用戶干預列印報表。PrintReport 方法也提供這樣的選擇:選擇要列印的頁面範圍,可以是全部,也可以是一個指定的範圍。

要不顯示對話框地列印,請按照下列步驟執行: 將一個 CommandButton 添加到窗體

在按鈕的 Click 事件中,放置下面的代碼: DataReport1.PrintReport False或者,要指定列印的頁面範圍,請使用下面的代碼:

DataReport1.PrintReport False, rptRangeFromTo, 1, 2

數據報表事件

象標準的 Visual Basic 窗體一樣,數據報表設計器的存在是由某些關鍵事件標記的。那些事件以及它們發生的順序,如下表所示:

事件 描述
Initialize 查詢完成之後發生,並且控制項位於窗體上。
Resize 第一次顯示設計器或一個對象的視窗狀態更改時發生。
Activate 當設計器變為活動視窗時發生。
ProcessingTimeout 大約每秒鐘發生一次,直到所有處理都已經結束。使用該事件可以決定處理是否占用太長時間,並取消處理。 注意 在查詢完成之前該事件將不發生。請參閱下面的內容。
[Deactivate] 當設計器不再是活動視窗時發生。使用該事件決定用戶是否單擊了另一個窗體或設計器。
QueryClose 在設計器終止之前發生。設定 Cancel 參數為 True 以取消終止。CloseMode 參數返回引起終止的動作類型。
Terminate 當所有對設計器的引用都被設定為0時發生。

逾時和異步調用事件

除設計器的存活期事件之外,DataReport 對象也以允許捕獲錯誤和監視同步或異步函式調用的事件為特色。 ExportReport和PrintReport:查詢、同步和異步處理

當調用 ExportReport 或 PrintReport 方法時,處理被分為三個階段——查詢、同步處理和異步列印或導出: 查詢——當第一次創建數據報表時,傳送給數據提供方一個查詢。

處理——查詢檢索到的數據由 Visual Basic 處理以創建報表。數據被高速快取在計算機上的一個臨時檔案中。這一處理是同步的。

異步列印或導出——在創建報表後,報表就被導出或列印。這一處理是異步的。 當Show方法被調用時,數據報表執行查詢,然後在顯示報表之前在同步處理過程中處理數據。

因為這些方法結合了同步和異步處理,有各自的事件監視每種處理。

ProcessTimeOut 事件——對於同步函式

處理一個大的數據報表也許要花費一些時間。如果想要允許您的用戶取消過程較長的操作(如 Show、ExportReport 或 PrintReport),可以使用 ProcessingTimeout 事件監視已經過去了多少秒,並按照用戶的命令把 cancel 參數設定為True。下面的代碼顯示了一個示例:

Private Sub DataReport_ProcessingTimeout(ByVal Seconds As Long, _Cancel As Boolean, ByVal JobType As MSDataReportLib.AsyncTypeConstants, _ByVal Cookie As Long) Select Case Seconds Case 30 If MsgBox("This has taken " & Seconds & "seconds. Cancel?", _ vbRetryCancel) = vbCancel Then Cancel = True End If Case 45 If MsgBox("This has taken " & Seconds & "seconds. Cancel?", _ vbRetryCancel) = vbCancel Then Cancel = True End If Case 60 '60秒鐘後自動取消。 Cancel = True End SelectEnd Sub 注意 並不保證在上面指定的間隔會發生 ProcessingTimeout 事件。例如,在後台運行的其他的 Visual Basic 代碼可能會阻止這一事件的發生。在那種情況下,將 Case 語句設定為一個範圍內的值;當該事件發生時,將一個模組級標誌設定為 True,並在隨後發生的事件中檢查它。

Error 事件——對於異步函式

要捕獲在沒有 Visual Basic 代碼執行(也就是說,一個異步函式)時發生的錯誤,請使用 Error 事件。例如,如果 PrintReport 或 ExportReport 方法在異步階段失敗,Error 事件將發生。下面的示例捕獲異步錯誤:

Private Sub DataReport_Error(ByVal JobType As _MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long, _ByVal ErrObj As MSDataReportLib.RptError, ShowError As Boolean) Select Case JobType ' The JobType identifies the process. Case rptAsyncPrint ' 此處捕獲 PrintReport 錯誤。 Case rptAsyncReport ' 此處捕獲 ExportReport 錯誤。 End SelectEnd Sub也可以使用 Error 事件捕獲特定的情況,例如計算機上缺少印表機,如下面的代碼中所示:

Private Sub DataReport_Error(ByVal JobType As _MSDataReportLib.AsyncTypeConstants, ByVal Cookie As Long, _ByVal ErrObj As MSDataReportLib.RptError, ShowError As Boolean) Case rptErrPrinterInfo ' 8555 MsgBox "A printing error has occurred. " & _ "You may not have a Printer installed." ShowError = False Exit Sub Case Else ' 此處處理其他情況。 ShowError = True End SelectEnd Sub AsyncProgress 事件

不是為捕獲錯誤而設計的,但允許監視異步函式的狀態。到這一事件發生時,所有的數據都已經被處理過;這樣,事件的兩個參數是 PagesCompleted 和 TotalPages。該事件還包括標識異步操作的參數:則 JobType 和 Cookie 參數可以被用於監視任何處理的過程。

相關詞條

相關搜尋

熱門詞條

聯絡我們