资源描述
Reporting Services服务部署配置及开发
一、 配置报表服务环境
l 要求
必须安装所有 Reporting Services 组件。即检查是否存在C:\Program Files\Microsoft SQL Server\MSSQL.3\目录。
l Reporting Services 配置工具进行运行环境配置
1、配置服务状态。
(1)、单击“开始”,依次指向“程序”、Microsoft SQL Server 2005 和“配置工具”,再单击“Reporting Services 配置”。此时将出现“选择报表服务器安装实例”对话框,可以选择要配置的报表服务器实例,如图:
(2)、在“计算机名称”中,指定安装报表服务器实例的计算机名称。指定的默认值是本地计算机名称,但也可以键入远程 SQL 服务器实例的名称。如果指定远程计算机,请单击“查找”以建立一个连接。必须事先配置报表服务器,以便进行远程管理。
(3)、在“实例名称”中,选择要配置的 SQL Server 2005 Reporting Services 实例。在列表中只显示 SQL Server 2005 报表服务器实例。不能配置较早版本的 Reporting Services。
(4)、单击“连接”。
(5)、开启报表服务。
如图:
同时,会启动数据实例,如图:
2、创建和配置虚拟目录。
说明:报表服务器和报表管理器是通过 URL 访问的 ASP.NET 应用程序。报表服务器 URL 提供对报表服务器的简单对象访问协议 (SOAP) 端点的访问。报表管理器 URL 用于启动报表管理器。每个 URL 都包括您在 Reporting Services 配置工具中指定的虚拟目录。可以为虚拟目录选择默认网站或其他网站。
(1)、配置报表服务管理虚拟目录,如图:
(2)、配置报表文件管理服务虚拟目录,如图:
3、配置服务帐户。
说明:Reporting Services 需要服务帐户才能运行报表服务器 Web 服务和 Microsoft Windows 服务。报表服务器 Windows 服务是在安装过程中配置的,但如果要更新密码或者要使用其他帐户,则可以使用 Reporting Services 配置工具修改该服务。如果您使用的是 Microsoft Windows XP 或 Windows 2000 服务器,则不能配置报表服务器 Web 服务。ASP.NET 安全标识始终用于在这些操作系统上运行报表服务器 Web 服务。针对 Windows Server 2003,则报表服务器 Web 服务将应用程序池的安全标识用作它的服务帐户。可以使用 Reporting Services 配置工具新建自动为报表服务器操作配置的应用程序池。还可以选择现有的应用程序池。
(1)、配置Windows帐号。
如图:
(2)、配置WebService帐号,如图:
4、创建和配置报表服务器数据库。
说明:报表服务器是一个无状态服务器,它需要将 SQL Server 数据库用于内部存储。可以使用 Reporting Services 配置工具来创建和配置与报表服务器数据库的连接。还可以选择现有的数据库,前提是其使用 SQL Server 2005 Reporting Services 的架构。提供了一个升级选项,以便您可以将数据库更新为新架构。
如图:
5、管理加密密钥。
说明:Reporting Services 使用对称密钥来加密和解密敏感数据,如存储的凭据和数据库连接信息。创建和存储对称密钥是在初始化过程中执行的,该初始化过程会准备报表服务器以进行加密操作。明确报表服务器是否已初始化是报表服务器管理中的一个必不可少的部分。如果发生硬件故障或者计划迁移到另一台计算机,则管理对称密钥对于报表服务器恢复非常重要。Reporting Services 配置工具提供了用于备份、还原和重新创建加密密钥的选项,以及用于在不能恢复时删除加密值的选项。还可以用它来查看报表服务器实例的初始化状态。
如图:
6、配置电子邮件传递。
说明:Reporting Services 包括一个报表服务器电子邮件传递扩展插件,该插件使报表订阅服务器可以将报表传递到电子邮箱。电子邮件传递扩展插件使用简单邮件传输协议 (SMTP) 传递报表或通知。您可以使用 Reporting Services 配置工具指定将网络上的哪个 SMTP 服务器或网关用于电子邮件传递。
如图:
7、配置扩展报表服务器部署模型。
说明:Reporting Services 支持在负载平衡群集中部署报表服务器。要在扩展部署中运行多个报表服务器,所有报表服务器实例均需使用单个的共享报表服务器数据库。该数据库提供其所有加盟报表服务器的内部存储和状态信息。若要部署报表服务器扩展部署,应使用 Reporting Services 配置工具将每个报表服务器连接到共享的报表服务器数据库。
如图:
l 管理服务器报表
经过配置工具完成配置之后,IIS中网站(ReportingServices2005)会自动创建两个虚拟目录ReportServer和Reports 。其中ReportServer是报表服务管理,报表的编译执行都是通过它,而Reports是报表文件服务管理,可以浏览报表、订阅等操作来管理报表。
在地址栏中输入:http://localhost:网站端口号/ReportServer ,显示如图:
在地址栏中输入:http://localhost:网站端口号/Reports ,显示如图:
二、 报表制作
l 概念介绍
1、数据源
数据源就是指定连接的数据源类型、连接字符串和凭据。通俗点讲就是指定对一个数据库(并非只局限于数据库,还可以是xml、报表服务器模型待)的连接信息。
在 Reporting Services 中,针对报表定义数据集的第一步是定义要使用的数据源。数据源中不包含查询信息。查询信息包含在数据集中,而数据集使用数据源来连接数据库。
若要指定在报表定义中使用的数据源,则必须在报表设计器创建一个数据源。而不是在报表服务器资源管理器中。
数据源可以是共享的,也可以是特定的,同时,也可以定义多个数据源。
指定数据源的方式:(建议非特殊情况采用共享数据源,易于维护)
· 作为存储在报表内的嵌入信息(这称为“报表特定数据源”)。
· 作为共享数据源,该数据源是在报表设计器中单独定义的,在报表发布时将作为单独项保存在报表服务器上。
· 作为用于在运行时选择数据源的表达式。
数据源的添加与设置
2、数据集
通俗地讲,数据集就是为报表的最终展现提取所需的数据。数据集可以是一段SQL,也可以是存储过程,数据集的具体内容依赖于所选择的数据源(即:选择不同的类型的数据源,对应的数据集中的SQL或存储过程也是与数据源所指定的类型相匹配)。
a) 关系数据库可以使用 Transact-SQL 查询或存储过程
b) 多维数据库可以使用多维查询或数据挖掘查询
c) XML 文档或 Web 服务可以指定带有或不带有命名空间的查询
d) 报表模型可以使用报表模型元数据查询
另外,Reproting Service报表中,同一个报表可以支持一个或多个数据集,这对于复杂的需要从不同的数据源进行数据提取相当简便。
同一报表指定多个数据集(SQL)
使用存储过程的数据集
注意:使用存储过程作为数据集形式时,对于存储过程中的参数,如何进行传值需要进行单独设置。即在数据集的参数选项中,添加存储过程所需的参数列表,并指定值即可(上图左边红色区域),同时要保证参数名称与存储过程中的名称完全一致。
错误写法:Exec usp_rpt_DayReportData ‘参数1’, 参数2’,’ 参数3’
如果命令类型不指定为 StoredProcedure,而是指定为Text,当用的是存储过程时,也可以写成 Exec usp_rpt_DayReportData (不建议这样做)
l 表格报表
表格报表是最常用一种数据展现形式,展示的是一个二维表,最大的特点是列是已明确的,行是不固定的。表格报表初始外观如下(注意红色标记地方):
表格报表初始外观图
表格报表的数据分组:(详见下图)
一个报表中,可以存在多个分组,各分组之间按从上到下的顺序对数据进行处理,从某种意义上讲,可以理解为是存在着一种层级关系,即:先按1标记组(下图中行前有1 标记的行,后面类同)进行分组,再按2标记组进行分组,最后按3标记组进行分组。
表格报表设计器中详细设置图示
说明:
1、对于一个分组在存在多行的情况,可通过选中组标记(分组行的最前端有数字 的格 上),右键,选择插入行即可(上图橙色圈的地方)。
2、对于数据合计,可以对具体的分组或整个报表添加(上图绿、橙、黄背景色的行)。
3、对于数据分组可以设置更多相关的信息,如分组字段、数据过滤、可见性等等(见下图)
组属性设置图示
以下其他类型数据报表中的分组及合计与表格报表类似,以下将只介绍其他数据报表的自身特性及主要设计步骤。
l 层级报表设计
层级报表也称作下钻报表,交互性和可读性都比较好,允许用户展开或折叠分组的部分来浏览更多的细节内容。奇特之处是行部分简单地基于切换项来实现显示或隐藏。
层级报表展示效果非常好,报表界面十分简洁,导出Excel后还可以保留展示的效果和功能。
设计器中效果图
导出Excel效果图
步骤要点:编辑分组2,选择可见性标签,勾选“可由其他关联报表项确定可见性”,选择分组1中的对象,由textbox4控制显示即可
l 钻取报表设计
钻取报表的最大特性是通过传递参数值到目标报表中,可以单击当前报表中的链接对其进行访问的一种报表。单击带有钻取操作的文本框,即可打开钻取报表。如果钻取报表有参数,则需要为每个报表参数传递参数值。链接源可以使用文本框或图像实现。
步骤要点:
向报表添加报表钻取操作
1、右键单击文本框,并选择“属性”。将打开“文本框属性”对话框。
2、单击“导航”选项卡。
3、在“超链接”部分,单击“跳至报表”。
4、在文本框的下拉列表中选择 目标报表
5、单击“参数”按钮。将打开“参数”对话框。
6、在显示了为钻取报表定义的参数的“参数名称”下拉列表中,选择 具体的参数。
7、单击“参数值”文本框。在此下拉列表中,选择 具体的字段。
8、单击“确定”。
下一步将更改钻取链接的文本类型和颜色。
9、单击“字体”选项卡。
10、在“效果”下拉列表中,选择“下划线”。
11、单击“确定”。
12、在该文本框的“属性”窗口中,单击“颜色”属性文本框。在此下拉列表中,选择“表达式”。“表达式编辑器”将打开。
13、用以下表达式替换默认文本“黑色”。
=Parameters!MyFontColor.Value
添加的文本框现在具有带下划线的文本,并且将按照参数 MyFontColor 中设置的颜色显示。这种直观的表示方式有助于报表读者了解存在指向另一个报表的活动链接。 在可以预览报表之前,您必须按照下一步骤定义 MyFontColor 参数。
创建用于字体颜色的内部报表参数 (这个主要是为了管理方便)
1、在“布局”视图的“报表”菜单上,单击“报表参数”。此时将打开“报表参数”对话框。
2、单击“添加”。将创建一个具有属性默认设置的新参数。
3、在“属性”部分的“名称”属性中,键入 MyFontColor。
4、验证“数据类型”是否为 String。
5、选中“隐藏”复选框。“提示”属性已禁用。
6、验证“默认值”是否为“无查询”。
7、在“默认值”中,选中“无查询”,并键入值 MediumBlue 或任何其他有效的字体颜色。
8、预览报表。
l 书签和链接
1、书签
书签是报表中的广本框或图像,可以用作链接浏览。允许在同一张报表内浏览,相当方便。需要设置报表项的Bookmark属性(每个报表项此属性唯一值),设置目标项书签后,通过跳转到书签功能,来选择目标书签。
2、链接
跳转到URL可以实现浏览任何局域网或WWW环境里的报表服务器、文件、文件夹和应用程序中的报表或文档内容。可用于灵活的、强大的交互式的浏览。
提示:对于URL的安全性,报表服务器不会尝试任验收证,需要在传递前进行验证。
l 矩阵报表
矩阵也就是交叉表或枢轴表。正如表的行产生于隐藏的结果集一样,矩阵的列做同样的事情。矩阵应该至少有两个带有交叉的聚合值的组。一个组创建行,一个组创建列。
设计视图效果
实际效果描述
设计要点:
1、数据显示基本设置
设置对应行、列各分组的分组字段,以及具体的静态字段即可!
各字段设置描述说明
2、矩阵的下钻设置
选中具体的组―》编辑组-》可见性,设置“可由其他关联报表项确定可见性”属性来设置下钻操作所依赖的具体报表项即可。(见下图)
下钻设置示图
3、矩阵的分组设置
选中具体要进行合计的行分组字段,右键选中小计即可自动增加分组合计行。
注意:行合计默认排列于分组的最下方,可以通过单击行合计单元格右上角的小三角符号,来设置行合计的属性Position,来确定行合计是位于分组的上方或下方。
对于合计列的设置同行类似。
l 其他图表报表(后续使用之后陆续补充)
l 报表技巧
1、除数为0的处理方式。
当进行除的计算时,需要考虑除数可能为0的情况,即黄色部分;另外,还应该在被除数上进行再次处理,即灰色部分。否则当出现0值时,对应文本框会显示“错误号”字样。
=IIf(Sum(Fields!tpmj.Value)=0,0,Sum(Fields!tpje.Value)/IIf(Sum(Fields!tpmj.Value)=0,1,Sum(Fields!tpmj.Value)))
2、外观边框预览与导出Excel之间的差别处理。
在制作报表时,默认报表项的边框为1pt,在预览时各报表项线条显示是细线条,但在导出Excel后,线条却变成了粗线条(与预览时的外观不一致)。
产生原因:因每个报表项(数据表格时,每个单元格可理解为一个文本框,图像除外)为一个文本框,每相邻的文本框间都会存在相邻边相互紧贴的关系,同于每个边为1pt,所以导出到Excel后,单元格的边框导致显示比预览的粗。
解决办法:
(1)可手动修改默认设置,将每个单元格的边框样式,即只设每个单元格的左、上边框,或者右、下边框(整个表格的四条外边框同理对应设置),这样导出即可实现细线条。
(不推荐此法,设置相当麻烦,而且在预览展示上会出现部分单元格线条无法显示,而导出Excel却正常)
(2)比较理想简便方法
A, 首先将整个表格设置成无边框(图1)
图1
B, 其次以单元格方式,选中所有单元格,将边框样式设置为0.5pt或0.25pt(图2)。
本步骤必须通过属性面板设置(通过上方工具栏将会无效)
图2
C, 最后如有需要,可适当调整需要合并的单元格的边框样式(图3)。
(对于横向合并的单元格,可直接合并,边框不需要做处理,而对于纵向合并的单元格,Reporting Service不支持直接合并,只能通过将纵向相邻单元格的边框设置无none来实现,在导出Excel中,也会保持所设置的样式)
3、创建用于字体颜色的内部报表参数 (这个主要是为了管理方便)。
前面钻取报表中已进行过详细步骤设置的介绍(此处略)
4、数据格式化。
数据格式化:标准格式化、显示格式化、条件格式化。报表中的格式化是基于.Net Framework中的格式化机制,可以使用正则表达式格式化(功能相当强大,从简单到极复杂都能实现,关于正则可以参见MSDN库中介绍)
标准格式化:使用标准的、简单的字符串来指定数字或日期的格式化选项(依赖于所使用计算机的区域文化设置格式)
显示格式化:不依赖于持定计算机的区域文化设置,格式化效果保持不变。
(具体格式符可参见联机帮助介绍,推荐采用此种方式进行格式化)
条件格式化:基于报表中其他字段或条件相关的表达式来确定值的显示格式。
(例:Switch(Fields!MyLocal.Value=”DE”,”de-DE”,Fields!MyLocal.Value=”UK”,”en-GB”)
对于整数以含有分隔符方式来显示时,格式化符号没有默认的,只需要手动进行设置其显示格式为 #,### 即可!(如下图),而对于其他显示格式,默认格式符选择可满足日常绝大部分要求。
注意:在以“%”百分符显示数据时,Reporting Service会自动将相应数据进行换算,无需手动进行 乘以100的处理。
5、复制说明。
报表支持整行或整列(列中不存在合并列)复制,同时包括行或列的样式,各报表项值的表达式,会同时复制(报表项的默认名称会自动变化,使其保持唯一)。
三、 订阅报表
l 概述
订阅是一种持续存在的请求,它在特定的时间或为响应某个事件而传递报表,然后以您定义的方式提交该报表。订阅提供了一种可替代按需运行报表的方法。按需运行报表要求您在每次查看报表时都执行特定的操作。相比之下,使用订阅则可以自动传递最新的报表。
目前我们仅开发了”标准订阅”和“数据驱动订阅”,针对”文件共享传递”不支持。
l 标准订阅(CreateSubscription)
标准订阅由各个用户创建和管理。标准订阅由静态值组成,这些值在订阅处理期间不能改变。每个标准订阅都有一组报表显示选项、传递选项和报表参数。
l 数据驱动订阅(CreateDataDrivenSubscription)
数据驱动订阅是动态的,具体体现在表示形式、传递和参数值是在运行时从数据源中检索的。数据驱动订阅专门用于下列情况:
1、向大型收件人池分发报表,该池的成员身份可能随着分发的不同而有所变化。例如,向当前的所有客户分发月报表。
2、根据预定义的条件向特定的收件人组分发报表。例如,向某个组织中的前十位销售经理分发销售业绩报表。
若要使用数据驱动订阅,必须具备生成查询的专业知识并了解如何使用参数。通常,由报表服务器管理员创建和管理这些订阅。
四、 部署报表
l 工具部署
l 脚本部署
rs -i D:\二次开发组\rsUtilities\DeployReports\DeployReports.rss -s http://localhost:8016/reportserver -v strAimFolder="数据源" -v strAimReportsFolder="日报" -v oOverWriteDataSource="true" -v strDataSourceName="vankeRptDS" -v strServerName="10.5.1.3\SQL2005" -v strDataBaseName="ERP25_vanke_20071229" -v strDataSourceUserName="sa" -v strDataSourcePassword="myJerry&2008%Pt$rv!" -v strReportsFilePath="D:\ttt"
Dim mDefinition As [Byte]() = Nothing
Dim mWarnings As Warning() = Nothing
Dim strParentPath As String = "/" + strAimFolder
Dim strParentReportsPath As String = "/" + strAimReportsFolder
Sub Main()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
Dim items As CatalogItem() = Nothing
Dim i As Integer
Dim oAimFolderExists As Boolean = False
Dim oAimReportsFolderExists As Boolean = False
Dim oDataSourceExists As Boolean = False
Try
'列出ReportServer根目录下所有项,判断目标目录是否存在
items = rs.ListChildren("/", True)
For i = 0 To items.Length - 1
'是文件夹类型
If items(i).Name.ToUpper = strAimFolder.ToUpper And items(i).Type = ItemTypeEnum.Folder Then
oAimFolderExists = True
End If
If items(i).Name.ToUpper = strAimReportsFolder.ToUpper And items(i).Type = ItemTypeEnum.Folder Then
oAimReportsFolderExists = True
End If
'是数据源类型
If items(i).Name.ToUpper = strAimFolder.ToUpper And items(i).Type = ItemTypeEnum.DataSource Then
oDataSourceExists = True
End If
Next
Catch ex As Exception
Console.WriteLine(ex.Message.ToString)
End Try
'创建数据源目标目录
If oAimFolderExists Then
Console.WriteLine("目录" & strAimFolder & " 已经存在!")
Else
Try
rs.CreateFolder(strAimFolder, "/", Nothing)
Catch ex As Exception
Console.WriteLine(ex.Message.ToString)
End Try
End If
'创建报表目标目录
If oAimReportsFolderExists Then
Console.WriteLine("目录" & strAimReportsFolder & " 已经存在!")
Else
Try
rs.CreateFolder(strAimReportsFolder, "/", Nothing)
Catch ex As Exception
Console.WriteLine(ex.Message.ToString)
End Try
End If
'创建数据源
If oAimFolderExists And oDataSourceExists And oOverWriteDataSource = False Then
Console.WriteLine("数据源已经存在!")
Else
CreateDataSource()
End If
'发布报表
Try
Dim oDirectoryInfo As DirectoryInfo
If strReportsFilePath = "" Then
oDirectoryInfo = New DirectoryInfo(".")
Else
oDirectoryInfo = New DirectoryInfo(strReportsFilePath)
End If
Dim files As FileInfo() = oDirectoryInfo.GetFiles("*.rdl")
Console.WriteLine("总共报表数量: {0}", files.Length)
Dim fiNext As FileInfo
'循环发布报表
For Each fiNext In files
DeployReport(Microsoft.VisualBasic.Left(fiNext.Name, fiNext.Name.Length - 4))
Next
'将报表引用已创建的数据源
Dim reference As New DataSourceReference
reference.Reference = strParentPath & "/" & strDataSourceName
Dim subItems As CatalogItem() = rs.ListChildren(strParentReportsPath, False)
For Each item As CatalogItem In subItems
If item.Type = ItemTypeEnum.Report Then
Dim dataSources As DataSource() = rs.GetItemDataSources(item.Path)
For Each datasource As DataSource In dataSources
datasource.Item = reference
Next
rs.SetItemDataSources(item.Path, dataSources)
End If
Next
Catch ex As Exception
Console.WriteLine(ex.Message.ToString)
End Try
End Sub
Public Sub CreateDataSource()
'Dim folderPath As String = "/" & strAimFolder
Dim csrdb As New DataSourceDefinition
csrdb.ConnectString = "Initial Catalog=" & strDataBaseName & ";Data Source=" & strServerName
csrdb.Extension = "SQL"
csrdb.CredentialRetrieval = CredentialRetrievalEnum.Store
csrdb.Enabled = True
csrdb.EnabledSpecified = True
csrdb.ImpersonateUserSpecified = False
csrdb.UserName = strDataSourceUserName
csrdb.Password = strDataSourcePassword
'csrdb.CredentialRetrieval = CredentialRetrievalEnum.Integrated
Try
rs.CreateDataSource(strDataSourceName, strParentPath, True, csrdb, Nothing)
Catch ex As Exception
Console.WriteLine(ex.Message.ToString)
End Try
End Sub
Public Sub DeployReport(ByVal strReportName As String)
Try
Dim stream As FileStream = File.OpenRead(strReportsFilePath & "\" & strReportName & ".rdl")
mDefinition = New [Byte](stream.Length) {}
stream.Read(mDefinition, 0, CInt(stream.Length))
stream.Close()
Catch ex As IOException
Console.WriteLine(ex.Message.ToString)
End Try
Try
mWarnings = rs.CreateReport(strReportName, strParentReportsPath, True, mDefinition, Nothing)
If Not (mWarnings Is Nothing) Then
Dim warning As Warning
For Each warning In mWarnings
Console.WriteLine(warning.Message)
Next warning
Else
'SetReportDataSourceRef(strReportName)
Console.WriteLine("发布报表:{0} 成功!", strReportName)
End If
Catch ex As Exception
Console.WriteLine(ex.Message.ToString)
End Try
End Sub
展开阅读全文