這一篇是關(guān)于 SQL Server 2005 Reporting Services 四篇文章中最后一篇:
?
?
Part 1 ,提供了創(chuàng)建基本報(bào)表的指南
?
Part 2 ,介紹了創(chuàng)建動(dòng)態(tài)報(bào)表用到的 SSRS 核心特性和功能
?
Part 3 ,完全介紹了嵌入到 SSRS 中的圖表控件
?
這里,在 Part 4 ,我們把精力放在報(bào)表定義語言( 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 ."
?
我們將查看一個(gè)典型 RDL 文件的組成部分,討論下怎樣使用 RDL 知識(shí)優(yōu)化和自定義報(bào)表。然后我們會(huì)了解一下報(bào)表設(shè)計(jì)器工具,這是隨著 SSRS 而來的一個(gè)全新的即席報(bào)表工具。作為一個(gè)報(bào)表開發(fā)者,你可以創(chuàng)建一個(gè)終端用戶可以使用的你提供的報(bào)表定義工具。怎么?有點(diǎn)迷惑?一會(huì)兒你就會(huì)了解。
?
為了試驗(yàn)我的例子,你得安裝好了 SQL2005 , SSRS , VS2005. 如果對(duì)這個(gè)有疑問,可以轉(zhuǎn)回 Part 1 去查看。然后請(qǐng)下載相關(guān)源代碼文件。
?
現(xiàn)在在 VS2005 新建一個(gè) BI SSRS 項(xiàng)目。選擇工程 - 添加已有項(xiàng),添加上共享數(shù)據(jù)源( ReportDB.rds )和報(bào)表定義文件, FirstReportMan.rdl.
?
報(bào)表定義語言
?
報(bào)表定義語言是一種為了定義報(bào)表基于 XML 的架構(gòu)。而且從 VS2005 報(bào)表設(shè)計(jì)器生成的 SSRS2005 報(bào)表本質(zhì)上就是 XML 。每個(gè)報(bào)表都有表頭,表尾和主題。架構(gòu)定義了:
?
l ???????? 報(bào)表布局 -RDL 文件中的主題部分定義了列在報(bào)表中的所有對(duì)象,包括字段,圖片和表格。
?
l ???????? 各個(gè)數(shù)據(jù)集,數(shù)據(jù)集對(duì)應(yīng)的數(shù)據(jù)源一集數(shù)據(jù)連接信息(當(dāng)不適用數(shù)據(jù)源時(shí))。
?
l ???????? 數(shù)據(jù)集中的字段信息。
?
l ???????? 報(bào)表中使用的所有參數(shù)。
?
您可以在這里看到對(duì) RDL 的整體描述:
?
http://www.microsoft.com/sql/technologies/reporting/rdlspec.mspx
?
剖析一個(gè)典型的 RDL 文件
?
熟悉 RDL 文件最簡單的方法就是深入分析一個(gè)典型的 RDL 文件。
?
讓我們看一下下載的項(xiàng)目中的那個(gè) FirstReportMan.rdl 文件,打開 Visual Studio ,打開這個(gè)文件。在解決方案資源管理器上右擊 FirstReportMan.rdl ,選擇查看代碼選項(xiàng),這樣就會(huì)以 XML 的形式打開這個(gè)報(bào)表文件。整個(gè) XML 內(nèi)容在文件之中,但這里我們只看一下主要的部分。
?
文檔元素
?
?
我們首先來看一下文檔元素:
?
<?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">
?
文檔元素被稱作是報(bào)表——這很正常。它引用了兩個(gè) XML 命名空間:
?
- http://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition
- http://schemas.microsoft.com/SQLServer/reporting/reportdesigner
數(shù)據(jù)源
?
?
在 RDL 文件中,緊接著命名空間引用的就是數(shù)據(jù)源。在這個(gè)元素中,你可以為你的報(bào)表定義單個(gè)或多個(gè)數(shù)據(jù)源。
?
<DataSources>
? ?? <DataSource Name="ReportsDB">
????? <DataSourceReference>ReportsDB</DataSourceReference>
???? ? <rd:DataSourceID>b75a1ec2-03ed-4562-921e-28ca4150b215</rd:DataSourceID>
??? </DataSource>
</DataSources>
?
可以看出,數(shù)據(jù)源標(biāo)記引用了我們的共享數(shù)據(jù)源 ReportDB 。而且還為數(shù)據(jù)源提供了一個(gè) GUID 。如果沒有使用共享數(shù)據(jù)源,結(jié)果應(yīng)該是這個(gè)樣子:
?
<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>
?
邊距
?
?
奇怪的是,緊接著數(shù)據(jù)源定義的是報(bào)表邊距。不過請(qǐng)記住這是 XML ,所以標(biāo)記的順序無關(guān),甚至不同報(bào)表擁有著不同的標(biāo)記順序。你還可能看到別的標(biāo)記,比如說 GUID 散落在報(bào)表各個(gè)角落。
?
<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>
?
報(bào)表參數(shù)
?
?
報(bào)表參數(shù)是下一個(gè)重要的部分。每一個(gè)報(bào)表參數(shù)都有名字,數(shù)據(jù)類型和標(biāo)簽。標(biāo)簽用來作為用戶輸入的提示。每個(gè)參數(shù)還有一個(gè) ValidValue 部分。 ValidValue 部分可以作為下拉列表框里的內(nèi)容。
?
<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>
?
在這個(gè) RDL 文件里有兩個(gè)參數(shù), ReportTitle 和 ReportUserID 。 ReportTitle 參數(shù)是一個(gè) string 類型的,它有兩個(gè)有效值, MyFirstReport 和 CustomReport 。對(duì)應(yīng)著兩個(gè)標(biāo)簽, Title1 和 Title2. 如果用戶選擇了 Title1 ,那么報(bào)表將顯示 MyFirstReport. ReportUserID 也是一個(gè) string 類型的參數(shù),只不過沒有定義有效值。
?
主體
?
?
接下來是報(bào)表的主體部分。主要有兩個(gè)標(biāo)記, Height 和 ReportItems 。
?
<Body>
?? <ReportItems>
????? …
?? </ReportItems>
?? <Height>0.875in</Height>
</Body>
?
高度屬性定義了報(bào)表主體的高度。而這里真正重要的是 ReportItems 元素。 RDL 文件中所有報(bào)表對(duì)象都在這里。仔細(xì)觀察就會(huì)發(fā)現(xiàn)在 ReportItems 元素下面有一個(gè)表格定義和兩個(gè)文本框定義。每個(gè)都定義了大小和位置。在表格里有這些定義:
?
首先看一下表格 :MyFirstTable 。在表格定義的細(xì)節(jié)部分,我們定義了各個(gè)部分,如果有排序或者分組,那么就定義在 <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>
?
現(xiàn)在來看一下表格的表頭部分,我們?cè)谶@里定一個(gè)表頭的各個(gè)字段,對(duì)應(yīng)于表格各個(gè)列:
?
<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 元素,包含了各個(gè)列信息 :
?
<TableColumn>
??????????? <Width>1.25in</Width>
??? </TableColumn>
?
PageHeader
?
看完主題部分之后,我們來到了 PageHeader 部分,就像主題部分一樣,這里面也有 ReportItems 元素,同樣展示了各個(gè)元素。這里也有關(guān)于是不是在報(bào)表首頁和末頁顯示表頭信息的元素。
?
<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
?
數(shù)據(jù)集
?
數(shù)據(jù)集是下一個(gè)部分,每個(gè)數(shù)據(jù)集元素對(duì)應(yīng)于報(bào)表中的數(shù)據(jù)集。每一個(gè)數(shù)據(jù)集又一個(gè)帶有命令類型的查詢定義,直接連接到數(shù)據(jù)源。下面就是字段,每個(gè)字段都有字段名稱和類型,所以我們的數(shù)據(jù)集有如下定義:
?
<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>
?
最后是代碼元素。這一部分就是我們嵌入報(bào)表的自定義功能的代碼。
?
<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 文件
?
現(xiàn)在我們明白了在前段報(bào)表設(shè)計(jì)器發(fā)揮作用是后臺(tái)做了什么事。理解了這些我們就可以在需要的時(shí)候?qū)懽约旱? RDL 報(bào)表了。我發(fā)現(xiàn)在 2005 中寫的代碼要比 2000 少多了。然而,懂得 RDL 能在別的方面發(fā)揮大的作用。你可以不非得用 Visual Studio 來進(jìn)行設(shè)計(jì),你可以用自己的報(bào)表設(shè)計(jì)工具了。
?
使用 Report Builder
Report Builder 是 SSRS 的一個(gè)輕量級(jí)的補(bǔ)充,開發(fā)人員可以利用這個(gè)開發(fā)一個(gè)基于 web 的一鍵式部署工具。這個(gè)工具允許用戶通過事先定義好的字段和功能函數(shù)來定義自己的報(bào)表。用戶可以使用拖拽的方法創(chuàng)建自定義報(bào)表。在不用給予用戶太多數(shù)據(jù)庫操作的權(quán)限的情況下,這是個(gè)不錯(cuò)的選擇。
?
定義報(bào)表
在這個(gè)練習(xí)中我們將建造一個(gè)報(bào)表定義。首先創(chuàng)建一個(gè)報(bào)表模型項(xiàng)目。然后可以看到其中有三個(gè)文件夾:
?
1. ???????? 數(shù)據(jù)源
?
2. ???????? 數(shù)據(jù)源視圖
?
3. ???????? 報(bào)表模型
?
添加數(shù)據(jù)源
?
跟 RS 中其他地方一樣,可以通過數(shù)據(jù)源向?qū)?gòu)建。
?
添加數(shù)據(jù)源視圖
?
數(shù)據(jù)源視圖允許開發(fā)人員在構(gòu)建報(bào)表的時(shí)候使用哪些數(shù)據(jù)表。也可以進(jìn)行關(guān)聯(lián)設(shè)置,這樣報(bào)表就會(huì)知道該怎么進(jìn)行連接操作。表格關(guān)聯(lián)可以使用外鍵或者名稱匹配架構(gòu)。如果使用名稱匹配架構(gòu),表格連接操作就會(huì)使用相同名稱的字段或者主鍵。
?
添加報(bào)表模型
?
報(bào)表模型使用了數(shù)據(jù)源視圖以及其包含的部分,所以用戶可以利用這些元素來創(chuàng)建報(bào)表。報(bào)表模型也可以選擇單個(gè)的字段信息。
?
使用 Report Builder 創(chuàng)建報(bào)表
我們可以在 windows 應(yīng)用上打開 ReportBuilder ,然后通過拖拽操作就可以創(chuàng)建報(bào)表。用戶可以決定要顯示的字段信息和報(bào)表格式。
?
在建立報(bào)表之前得先安裝好。 Netframework2.0.
?
導(dǎo)航到 http://localhost/Reports/ .
?
可以看到有個(gè)按鈕式 ReportBuilder ,單擊,第一次加載可能比較慢,然后選擇模型,就可以進(jìn)行報(bào)表構(gòu)建工作了。
?
結(jié)論
希望這一系列會(huì)對(duì) SSRS 方面有所幫助。
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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