這一篇是關于 SQL Server 2005 Reporting Services 四篇文章中最后一篇:
?
?
Part 1 ,提供了創建基本報表的指南
?
Part 2 ,介紹了創建動態報表用到的 SSRS 核心特性和功能
?
Part 3 ,完全介紹了嵌入到 SSRS 中的圖表控件
?
這里,在 Part 4 ,我們把精力放在報表定義語言( RDL )上。 RDL 的定義在 MSDN2 給的很好,所以我在引用一下:
?
" A report definition contains data retrieval and layout information for a report. Report Definition Language (RDL) is an XML representation of this report definition ."
?
我們將查看一個典型 RDL 文件的組成部分,討論下怎樣使用 RDL 知識優化和自定義報表。然后我們會了解一下報表設計器工具,這是隨著 SSRS 而來的一個全新的即席報表工具。作為一個報表開發者,你可以創建一個終端用戶可以使用的你提供的報表定義工具。怎么?有點迷惑?一會兒你就會了解。
?
為了試驗我的例子,你得安裝好了 SQL2005 , SSRS , VS2005. 如果對這個有疑問,可以轉回 Part 1 去查看。然后請下載相關源代碼文件。
?
現在在 VS2005 新建一個 BI SSRS 項目。選擇工程 - 添加已有項,添加上共享數據源( ReportDB.rds )和報表定義文件, FirstReportMan.rdl.
?
報表定義語言
?
報表定義語言是一種為了定義報表基于 XML 的架構。而且從 VS2005 報表設計器生成的 SSRS2005 報表本質上就是 XML 。每個報表都有表頭,表尾和主題。架構定義了:
?
l ???????? 報表布局 -RDL 文件中的主題部分定義了列在報表中的所有對象,包括字段,圖片和表格。
?
l ???????? 各個數據集,數據集對應的數據源一集數據連接信息(當不適用數據源時)。
?
l ???????? 數據集中的字段信息。
?
l ???????? 報表中使用的所有參數。
?
您可以在這里看到對 RDL 的整體描述:
?
http://www.microsoft.com/sql/technologies/reporting/rdlspec.mspx
?
剖析一個典型的 RDL 文件
?
熟悉 RDL 文件最簡單的方法就是深入分析一個典型的 RDL 文件。
?
讓我們看一下下載的項目中的那個 FirstReportMan.rdl 文件,打開 Visual Studio ,打開這個文件。在解決方案資源管理器上右擊 FirstReportMan.rdl ,選擇查看代碼選項,這樣就會以 XML 的形式打開這個報表文件。整個 XML 內容在文件之中,但這里我們只看一下主要的部分。
?
文檔元素
?
?
我們首先來看一下文檔元素:
?
<?xml version="1.0" encoding="utf-8"?>
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/
????????????????? 2005/01/reportdefinition"
xmlns:rd="http://schemas.microsoft.com/SQLServer/
????????????????? reporting/reportdesigner">
?
文檔元素被稱作是報表——這很正常。它引用了兩個 XML 命名空間:
?
- http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition
- http://schemas.microsoft.com/SQLServer/reporting/reportdesigner
數據源
?
?
在 RDL 文件中,緊接著命名空間引用的就是數據源。在這個元素中,你可以為你的報表定義單個或多個數據源。
?
<DataSources>
? ?? <DataSource Name="ReportsDB">
????? <DataSourceReference>ReportsDB</DataSourceReference>
???? ? <rd:DataSourceID>b75a1ec2-03ed-4562-921e-28ca4150b215</rd:DataSourceID>
??? </DataSource>
</DataSources>
?
可以看出,數據源標記引用了我們的共享數據源 ReportDB 。而且還為數據源提供了一個 GUID 。如果沒有使用共享數據源,結果應該是這個樣子:
?
<DataSource Name="ReportingDemo">
????? <rd:DataSourceID>f34d206b-ca72-4ca6-9d5c-4151cd7eadc3</rd:DataSourceID>
????? <ConnectionProperties>
??????? <DataProvider>SQL</DataProvider>
??????? <ConnectString>Data Source=SKYNET05"SKYNETSQL2005;Initial z
??????????? Catalog=ReportingDemo</ConnectString>
????? </ConnectionProperties>
</DataSource>
?
邊距
?
?
奇怪的是,緊接著數據源定義的是報表邊距。不過請記住這是 XML ,所以標記的順序無關,甚至不同報表擁有著不同的標記順序。你還可能看到別的標記,比如說 GUID 散落在報表各個角落。
?
<BottomMargin>1in</BottomMargin>
<RightMargin>1in</RightMargin>
<rd:ReportID>b3751a5a-3ac4-4b97-bdc2-cea456baad26</rd:ReportID>
<LeftMargin>1in</LeftMargin>
<Width>5.625in</Width>
?<InteractiveHeight>11in</InteractiveHeight>
?<Language>en-US</Language>
?<TopMargin>1in</TopMargin>
?
報表參數
?
?
報表參數是下一個重要的部分。每一個報表參數都有名字,數據類型和標簽。標簽用來作為用戶輸入的提示。每個參數還有一個 ValidValue 部分。 ValidValue 部分可以作為下拉列表框里的內容。
?
<ReportParameters>
??? <ReportParameter Name="ReportTitle">
????? <DataType>String</DataType>
????? <AllowBlank>true</AllowBlank>
????? <Prompt>Report Title</Prompt>
????? <ValidValues>
??????? <ParameterValues>
????????? <ParameterValue>
??????????? <Value>My First Report</Value>
??????????? <Label>Title1</Label>
????????? </ParameterValue>
????????? <ParameterValue>
????????????<Value>Customer Report</Value>
??????????? <Label>Title2</Label>
????????? </ParameterValue>
??????? </ParameterValues>
????? </ValidValues>
??? </ReportParameter>
??? <ReportParameter Name="ReportingUserID">
????? <DataType>String</DataType>
??????<Prompt>ReportingUserID</Prompt>
??? </ReportParameter>
?</ReportParameters>
?
在這個 RDL 文件里有兩個參數, ReportTitle 和 ReportUserID 。 ReportTitle 參數是一個 string 類型的,它有兩個有效值, MyFirstReport 和 CustomReport 。對應著兩個標簽, Title1 和 Title2. 如果用戶選擇了 Title1 ,那么報表將顯示 MyFirstReport. ReportUserID 也是一個 string 類型的參數,只不過沒有定義有效值。
?
主體
?
?
接下來是報表的主體部分。主要有兩個標記, Height 和 ReportItems 。
?
<Body>
?? <ReportItems>
????? …
?? </ReportItems>
?? <Height>0.875in</Height>
</Body>
?
高度屬性定義了報表主體的高度。而這里真正重要的是 ReportItems 元素。 RDL 文件中所有報表對象都在這里。仔細觀察就會發現在 ReportItems 元素下面有一個表格定義和兩個文本框定義。每個都定義了大小和位置。在表格里有這些定義:
?
首先看一下表格 :MyFirstTable 。在表格定義的細節部分,我們定義了各個部分,如果有排序或者分組,那么就定義在 <grouping> 和 <sorting> 里面。這里我們只展示一下 FirstName :
?
<Table Name="MyFirstTable">
?<DataSetName>ReportData</DataSetName>
?<Top>0.375in</Top>
?<ZIndex>2</ZIndex>
??? <Details>
????? <TableRows>
??????? <TableRow>
????????? <TableCells>
??????????? <TableCell>
????????????? <ReportItems>
??????????????? <Textbox Name="FirstName_1">
????????????????? <rd:DefaultName>FirstName_1</rd:DefaultName>
????????????????? <ZIndex>4</ZIndex>
??????????????????<Style>
??????????????????? <PaddingLeft>2pt</PaddingLeft>
??????????????????? <PaddingBottom>2pt</PaddingBottom>
??????????????????? <PaddingRight>2pt</PaddingRight>
??????????????????? <PaddingTop>2pt</PaddingTop>
????????????????? </Style>
??????????????????<CanGrow>true</CanGrow>
????????????????? <Value>=Fields!FirstName.Value</Value>
??????????????? </Textbox>
????????????? </ReportItems>
??????????? </TableCell>
?
現在來看一下表格的表頭部分,我們在這里定一個表頭的各個字段,對應于表格各個列:
?
<TableCell>
?????????????? <ReportItems>
???? ????????????<Textbox Name="FirstName">
?????????????????? <rd:DefaultName>FirstName</rd:DefaultName>
?????????????????? <ZIndex>9</ZIndex>
?????????????????? <Style>
???????????????????? <PaddingLeft>2pt</PaddingLeft>
???????????????????? <PaddingBottom>2pt</PaddingBottom>
???????????????????? <FontWeight>700</FontWeight>
???????????????????? <BackgroundColor>LightSeaGreen</BackgroundColor>
???????????????????? <Color>WhiteSmoke</Color>
???????????????????? <PaddingRight>2pt</PaddingRight>
???????????????? ????<PaddingTop>2pt</PaddingTop>
?????????????????? </Style>
?????????????????? <CanGrow>true</CanGrow>
?????????????????? <Value>First Name</Value>
???????????????? </Textbox>
?????????????? </ReportItems>
????????? </TableCell>
?
最后我們定義了 TableColumn 元素,包含了各個列信息 :
?
<TableColumn>
??????????? <Width>1.25in</Width>
??? </TableColumn>
?
PageHeader
?
看完主題部分之后,我們來到了 PageHeader 部分,就像主題部分一樣,這里面也有 ReportItems 元素,同樣展示了各個元素。這里也有關于是不是在報表首頁和末頁顯示表頭信息的元素。
?
<PageHeader>
?<ReportItems>
??? <Textbox Name="ReportTitle">
????? <rd:DefaultName>ReportTitle</rd:DefaultName>
????? <Width>3.25in</Width>
????? <Style>
??????? <PaddingLeft>2pt</PaddingLeft>
??????? <PaddingBottom>2pt</PaddingBottom>
??????? <FontWeight>700</FontWeight>
??????? <FontSize>16pt</FontSize>
??????? <PaddingRight>2pt</PaddingRight>
??????? <PaddingTop>2pt</PaddingTop>
????? </Style>
????? <CanGrow>true</CanGrow>
????? <Value>=Parameters!ReportTitle.Value</Value>
?</ReportItems>
?<Height>0.375in</Height>
?<PrintOnLastPage>true</PrintOnLastPage>
?<PrintOnFirstPage>true</PrintOnFirstPage>
</PageHeader>
?
In our page header, we just have a single texbox, called ReportTtitle
?
數據集
?
數據集是下一個部分,每個數據集元素對應于報表中的數據集。每一個數據集又一個帶有命令類型的查詢定義,直接連接到數據源。下面就是字段,每個字段都有字段名稱和類型,所以我們的數據集有如下定義:
?
<DataSet Name="ReportData">
????? <Query>
????? ??<CommandType>StoredProcedure</CommandType>
??????? <CommandText>spr_CustomerSelectAll</CommandText>
??????? <DataSourceName>ReportsDB</DataSourceName>
????? </Query>
????? <Fields>
??????? <Field Name="CustomerID">
????????? <rd:TypeName>System.Int32</rd:TypeName>
????????? <DataField>CustomerID</DataField>
??????? </Field>
?
最后是代碼元素。這一部分就是我們嵌入報表的自定義功能的代碼。
?
<Code>Public Function GetColor(ByVal status as String) as String
IF status = "100" Then
?? Return "White"
End IF
IF status = "101" Then
?? Return "Yellow"
End IF
IF status = "102" Then
?? Return "Tomato"
End IF
End Function
</Code>
?
書寫自己的 RDL 文件
?
現在我們明白了在前段報表設計器發揮作用是后臺做了什么事。理解了這些我們就可以在需要的時候寫自己的 RDL 報表了。我發現在 2005 中寫的代碼要比 2000 少多了。然而,懂得 RDL 能在別的方面發揮大的作用。你可以不非得用 Visual Studio 來進行設計,你可以用自己的報表設計工具了。
?
使用 Report Builder
Report Builder 是 SSRS 的一個輕量級的補充,開發人員可以利用這個開發一個基于 web 的一鍵式部署工具。這個工具允許用戶通過事先定義好的字段和功能函數來定義自己的報表。用戶可以使用拖拽的方法創建自定義報表。在不用給予用戶太多數據庫操作的權限的情況下,這是個不錯的選擇。
?
定義報表
在這個練習中我們將建造一個報表定義。首先創建一個報表模型項目。然后可以看到其中有三個文件夾:
?
1. ???????? 數據源
?
2. ???????? 數據源視圖
?
3. ???????? 報表模型
?
添加數據源
?
跟 RS 中其他地方一樣,可以通過數據源向導構建。
?
添加數據源視圖
?
數據源視圖允許開發人員在構建報表的時候使用哪些數據表。也可以進行關聯設置,這樣報表就會知道該怎么進行連接操作。表格關聯可以使用外鍵或者名稱匹配架構。如果使用名稱匹配架構,表格連接操作就會使用相同名稱的字段或者主鍵。
?
添加報表模型
?
報表模型使用了數據源視圖以及其包含的部分,所以用戶可以利用這些元素來創建報表。報表模型也可以選擇單個的字段信息。
?
使用 Report Builder 創建報表
我們可以在 windows 應用上打開 ReportBuilder ,然后通過拖拽操作就可以創建報表。用戶可以決定要顯示的字段信息和報表格式。
?
在建立報表之前得先安裝好。 Netframework2.0.
?
導航到 http://localhost/Reports/ .
?
可以看到有個按鈕式 ReportBuilder ,單擊,第一次加載可能比較慢,然后選擇模型,就可以進行報表構建工作了。
?
結論
希望這一系列會對 SSRS 方面有所幫助。
?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
