報表伺服器淺學

yangchun1213發表於2011-08-05

<a href='http://yan.sunny86.blog.163.com/blog/static/421871372007112111284452/'></a>

內容:


目錄

關於這篇文件 
其他資訊來源 
產品版本 
簡介 
製作工具和RDL

報表設計概念 
資料區域 
報表項的位置和尺寸 
分頁 
子報表 
表示式和函式 
聚合函式和範圍 

報表渲染時的考慮 
Excel 
影象 
便攜文件格式 
HTML 

實用的報表設計技巧 
使用矩形保持物件的緊湊 
避免空白頁 
使用分頁提高大報表的效能 
使用篩選器代替查詢引數 
在表格中新增輪換條 
在一個報表中的表格中在指定行後新增分頁符 
在頁首和頁尾中新增全域性變數值 
在頁首中顯示報表項 
建立帶有條件格式的鑽取連線 

結論 

關於這篇文件

從使用資料控制元件,到使用什麼格式,到如何分發報表,報表製作者面對著很多種選擇。Microsoft® SQL Server™ 報表服務提供了豐富的報表設計和格式的支援,從基於紙介質表格報表到帶有圖片和鑽取功能的互動式報表

這篇文件包括了報表製作和設計中的指導、建議和技巧。本文件的目的在於解釋一般性的問題並對初學者提供指導建議。報表服務聯機叢書提供了報表的製作和設計的豐富資源,並且詳細的描述了報表的設定和可用功能及引數。

本文適用於初學者和有一些經驗的報表製作者。報表製作的初學者也可以從報表設計章節中得到幫助。

其他資訊來源

本文不包含全部的報表服務的資訊。如果希望獲取詳細的產品資訊,請檢視產品文件和在http://www.microsoft.com/sql/reporting/ 中可用的線上資源。

產品版本

雖然本文基於Microsoft t® SQL Server™ 2005報表服務,報表設計的相關資訊也適用於早期版本的報表服務。

簡介

Microsoft® SQL Server™ 報表服務是一種完整的報表工具。在使用報表服務中,你可以設計和釋出多種樣式的報表,從簡單表格到帶有圖形和互動式連線的線上自由表單。報表服務可以將報表渲染成使用者指定的多種格式,包括HTML、PDF、Excel和影象格式。

對於各種設定和選擇對於報表製作者在選擇報表佈局是需要解決的問題。這篇文章提供了一些指導方針是使用者在做選擇是更加容易並解答了一些常見的問題。

製作工具和RDL

報表服務提供了多種製作報表的方法。SQL Server 和Microsoft® Visual Studio® 2005 都包括了圖形化的報表設計工具。SQL Server 2005報表服務提供了Report Builder工具幫助業務人員設計報表。也有其他的開發工具可以建立報表服務的報表格式。

無論我們使用哪一種製作環境,所有的報表定義都是用報表定義語言(RDL)格式儲存,RDL是一種公開的XML定義報表的格式。這樣可以直接編寫RDL或者建立自定義工具生成相應格式。報表製作者可以使用圖形化的製作工具編輯已存在的RDL檔案。

在樣例中展示特殊的技術時,文章提取了實現該功能的部分RDL。

在報表服務的網站上http://www.microsoft.com/sql/reporting/可以獲取完整的RDL規範。

報表設計概念

本節描述了影響報表設計和佈局的關鍵因素。如果你是剛剛接觸報表服務,這裡的內容會對你有幫助。所有的這些話題在SQL Server 聯機叢書中都有詳盡的描述。

在設計報表服務中的報表時,你定義了資料並制定在頁面上的排列。儘管這個過程聽起來很基礎,報表服務還是提供了下列特性:

◆支援4種不同的資料區域:列表,表格,矩陣和圖表。
◆提供了例如文字框,圖片,連線,矩形和子報表等一些列控制元件。
◆使用者可以通過引數,條件過濾,使用者端排序,鑽取和文件結構圖來實現互動功能。
◆報表可以被渲染成各種格式,包括HTML,Excel,PDF,影象,XML和逗號分隔符 (CSV) 。

你做的關於每一個關鍵區域的決策都會影響最重的顯示效果和報表功能。接下來的章節將提供影響設計和佈局效果的因素。

資料區域

在我們的報表中我們第一個選擇就是選擇資料區域型別。報表服務提供了下列資料區域型別:

表格
表格通過一行接一行的方式表現資料。列是固定的你無法擴充套件,但是行可以向下展開。因此,當表格增長時,它將資料向下展開。你也可以在表格內將資料分組。
矩陣
A矩陣或者叫交叉表類似於表格,但是行和列都是可以擴充套件並填充資料的。矩陣可以向外和向下增加其他報表物件。你可以在矩陣中在行和列中巢狀分組。
列表
列表適用於建立表單的自由表單資料區域。你可以通過巢狀列表來分組資料。
圖表
圖表是資料的圖形表達方式。報表服務提供了多種圖表的格式。

你選擇的資料區域可能依賴於你使用的資料型別、你希望報表的外觀和如何展現報表。例如,要以Microsoft® Excel®形式呈遞的報表使用表格比使用列表更適合。

報表項的位置和尺寸

報表有3個主要的區域組成:頁首,頁尾和正文。報表服務支援將報表中任意放置報表項。資料區域可以和其它區域並行或通過分組來巢狀。 

當設計報表時,理解當報表項增長時如何處理是非常重要的。報表項可以水平或垂直的增長,依賴於重複的片斷,內容的尺寸和諸如字型等報表渲染的因素。

當報表項增長時,例如一個表格,它會生成很多相關的報表項。這些報表項會在同一個父容器中。有如下2種方法來控制報表項的移動:

◆每個報表項為了維護與上邊報表項間的最小距離會向下移動。
◆每個報表項為了維護與左側報表項間的最小距離會向右移動。

如果一個報表項增長,它會擴充套件包含它的容器的邊界,容器會適應所包容的報表項變化尺寸。

如果報表項和其他的報表項重疊,報表定義中的ZIndex元素決定哪個元素在頂層。ZIndex值高的報表項會置於上層。

這些是一些你可以用來控制報表項的增長和移動方法的技術。如果需要使用矩形和報表項的分組的資訊,請參考本文後面“實用的報表設計技巧”部分。

分頁

對於場報表來說關鍵問題在於如何控制頁面的分割。頁面通過2個因素控制分割:

◆頁面尺寸
◆使用者指定物件前後頁面分割

頁面尺寸

為了控制頁面的尺寸,可以通過下列指導設定頁面的高度和寬度屬性:

◆可以通過報表的PageHeight和PageWidth屬性設定渲染後的物理頁面格式。
◆例如HTML這樣的互動式渲染格式不能渲染物理頁面分割。而使用 InteractiveHeight 和 InteractiveWidth 屬性建立邏輯的頁面分割。
◆有一些渲染格式,例如Excel,不支援頁面尺寸。對於這些報表,你將不得不使用頁面分割符將報表分割成多個頁面。

注意,如果報表的自身寬度比頁面寬度大,報表將在水平方向上交叉於多個頁面。

頁面分割

你可以在矩形,表格,矩陣,列表,圖表和分組中的開始或結尾處新增分頁符。報表服務會嘗試將所有報表項和資料分組保持在同一個頁面上。

可以使用報表項中的PageBreakAtEnd和PageBreakAtStart屬性指定在報表項之前或之後插入分頁符。

子報表

子報表是在報表項中指向另外一個報表。任何報表可以被用於一個子報表,並且你可以設定父報表將要傳遞到子報表的引數。

但是用子報表時你要注意下列前提:

◆子報表無法和父報表共享資料。報表伺服器為分割的報表處理每一個子報表例項,但是這會影響效能。 
◆子報表的頁首和頁尾會被忽略。
子報表在下列環境中十分有用:
◆當你需要在一個資料區域中從不同資料來源巢狀分組。
◆當報表有多個一對多關係的部分。
◆當你需要在多個父報表中重用子報表。
◆當你需要在其他報表內部嵌入一個標準的,獨立的報表。

如果報表共享資料,類似表格,矩陣,列表和圖表這樣的資料區域提供了與子報表同樣的功能。然而,它們提供更好的效能。資料區域在並行的佈局中提供了比子報表更好的工作方式。

表示式和函式

報表製作者可以在報表中使用表示式資料的外觀,更改報表項的屬性或控制資料的獲取。本文的技巧章節提供了一些使用表示式的設計樣例。

你可以在表示式中使用Microsoft® Visual Basic®函式。在表1中顯示了一些常用的函式。

表1

Visual Basic 函式

結果

Today()

返回當前日期。

DateAdd()

基於單一引數提供一段日期。

Year()

顯示指定日期中的年份。使用它分組日期或做為一系列日期的標籤。

Month()

顯示日期中的月份

Format()

格式化字串。可以用於格式化日起和數字。

Right(), Left(), and InStr()

返回擷取後字串中的一部分。

Iif

依照評估的表示式,返回2個值中的1個。為了返回3個值中的1個,你可以巢狀Iif函式。

你可以通過引用適當的裝配件在表示式中使用.NET函式。你也可以使用自定義的裝配件。如果需要此方面更詳細的資訊,請檢視報表服務聯機叢書中”Using Customer Assemblies with Reports”部分。

聚合函式和範圍

報表服務提供了許多聚合函式可以在報表中建立總和或其他聚合。

每個彙總函式支援一個定義彙總範圍的範圍引數。範圍可以通過分組名稱,資料集或資料區域來指定。資料區域或分組必須直接或間接包含聚合函式指定的報表項。

如果你忽略了範圍,聚合範圍是報表項所在的分組或資料區域中最裡面的分組。
表2中顯示了報表服務支援的聚合函式:

表2

函式

描述

Avg

從指定表示式中返回所有非空值的平均值。

Count

返回指定表示式中值的數量。

CountDistinct

返回指定表示式中所有不同值的數量。

CountRows

返回指定範圍中行的數量。

First

從指定表示式中返回第一個值。

Last

從指定表示式中返回最後一個值。

Max

從指定表示式中返回所有非空值中的最大值。

Min

從指定表示式中返回所有非空值中的最小值。

StDev

從指定表示式中返回所有非空值中的標準差。

StDevP

從指定表示式中返回所有非空值中的總體標準差。

Sum

從指定表示式中返回所值的總和。

Var

從指定表示式中返回所有非空值中的方差。

VarP

從指定表示式中返回所有非空值中的總體方差。

報表服務提供函式來支援執行時的彙總。圖3中顯示了相關的函式。

表 3

函式

功能

RowNumber

在指定範圍內返回執行時產生所有行的數量。當於資料區域中使用文字框時,顯示在表示式顯示部分每個文字框例項的行數。用於指定表格行數或提供分頁符。在RowNumber(Nothing)中,關鍵字Nothing指定了在最外側資料區域中從第一行開始計數。

RunningValue

使用指定函式從指定表示式中返回執行時的聚合。

報表服務提供了下列導航範圍函式。表4中顯示了這些函式。

表4

函式

描述

InScope

判斷當前報表項例項是否在指定的範圍中。它使用資料集,分組或資料區域的名稱做為引數並返回布林值。

Level

在遞迴層次中返回當前級別的深度。

Previous

返回之前的行。

報表渲染時的考慮

報表伺服器提供了一套磨人的渲染擴充套件。你可以從報表服務中刪除擴充套件或新增自定義擴充套件支援新的渲染格式。

預設的渲染擴充套件包括了HTML,Excel,逗號分隔符(CSV),XML,影象和PDF。

注意:  預設渲染擴充套件在報表服務中可以用於渲染報表。使用SQL Server 2005報表檢視器控制元件在本地生成的報表可以支援HTML報表渲染,但是不需要訪問其他的擴充套件。

你選擇的渲染擴充套件會影響報表的佈局。例如,不是所有的渲染擴充套件支援強制的頁面分隔符或者頁面分隔符應用於頁面尺寸設定。表5中彙總一些差異。

表5

渲染擴充套件

基於報表項或分組分頁

頁面尺寸

HTML

可以

使用InteractiveHeight屬性

Excel

可以

不可以

CSV

不可以

不可以

XML

不可以

不可以

Image

可以

可以

PDF

可以

可以

GDI (Window 表單)

可以

使用InteractiveHeight屬性

如果你在設計報表之前你知道報表會被如何渲染,你可以針對目標格式優化報表佈局。否則,以應該對各種可能的渲染擴充套件測試你的報表並找到和解決各式上的問題或異常。

接下來的部分包含了使用Excel,影象,PDF和HTML渲染擴充套件的一些建議。

Excel

報表服務支援將報表渲染為Microsoft® Excel® 1997及以後版本。如果你計劃將報表渲染為Excel,你應該知道一些Excel渲染擴充套件的特殊屬性。例如:

◆在報表中每一個報表頁面將變為一個Excel的工作表。Excel不支援頁高和頁寬的概念,所以只有顯式定義的分頁符才能將頁面分割。
◆報表服務不支援指定工作表名稱。
◆渲染擴充套件構建報表外的表格結構。
◆不支援個別單元中的背景圖片。
◆Excel除列表外的巢狀容器。
◆圖表被渲染成圖片,而不是Excel中的圖表。
◆矩形被渲染成單元格組。如果舉行包含其他報表項,矩形將變為單元格區域,矩形的邊框和背景色將應用於表格區域。
◆子報表將被作為矩形在同父報表中的工作表中渲染。

在指定Excel報表中使用表格代替列表

表格使用固定的列寬。這很好的滿足Excel報表中的表格格式。當渲染為Excel時,報表中的報表項會像我們期望一樣排列。

與表格相比,列表是一種自由表單的風格。列表中的報表項將被放置在工作表中像對於在報表中的位置。這樣會導致意想不到的結果。如果你的報表中使用了列表,要確認渲染成Excel的結果是可以接受的。

即使使用表格,如果在你的報表中頁首跨越多個列,Excel渲染擴充套件可能合併單元格或引入新的列。這樣會在Excel電子表格中影響資料的排序和操作。如果你計劃將報表渲染為Excel,請設法確認報表項排列能將單元格合併減到最小。

長報表的最大頁數

為了預防生成Excel產生錯誤,你應該注意冗長報表的頁數。報表中的每頁都會變成Excel中的一個工作表。然而,每一個工作簿中為了限制對記憶體的使用,會有一個最大的工作表數量。如果報表頁面超過了這個限制,Excel會生成一個錯誤。

渲染為Excel時的顏色差異

支援一套預定義的顏色。當你渲染報表時,Excel渲染擴充套件將報表中的顏色應設成Excel支援顏色中最接近的顏色。

影象

影象渲染擴充套件可以將報表渲染成點陣圖或圖元檔案。預設情況下,它將資料渲染成TIFF格式。然而他也可以生成被GDI+支援的任何格式,包括BMP,EMF,GIF,JPEG和PNG。

在報表伺服器中影象渲染處理在一個虛擬的頁面中進行,並在這個頁面建立影象。結果,在任何客戶端上,基於影象的報表在字型和佈局上看起來都是一樣的。
當你使用TIFF檔案時,你可以檢視多頁面報表。然而,其他的影象格式為將為每一個報表頁面生成一個影象檔案。

影象渲染也支援頁面高度,頁面寬度和頁邊距。任何報表中包含的頁首和頁尾都會在報表邊界內被渲染。

使用影象渲染為所有的客戶端建立同樣的報表

如果你希望在所有客戶端看到同樣的報表,你應該使用影象渲染。特別是當報表渲染時,HTML報表使用客戶端子體和瀏覽器設定。這意味著當客戶端使用不同的瀏覽器時報表的佈局會有所不同。因為影象檔案在報表伺服器上格式化,它們渲染成的圖片在任何客戶端上的顯示都是一樣的。

在報表伺服器上安裝適當的字型

你應該確認在報表伺服器上安裝的正確的字型。這是因為報表實際上是在報表伺服器上渲染,它使用了在報表伺服器上所安裝的字型。

便攜文件格式

便攜文件格式(PDF)渲染擴充套件建立的報表可以使用Adobe Acrobat readers開啟檢視。在很多方面上,PDF擴充套件類似於圖片擴充套件,除了下列重要的差異:

◆在PDF報表中字型沒有被嵌入到報表中。 
◆文件結構圖被渲染成PDF書籤。
◆你可以在裝置選項中指定頁面的寬度高度、邊距和PDF的解析度。
◆渲染擴充套件建立的PDF1.3版本的檔案和Adobe Acrobat 4.0機器以後版本相容。
◆PDF渲染擴充套件不支援 RepeatWith屬性。

在客戶機中安裝適當的字型

PDF擴充套件無法在報表中嵌入字型。為了正確的檢視報表的字型,你不僅需要在報表伺服器上確認安裝該字型,也要確認該字型在檢視報表的客戶端中正確安裝了。另外字型替代現象很有可能發生。

HTML

HTML擴充套件可以生成與Microsoft® Internet Explorer,Mozilla Firefox及Apple Safari相容的HTML 4.0頁面。

HTML渲染和其他的渲染有以下的不同:

◆HTML渲染擴充套件在HTML中生成了一個包含所有報表控制元件項的表格。控制元件項將保持在報表佈局時的位置。
◆位置和大小使用毫米(mm)為單位表示。渲染的最小單位是0.2毫米。
◆HTML不支援物件的重疊。這樣導致當報表顯示時佈局被改變了。
◆在HTML報表中,子報表被渲染在DIV標籤中。

客戶端變化

當在客戶端顯示時,HTML報表使用瀏覽器的特性來設定。另外字型的變化,其他的瀏覽器設定可以做相應的處理改變。如果你想恰到好處的控制在所有客戶端上的佈局,考慮使用影象渲染擴充套件。

不同瀏覽器的差異

SQL Server 2005報表服務包括了對於不同瀏覽器的支援例如Microsoft Internet Explorer, Mozilla Firefox 和Apple Safari。儘管大多數的報表的特性在這些瀏覽器上都是被支援的,你也應該在相應瀏覽器上測試確認其滿足你的需求。

實用的報表設計技巧

本節提供了使用表示式來巧妙處理報表格式和佈局的技巧和技術。  

使用矩形保持物件的緊湊

在報表服務中矩形可以被用於圖形元素或者物件的容器。做為物件容器,它可以是在一個頁面上的物件保持適當的距離並控制物件專案移動式的位置。

為了保持多個物件在同一個頁面中,可以將物件放在一個矩形內。你通過設定矩形的PageBreakAtStart或PageBreakAtEnd屬性在矩形的前後新增分頁符。

使用矩形控制報表項的增加位置移動

在同一個矩形中的控制元件相互間是同等的並且當控制元件增長或移動時通過統一的規則在頁面中排布。例如:

◆報表項通過通過各自的矩形來推動和置換。
◆報表項不能和矩形外報表項推動或置換,因為他們不在一個級別上。
◆如果需要,矩形可以增長來適應所包含的控制元件。
當處理會擴充套件的物件時,你可以利用這個邏輯的功能。例如:
◆如果你為你的報表擴充套件預留出一些空白的空間,可以將表格和相應的空白空間放止於同一個矩形。當表格增長,它會被置於預留好的空白空間中。
◆如果你防止矩陣擴充套件出頁面的右側邊緣,可以將矩陣和一些空白放入同一個矩形中。

避免空白頁

有時當你將報表輸出到例如PDF或印表機這樣的物理頁面是,你可能會看到有空白頁面。通常,當報表正文超過紙面尺寸是會發生這種情況。

為了確認所有的內容適合於單一的紙張,正文加上頁邊的空白應該小於預定義好的紙面寬度。文字框和其他的報表項可以導致正文寬度超過紙面寬度,即使當超出部分的內容不可見。另外,報表項水平的增長(矩陣資料區域和圖片自動設定為Autosize或Fit)可以導致正文寬度的增長。

使用分頁提高大報表的效能

如果不去為一個返回大量資料的報表設定頁面大小或分頁符,一些報表格式將會嘗試將報表渲染成單頁。

例如,Excel沒有預設的固定頁面寬度。所以,如果你有一個很大的報表,Excel將嘗試將其渲染成一個工作表。通常,使用分頁符可提高使用者訪問報表時的效能,因為當渲染報表剩餘部分時,使用者可以檢視報表的第一頁。

使用篩選器代替查詢引數

報表服務有幾種方法動態的過濾報表內容:

◆當返回叢資料來源獲取資料時使用查詢引數過濾資料。
◆應用於資料集或報表區域的報表篩選器,限制在報表中顯示的資料。

使用篩選器獲取所有的資料,但是隻有和使用者相關的資料被顯示。這也許比在資料來源中過濾資料的效率要低。然而,這樣可以使我們只獲取一次資料並將資料儲存在快照中來服務於不同的使用者請求。換句話說,當我們使用查詢引數,每一個新的引數查詢你都要訪問資料來源。篩選器可以使我們執行快照並獲取所有引數的結果。

在表格中新增輪換條

也許你需要建立帶有隔行漸變形式的表格或矩陣的報表。 這種欄從視覺上可以更好地在一個頁面上跟蹤不同的行。

為了更好的模擬用在生成大量報表的高速資料印表機中的老式綠條紙 你可以輪換條設定為綠色。

為了完成這個效果,可以使用Iif函式基於行數的奇偶性有條件指派背景色。例如:

=iif(RowNumber(Nothing) Mod 2,"PaleGreen","White")

在RDL檔案中的描述應該類似於如下程式碼:

4 SalesOrderID true =Fields!SalesOrderID.Value


在一個報表中的表格中在指定行後新增分頁符

你可以使用Ceiling 函式在表格中將行分組,並在每個分組後插入分頁符。

Ceiling函式返回不小於輸入引數的最小值。例如,每隔30行新增一個分頁符,你應該使用下列表示式分組:

=Ceiling(RowNumber(Nothing)/30)

在RDL中描述分組應該類似於下列描述:

      =Ceiling(RowNumber(Nothing)/30) true


在頁首和頁尾中新增全域性變數值

在表6中顯示了Globals物件的成員,這些可以在報表的表示式中使用。

表6

名稱

型別

描述

PageNumber

Integer

當前頁數。僅在報表的頁首和頁尾中使用。

TotalPages

Integer

報表的總頁數。僅在報表的頁首和頁尾中使用。

ExecutionTime

DateTime

報表開始執行得日期和時間。

ReportFolder

String

包含報表的資料夾的路徑,例如salesreports\budgeting c:\sales\budget

ReportName

String

報表的名稱,例如 currentbudget.

你可以在報表的頁首或頁尾中使用表示式顯示報表名稱和執行時間。時間通過.NET提供的短日期格式。例如:

=Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")

同樣也可以利用文字框將報表的當前頁數和總頁數顯示在頁首:

=Globals.PageNumber & " of " & Globals.TotalPages

在頁首中顯示報表項

在長報表中你可能會希望在頁首中新增報表正文中的文字。例如,一個姓名地址錄在頁首重要顯示當頁中出現的第一個和最後一個名字。

為了實現這個功能,你可以在頁首上新增一個文字框,並使用First函式。為了在頁面上顯示第一次出現的LastName值,表示式應該類似於如下所示:

=First (ReportItems!LastName.Value)

同樣的,使用表示式函式Last 可以提供在頁面上顯示LastName 文字框的最後一個值 。例如

=Last (ReportItems!LastName.Value)

建立帶有條件格式的鑽取連線

報表服務可以通過擁護和報表的互動在報表中隱藏或顯示報表項。

你可以使用這種功能在報表中建立鑽取連線。例如,通過點選某個區域,使用者可以從彙總檢視中鑽取資料的詳細資訊。

接下來,為包含該分組的文字框建立觸發開關項。然後當使用者點選該文字框,隱含的資料變成可見的或資料不顯示。

結論

Microsoft SQL Server 2005 報表服務提供了多種報表設計的選擇。本文提供了一些常規的指導方針和報表設計技巧,但是隻涉及了部分該產品的功能。為了獲取更多的設計資訊和產品功能,請參考SQL Server 2005 聯機叢書。

淺學rdl報表  

2007-12-21 11:28:04|  分類: 程式設計 |  標籤: |字號 訂閱

應用於:Microsoft® SQL Server™ 2005 報表服務

目錄

關於這篇文件 
其他資訊來源 
產品版本 
簡介 
製作工具和RDL

報表設計概念 
資料區域 
報表項的位置和尺寸 
分頁 
子報表 
表示式和函式 
聚合函式和範圍 

報表渲染時的考慮 
Excel 
影象 
便攜文件格式 
HTML 

實用的報表設計技巧 
使用矩形保持物件的緊湊 
避免空白頁 
使用分頁提高大報表的效能 
使用篩選器代替查詢引數 
在表格中新增輪換條 
在一個報表中的表格中在指定行後新增分頁符 
在頁首和頁尾中新增全域性變數值 
在頁首中顯示報表項 
建立帶有條件格式的鑽取連線 

結論 

關於這篇文件

從使用資料控制元件,到使用什麼格式,到如何分發報表,報表製作者面對著很多種選擇。Microsoft® SQL Server™ 報表服務提供了豐富的報表設計和格式的支援,從基於紙介質表格報表到帶有圖片和鑽取功能的互動式報表

這篇文件包括了報表製作和設計中的指導、建議和技巧。本文件的目的在於解釋一般性的問題並對初學者提供指導建議。報表服務聯機叢書提供了報表的製作和設計的豐富資源,並且詳細的描述了報表的設定和可用功能及引數。

本文適用於初學者和有一些經驗的報表製作者。報表製作的初學者也可以從報表設計章節中得到幫助。

其他資訊來源

本文不包含全部的報表服務的資訊。如果希望獲取詳細的產品資訊,請檢視產品文件和在http://www.microsoft.com/sql/reporting/ 中可用的線上資源。

產品版本

雖然本文基於Microsoft t® SQL Server™ 2005報表服務,報表設計的相關資訊也適用於早期版本的報表服務。

簡介

Microsoft® SQL Server™ 報表服務是一種完整的報表工具。在使用報表服務中,你可以設計和釋出多種樣式的報表,從簡單表格到帶有圖形和互動式連線的線上自由表單。報表服務可以將報表渲染成使用者指定的多種格式,包括HTML、PDF、Excel和影象格式。

對於各種設定和選擇對於報表製作者在選擇報表佈局是需要解決的問題。這篇文章提供了一些指導方針是使用者在做選擇是更加容易並解答了一些常見的問題。

製作工具和RDL

報表服務提供了多種製作報表的方法。SQL Server 和Microsoft® Visual Studio® 2005 都包括了圖形化的報表設計工具。SQL Server 2005報表服務提供了Report Builder工具幫助業務人員設計報表。也有其他的開發工具可以建立報表服務的報表格式。

無論我們使用哪一種製作環境,所有的報表定義都是用報表定義語言(RDL)格式儲存,RDL是一種公開的XML定義報表的格式。這樣可以直接編寫RDL或者建立自定義工具生成相應格式。報表製作者可以使用圖形化的製作工具編輯已存在的RDL檔案。

在樣例中展示特殊的技術時,文章提取了實現該功能的部分RDL。

在報表服務的網站上http://www.microsoft.com/sql/reporting/可以獲取完整的RDL規範。

報表設計概念

本節描述了影響報表設計和佈局的關鍵因素。如果你是剛剛接觸報表服務,這裡的內容會對你有幫助。所有的這些話題在SQL Server 聯機叢書中都有詳盡的描述。

在設計報表服務中的報表時,你定義了資料並制定在頁面上的排列。儘管這個過程聽起來很基礎,報表服務還是提供了下列特性:

◆支援4種不同的資料區域:列表,表格,矩陣和圖表。
◆提供了例如文字框,圖片,連線,矩形和子報表等一些列控制元件。
◆使用者可以通過引數,條件過濾,使用者端排序,鑽取和文件結構圖來實現互動功能。
◆報表可以被渲染成各種格式,包括HTML,Excel,PDF,影象,XML和逗號分隔符 (CSV) 。

你做的關於每一個關鍵區域的決策都會影響最重的顯示效果和報表功能。接下來的章節將提供影響設計和佈局效果的因素。

資料區域

在我們的報表中我們第一個選擇就是選擇資料區域型別。報表服務提供了下列資料區域型別:

表格
表格通過一行接一行的方式表現資料。列是固定的你無法擴充套件,但是行可以向下展開。因此,當表格增長時,它將資料向下展開。你也可以在表格內將資料分組。
矩陣
A矩陣或者叫交叉表類似於表格,但是行和列都是可以擴充套件並填充資料的。矩陣可以向外和向下增加其他報表物件。你可以在矩陣中在行和列中巢狀分組。
列表
列表適用於建立表單的自由表單資料區域。你可以通過巢狀列表來分組資料。
圖表
圖表是資料的圖形表達方式。報表服務提供了多種圖表的格式。

你選擇的資料區域可能依賴於你使用的資料型別、你希望報表的外觀和如何展現報表。例如,要以Microsoft® Excel®形式呈遞的報表使用表格比使用列表更適合。

報表項的位置和尺寸

報表有3個主要的區域組成:頁首,頁尾和正文。報表服務支援將報表中任意放置報表項。資料區域可以和其它區域並行或通過分組來巢狀。 

當設計報表時,理解當報表項增長時如何處理是非常重要的。報表項可以水平或垂直的增長,依賴於重複的片斷,內容的尺寸和諸如字型等報表渲染的因素。

當報表項增長時,例如一個表格,它會生成很多相關的報表項。這些報表項會在同一個父容器中。有如下2種方法來控制報表項的移動:

◆每個報表項為了維護與上邊報表項間的最小距離會向下移動。
◆每個報表項為了維護與左側報表項間的最小距離會向右移動。

如果一個報表項增長,它會擴充套件包含它的容器的邊界,容器會適應所包容的報表項變化尺寸。

如果報表項和其他的報表項重疊,報表定義中的ZIndex元素決定哪個元素在頂層。ZIndex值高的報表項會置於上層。

這些是一些你可以用來控制報表項的增長和移動方法的技術。如果需要使用矩形和報表項的分組的資訊,請參考本文後面“實用的報表設計技巧”部分。

分頁

對於場報表來說關鍵問題在於如何控制頁面的分割。頁面通過2個因素控制分割:

◆頁面尺寸
◆使用者指定物件前後頁面分割

頁面尺寸

為了控制頁面的尺寸,可以通過下列指導設定頁面的高度和寬度屬性:

◆可以通過報表的PageHeight和PageWidth屬性設定渲染後的物理頁面格式。
◆例如HTML這樣的互動式渲染格式不能渲染物理頁面分割。而使用 InteractiveHeight 和 InteractiveWidth 屬性建立邏輯的頁面分割。
◆有一些渲染格式,例如Excel,不支援頁面尺寸。對於這些報表,你將不得不使用頁面分割符將報表分割成多個頁面。

注意,如果報表的自身寬度比頁面寬度大,報表將在水平方向上交叉於多個頁面。

頁面分割

你可以在矩形,表格,矩陣,列表,圖表和分組中的開始或結尾處新增分頁符。報表服務會嘗試將所有報表項和資料分組保持在同一個頁面上。

可以使用報表項中的PageBreakAtEnd和PageBreakAtStart屬性指定在報表項之前或之後插入分頁符。

子報表

子報表是在報表項中指向另外一個報表。任何報表可以被用於一個子報表,並且你可以設定父報表將要傳遞到子報表的引數。

但是用子報表時你要注意下列前提:

◆子報表無法和父報表共享資料。報表伺服器為分割的報表處理每一個子報表例項,但是這會影響效能。 
◆子報表的頁首和頁尾會被忽略。
子報表在下列環境中十分有用:
◆當你需要在一個資料區域中從不同資料來源巢狀分組。
◆當報表有多個一對多關係的部分。
◆當你需要在多個父報表中重用子報表。
◆當你需要在其他報表內部嵌入一個標準的,獨立的報表。

如果報表共享資料,類似表格,矩陣,列表和圖表這樣的資料區域提供了與子報表同樣的功能。然而,它們提供更好的效能。資料區域在並行的佈局中提供了比子報表更好的工作方式。

表示式和函式

報表製作者可以在報表中使用表示式資料的外觀,更改報表項的屬性或控制資料的獲取。本文的技巧章節提供了一些使用表示式的設計樣例。

你可以在表示式中使用Microsoft® Visual Basic®函式。在表1中顯示了一些常用的函式。

表1

Visual Basic 函式

結果

Today()

返回當前日期。

DateAdd()

基於單一引數提供一段日期。

Year()

顯示指定日期中的年份。使用它分組日期或做為一系列日期的標籤。

Month()

顯示日期中的月份

Format()

格式化字串。可以用於格式化日起和數字。

Right(), Left(), and InStr()

返回擷取後字串中的一部分。

Iif

依照評估的表示式,返回2個值中的1個。為了返回3個值中的1個,你可以巢狀Iif函式。

你可以通過引用適當的裝配件在表示式中使用.NET函式。你也可以使用自定義的裝配件。如果需要此方面更詳細的資訊,請檢視報表服務聯機叢書中”Using Customer Assemblies with Reports”部分。

聚合函式和範圍

報表服務提供了許多聚合函式可以在報表中建立總和或其他聚合。

每個彙總函式支援一個定義彙總範圍的範圍引數。範圍可以通過分組名稱,資料集或資料區域來指定。資料區域或分組必須直接或間接包含聚合函式指定的報表項。

如果你忽略了範圍,聚合範圍是報表項所在的分組或資料區域中最裡面的分組。
表2中顯示了報表服務支援的聚合函式:

表2

函式

描述

Avg

從指定表示式中返回所有非空值的平均值。

Count

返回指定表示式中值的數量。

CountDistinct

返回指定表示式中所有不同值的數量。

CountRows

返回指定範圍中行的數量。

First

從指定表示式中返回第一個值。

Last

從指定表示式中返回最後一個值。

Max

從指定表示式中返回所有非空值中的最大值。

Min

從指定表示式中返回所有非空值中的最小值。

StDev

從指定表示式中返回所有非空值中的標準差。

StDevP

從指定表示式中返回所有非空值中的總體標準差。

Sum

從指定表示式中返回所值的總和。

Var

從指定表示式中返回所有非空值中的方差。

VarP

從指定表示式中返回所有非空值中的總體方差。

報表服務提供函式來支援執行時的彙總。圖3中顯示了相關的函式。

表 3

函式

功能

RowNumber

在指定範圍內返回執行時產生所有行的數量。當於資料區域中使用文字框時,顯示在表示式顯示部分每個文字框例項的行數。用於指定表格行數或提供分頁符。在RowNumber(Nothing)中,關鍵字Nothing指定了在最外側資料區域中從第一行開始計數。

RunningValue

使用指定函式從指定表示式中返回執行時的聚合。

報表服務提供了下列導航範圍函式。表4中顯示了這些函式。

表4

函式

描述

InScope

判斷當前報表項例項是否在指定的範圍中。它使用資料集,分組或資料區域的名稱做為引數並返回布林值。

Level

在遞迴層次中返回當前級別的深度。

Previous

返回之前的行。

報表渲染時的考慮

報表伺服器提供了一套磨人的渲染擴充套件。你可以從報表服務中刪除擴充套件或新增自定義擴充套件支援新的渲染格式。

預設的渲染擴充套件包括了HTML,Excel,逗號分隔符(CSV),XML,影象和PDF。

注意:  預設渲染擴充套件在報表服務中可以用於渲染報表。使用SQL Server 2005報表檢視器控制元件在本地生成的報表可以支援HTML報表渲染,但是不需要訪問其他的擴充套件。

你選擇的渲染擴充套件會影響報表的佈局。例如,不是所有的渲染擴充套件支援強制的頁面分隔符或者頁面分隔符應用於頁面尺寸設定。表5中彙總一些差異。

表5

渲染擴充套件

基於報表項或分組分頁

頁面尺寸

HTML

可以

使用InteractiveHeight屬性

Excel

可以

不可以

CSV

不可以

不可以

XML

不可以

不可以

Image

可以

可以

PDF

可以

可以

GDI (Window 表單)

可以

使用InteractiveHeight屬性

如果你在設計報表之前你知道報表會被如何渲染,你可以針對目標格式優化報表佈局。否則,以應該對各種可能的渲染擴充套件測試你的報表並找到和解決各式上的問題或異常。

接下來的部分包含了使用Excel,影象,PDF和HTML渲染擴充套件的一些建議。

Excel

報表服務支援將報表渲染為Microsoft® Excel® 1997及以後版本。如果你計劃將報表渲染為Excel,你應該知道一些Excel渲染擴充套件的特殊屬性。例如:

◆在報表中每一個報表頁面將變為一個Excel的工作表。Excel不支援頁高和頁寬的概念,所以只有顯式定義的分頁符才能將頁面分割。
◆報表服務不支援指定工作表名稱。
◆渲染擴充套件構建報表外的表格結構。
◆不支援個別單元中的背景圖片。
◆Excel除列表外的巢狀容器。
◆圖表被渲染成圖片,而不是Excel中的圖表。
◆矩形被渲染成單元格組。如果舉行包含其他報表項,矩形將變為單元格區域,矩形的邊框和背景色將應用於表格區域。
◆子報表將被作為矩形在同父報表中的工作表中渲染。

在指定Excel報表中使用表格代替列表

表格使用固定的列寬。這很好的滿足Excel報表中的表格格式。當渲染為Excel時,報表中的報表項會像我們期望一樣排列。

與表格相比,列表是一種自由表單的風格。列表中的報表項將被放置在工作表中像對於在報表中的位置。這樣會導致意想不到的結果。如果你的報表中使用了列表,要確認渲染成Excel的結果是可以接受的。

即使使用表格,如果在你的報表中頁首跨越多個列,Excel渲染擴充套件可能合併單元格或引入新的列。這樣會在Excel電子表格中影響資料的排序和操作。如果你計劃將報表渲染為Excel,請設法確認報表項排列能將單元格合併減到最小。

長報表的最大頁數

為了預防生成Excel產生錯誤,你應該注意冗長報表的頁數。報表中的每頁都會變成Excel中的一個工作表。然而,每一個工作簿中為了限制對記憶體的使用,會有一個最大的工作表數量。如果報表頁面超過了這個限制,Excel會生成一個錯誤。

渲染為Excel時的顏色差異

支援一套預定義的顏色。當你渲染報表時,Excel渲染擴充套件將報表中的顏色應設成Excel支援顏色中最接近的顏色。

影象

影象渲染擴充套件可以將報表渲染成點陣圖或圖元檔案。預設情況下,它將資料渲染成TIFF格式。然而他也可以生成被GDI+支援的任何格式,包括BMP,EMF,GIF,JPEG和PNG。

在報表伺服器中影象渲染處理在一個虛擬的頁面中進行,並在這個頁面建立影象。結果,在任何客戶端上,基於影象的報表在字型和佈局上看起來都是一樣的。
當你使用TIFF檔案時,你可以檢視多頁面報表。然而,其他的影象格式為將為每一個報表頁面生成一個影象檔案。

影象渲染也支援頁面高度,頁面寬度和頁邊距。任何報表中包含的頁首和頁尾都會在報表邊界內被渲染。

使用影象渲染為所有的客戶端建立同樣的報表

如果你希望在所有客戶端看到同樣的報表,你應該使用影象渲染。特別是當報表渲染時,HTML報表使用客戶端子體和瀏覽器設定。這意味著當客戶端使用不同的瀏覽器時報表的佈局會有所不同。因為影象檔案在報表伺服器上格式化,它們渲染成的圖片在任何客戶端上的顯示都是一樣的。

在報表伺服器上安裝適當的字型

你應該確認在報表伺服器上安裝的正確的字型。這是因為報表實際上是在報表伺服器上渲染,它使用了在報表伺服器上所安裝的字型。

便攜文件格式

便攜文件格式(PDF)渲染擴充套件建立的報表可以使用Adobe Acrobat readers開啟檢視。在很多方面上,PDF擴充套件類似於圖片擴充套件,除了下列重要的差異:

◆在PDF報表中字型沒有被嵌入到報表中。 
◆文件結構圖被渲染成PDF書籤。
◆你可以在裝置選項中指定頁面的寬度高度、邊距和PDF的解析度。
◆渲染擴充套件建立的PDF1.3版本的檔案和Adobe Acrobat 4.0機器以後版本相容。
◆PDF渲染擴充套件不支援 RepeatWith屬性。

在客戶機中安裝適當的字型

PDF擴充套件無法在報表中嵌入字型。為了正確的檢視報表的字型,你不僅需要在報表伺服器上確認安裝該字型,也要確認該字型在檢視報表的客戶端中正確安裝了。另外字型替代現象很有可能發生。

HTML

HTML擴充套件可以生成與Microsoft® Internet Explorer,Mozilla Firefox及Apple Safari相容的HTML 4.0頁面。

HTML渲染和其他的渲染有以下的不同:

◆HTML渲染擴充套件在HTML中生成了一個包含所有報表控制元件項的表格。控制元件項將保持在報表佈局時的位置。
◆位置和大小使用毫米(mm)為單位表示。渲染的最小單位是0.2毫米。
◆HTML不支援物件的重疊。這樣導致當報表顯示時佈局被改變了。
◆在HTML報表中,子報表被渲染在DIV標籤中。

客戶端變化

當在客戶端顯示時,HTML報表使用瀏覽器的特性來設定。另外字型的變化,其他的瀏覽器設定可以做相應的處理改變。如果你想恰到好處的控制在所有客戶端上的佈局,考慮使用影象渲染擴充套件。

不同瀏覽器的差異

SQL Server 2005報表服務包括了對於不同瀏覽器的支援例如Microsoft Internet Explorer, Mozilla Firefox 和Apple Safari。儘管大多數的報表的特性在這些瀏覽器上都是被支援的,你也應該在相應瀏覽器上測試確認其滿足你的需求。

實用的報表設計技巧

本節提供了使用表示式來巧妙處理報表格式和佈局的技巧和技術。  

使用矩形保持物件的緊湊

在報表服務中矩形可以被用於圖形元素或者物件的容器。做為物件容器,它可以是在一個頁面上的物件保持適當的距離並控制物件專案移動式的位置。

為了保持多個物件在同一個頁面中,可以將物件放在一個矩形內。你通過設定矩形的PageBreakAtStart或PageBreakAtEnd屬性在矩形的前後新增分頁符。

使用矩形控制報表項的增加位置移動

在同一個矩形中的控制元件相互間是同等的並且當控制元件增長或移動時通過統一的規則在頁面中排布。例如:

◆報表項通過通過各自的矩形來推動和置換。
◆報表項不能和矩形外報表項推動或置換,因為他們不在一個級別上。
◆如果需要,矩形可以增長來適應所包含的控制元件。
當處理會擴充套件的物件時,你可以利用這個邏輯的功能。例如:
◆如果你為你的報表擴充套件預留出一些空白的空間,可以將表格和相應的空白空間放止於同一個矩形。當表格增長,它會被置於預留好的空白空間中。
◆如果你防止矩陣擴充套件出頁面的右側邊緣,可以將矩陣和一些空白放入同一個矩形中。

避免空白頁

有時當你將報表輸出到例如PDF或印表機這樣的物理頁面是,你可能會看到有空白頁面。通常,當報表正文超過紙面尺寸是會發生這種情況。

為了確認所有的內容適合於單一的紙張,正文加上頁邊的空白應該小於預定義好的紙面寬度。文字框和其他的報表項可以導致正文寬度超過紙面寬度,即使當超出部分的內容不可見。另外,報表項水平的增長(矩陣資料區域和圖片自動設定為Autosize或Fit)可以導致正文寬度的增長。

使用分頁提高大報表的效能

如果不去為一個返回大量資料的報表設定頁面大小或分頁符,一些報表格式將會嘗試將報表渲染成單頁。

例如,Excel沒有預設的固定頁面寬度。所以,如果你有一個很大的報表,Excel將嘗試將其渲染成一個工作表。通常,使用分頁符可提高使用者訪問報表時的效能,因為當渲染報表剩餘部分時,使用者可以檢視報表的第一頁。

使用篩選器代替查詢引數

報表服務有幾種方法動態的過濾報表內容:

◆當返回叢資料來源獲取資料時使用查詢引數過濾資料。
◆應用於資料集或報表區域的報表篩選器,限制在報表中顯示的資料。

使用篩選器獲取所有的資料,但是隻有和使用者相關的資料被顯示。這也許比在資料來源中過濾資料的效率要低。然而,這樣可以使我們只獲取一次資料並將資料儲存在快照中來服務於不同的使用者請求。換句話說,當我們使用查詢引數,每一個新的引數查詢你都要訪問資料來源。篩選器可以使我們執行快照並獲取所有引數的結果。

在表格中新增輪換條

也許你需要建立帶有隔行漸變形式的表格或矩陣的報表。 這種欄從視覺上可以更好地在一個頁面上跟蹤不同的行。

為了更好的模擬用在生成大量報表的高速資料印表機中的老式綠條紙 你可以輪換條設定為綠色。

為了完成這個效果,可以使用Iif函式基於行數的奇偶性有條件指派背景色。例如:

=iif(RowNumber(Nothing) Mod 2,"PaleGreen","White")

在RDL檔案中的描述應該類似於如下程式碼:

4 SalesOrderID true =Fields!SalesOrderID.Value


在一個報表中的表格中在指定行後新增分頁符

你可以使用Ceiling 函式在表格中將行分組,並在每個分組後插入分頁符。

Ceiling函式返回不小於輸入引數的最小值。例如,每隔30行新增一個分頁符,你應該使用下列表示式分組:

=Ceiling(RowNumber(Nothing)/30)

在RDL中描述分組應該類似於下列描述:

      =Ceiling(RowNumber(Nothing)/30) true


在頁首和頁尾中新增全域性變數值

在表6中顯示了Globals物件的成員,這些可以在報表的表示式中使用。

表6

名稱

型別

描述

PageNumber

Integer

當前頁數。僅在報表的頁首和頁尾中使用。

TotalPages

Integer

報表的總頁數。僅在報表的頁首和頁尾中使用。

ExecutionTime

DateTime

報表開始執行得日期和時間。

ReportFolder

String

包含報表的資料夾的路徑,例如salesreports\budgeting c:\sales\budget

ReportName

String

報表的名稱,例如 currentbudget.

你可以在報表的頁首或頁尾中使用表示式顯示報表名稱和執行時間。時間通過.NET提供的短日期格式。例如:

=Globals.ReportName & ", dated " & Format(Globals.ExecutionTime, "d")

同樣也可以利用文字框將報表的當前頁數和總頁數顯示在頁首:

=Globals.PageNumber & " of " & Globals.TotalPages

在頁首中顯示報表項

在長報表中你可能會希望在頁首中新增報表正文中的文字。例如,一個姓名地址錄在頁首重要顯示當頁中出現的第一個和最後一個名字。

為了實現這個功能,你可以在頁首上新增一個文字框,並使用First函式。為了在頁面上顯示第一次出現的LastName值,表示式應該類似於如下所示:

=First (ReportItems!LastName.Value)

同樣的,使用表示式函式Last 可以提供在頁面上顯示LastName 文字框的最後一個值 。例如

=Last (ReportItems!LastName.Value)

建立帶有條件格式的鑽取連線

報表服務可以通過擁護和報表的互動在報表中隱藏或顯示報表項。

你可以使用這種功能在報表中建立鑽取連線。例如,通過點選某個區域,使用者可以從彙總檢視中鑽取資料的詳細資訊。

接下來,為包含該分組的文字框建立觸發開關項。然後當使用者點選該文字框,隱含的資料變成可見的或資料不顯示。

結論

Microsoft SQL Server 2005 報表服務提供了多種報表設計的選擇。本文提供了一些常規的指導方針和報表設計技巧,但是隻涉及了部分該產品的功能。為了獲取更多的設計資訊和產品功能,請參考SQL Server 2005 聯機叢書。

更多資訊:http://www.microsoft.com/sql/ 



相關文章