报表服务中的编程
Reporting Services 提供了良好的应用程序和管理工具,使得您无需编写一行代码就可以创建、查看和管理报表。您可以将 Reporting Services 作为一种现成的报表解决方案,方便地处理现有 SQL Server 数据库、Analysis Server 数据库和其他数据源类型。但是,如果您希望把 Reporting Services 集成到自定义的门户中,或者是想提供给用户自定义的管理工具,那么您就需要编写一些程序。
Reporting Service提供了Web Service接口,并且在报表中也可以嵌入 VB .Net 代码,也可以引用 .Net 程序集。
对报表服务编程,您可以做到:1、将报表服务集成到自定义的应用程序;2、生成自定义设计和报表管理工具;3、扩展 Reporting Services 平台。
使用 Visual Studio .Net访问 Reporting Services Web Service
报表服务提供的是 Web Service接口,在Visual Studio .Net中可以很方便的建立 Web 引用来访问 Web Service接口。 Visual Studio .Net 中的 Web Service found 是客户端查找 Web Service 并获取其服务描述的过程。Visual Studio .Net 中的 Web Service found 过程涉及询问网站是否遵循预定算法。此过程的目的是查找服务描述,它是使用 Web Services 描述语言 (WSDL) 的一个 XML 文档。
服务描述说明了哪些服务可用,以及如何与这些服务进行交互。没有服务描述,就不可能通过编程方式与 Web Service 进行交互。
在Visual Studio .Net 中添加 Web 引用
- 在“项目”菜单上,单击“添加 Web 引用”。
在“添加 Web 引用”对话框的“URL”框中,键入可获取 Reporting Services Web Service 的服务描述的 URL,如 http://localhost/reportserver/reportservice.asmx?wsdl。然后单击“转到”按钮即可检索有关 Web Service 的信息。
如果本地计算机上存在 Reporting Services Web Service,则单击浏览器窗格中的“本地计算机上的 Web Service”链接。然后从提供的列表中单击 ReportService Web Service 的链接。
- 在“Web 引用名”框中,将 Web 引用重命名为 ReportingServices,这是将用于此 Web 引用的命名空间。
- 单击“添加引用”可添加目标 Web Service 的 Web 引用。
Visual Studio 将下载服务描述,并生成一个代理类,以在您的应用程序和 Reporting Services Web Service 之间进行连接。
有关访问 Web Services的更多信息,请参阅 MSDN 中的文章“演练:使用 Visual Basic 或 Visual C# 访问 XML Web services”。
如果希望在安装时配置 Web Service 的URL,请参阅 MSDN 中的文章“演练:安装期间重定向应用程序以面向另一个 XML Web services”。
报表服务的 Web Service 认证
Web Service 认证可以使用 Windows 认证和基本认证。任何客户端调用 Web Service 的方法前,都必须经过认证。在 Visual Studio .Net中,认证是非常简单易行的。
Windows 认证Visual Basic 代码示例
Dim rs As New ReportingService()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials
基本认证 Visual Basic 代码示例
Dim rs As New ReportingService()
rs.Credentials = New System.Net.NetworkCredential("username", "password", "domain")
从报表服务中获取报表的数据
ReportingService 类的 Render 方法可以提供报表按照指定格式渲染后的结果,以便于将报表服务集成到自定义的应用程序,用自定义的控件或者其它方式向最终用户提供报表。
Render 方法的参数很多,重要的有报表的完整路径、渲染格式、报表参数。
渲染格式可以有HTML3.2, HTML4.0, HTML5, XML, CSV, PDF 和IMAGE,报表参数是一个数组。
Render 方法的返回值是一个字节数组。
Render 方法 Visual Basic 示例代码
Imports System
Imports System.IO
Imports System.Web.Services.Protocols
Class Sample
Public Shared Sub Main ()
Dim rs As New ReportingService()
rs.Credentials = System.Net.CredentialCache.DefaultCredentials ‘基本认证
Dim result As Byte() = Nothing
Dim reportPath As String = "/SampleReports/Employee Sales Summary"
Dim format As String = "MHTML"
Dim historyID As String = Nothing
Dim devInfo As String = "<DeviceInfo><Toolbar>False</Toolbar></DeviceInfo>"
' 报表参数
Dim parameters(2) As ParameterValue
parameters(0) = New ParameterValue()
parameters(0).Name = "EmpID"
parameters(0).Value = "38"
parameters(1) = New ParameterValue()
parameters(1).Name = "ReportMonth"
parameters(1).Value = "6" ' June
parameters(2) = New ParameterValue()
parameters(2).Name = "ReportYear"
parameters(2).Value = "2004"
Dim credentials As DataSourceCredentials() = Nothing
Dim showHideToggle As String = Nothing
Dim encoding As String
Dim mimeType As String
Dim warnings As Warning() = Nothing
Dim reportHistoryParameters As ParameterValue() = Nothing
Dim streamIDs As String() = Nothing
Dim sh As New SessionHeader()
rs.SessionHeaderValue = sh
Try
result = rs.Render(reportPath, format, historyID, devInfo, parameters, credentials, showHideToggle, encoding, mimeType, reportHistoryParameters, warnings, streamIDs)
sh.SessionId = rs.SessionHeaderValue.SessionId
Catch e As SoapException
Console.WriteLine(e.Detail.OuterXml)
End Try
' 保存为 MHTML 文件,也可以直接 Response 给客户端
Try
Dim stream As FileStream = File.Create("report.mhtml", result.Length)
stream.Write(result, 0, result.Length)
stream.Close()
Catch e As Exception
Console.WriteLine(e.Message)
End Try
End Sub ' Main
End Class 'Sample
有关 Render 方法的更多信息,请参阅 Reporting Services 联机丛书中的文章“ReportingService.Render Method”
查看、管理报表服务器的内容
将报表服务集成到自定义的应用程序,查看和管理报表服务器的目录、报表、数据源是必不可少的。
常用的方法有:
l CreateFolder 创建目录
l ListChildren 列出目录的内容
l DeleteItem 删除元素
l MoveItem 移动元素
l CreateReport 创建报表
l GetReportDefinition 获取报表定义内容
l CreateResource 创建资源
l GetResourceContents 获取资源内容
l CreateDataSource 创建数据源
l GetDataSourceContents 获取数据源内容
l GetProperties 获取元素属性
l SetProperties 设置元素属性
l CreateBatch 创建批处理以便在一个事务中执行多条命令
l ExecuteBatch 执行批处理
关于这些方法的示例,请参阅 RSExplorer 示例 Windows 应用程序。关于这些方法的详细信息,请参阅 Reporting Services 联机丛书。
用于安装和作业的脚本程序
在一个项目中,安装部署是很重要的一环。 CreateFolder、CreateReport、CreateResource、CreateDataSource方法固然可以在报表服务器上创建报表所需的全部元素,但是 Reporting Services 提供的 rs.exe 实用工具,可以更方便的做到这一点。
rs.exe 实用工具是一个脚本宿主,可用来处理您在输入文件中提供的脚本。您可以通过定义脚本来管理报表服务器,将报表服务器数据库内容复制到其他数据库,以及发布报表等。必须采用 Visual Basic 代码来编写脚本,并使用 .rss 文件扩展名将其存储为 Unicode 文本文件或 UTF-8 文本文件。
Reporting Services 安装程序或单独的示例安装程序可以将示例脚本文件安装到硬盘上。如果示例脚本安装在默认目录中,请查看C:/Program Files/Microsoft SQL Server/MSSQL/Reporting Services/Samples/Scripts/ 目录中的 PublishSampleReports.rss 示例脚本。该脚本可以在指定的报表服务器上运行 Web Service 操作。创建一个文件夹(您可以使用 –v 开关将其指定为命令提示变量),然后将 Reporting Services 所带的示例报表发布到报表服务器。
只需要修改该脚本中的filePath变量、数据源信息和报表文件名,即可用于发布自己的报表文件。
在命令行下,调用rs -i PublishSampleReports.rss -s http://myserver/reportserver -v parentFolder="Sample Reports",即可发布报表。
在报表中嵌入表达式
Reporting Services 支持以 Visual Basic 编写的表达式。您可以使用这些表达式来计算报表项的值,或者计算样式和格式设置属性的值以及其他报表项属性的值。
例如,以下表达式在文本框中显示产品名称:
=Fields!Product.Value
以下表达式(用于文本框的 Color 属性中)在“Cost”字段的值大于“Revenue”字段的值时,以红色显示“Cost”字段的值;在“Cost”字段的值小于等于“Revenue”字段的值时,以黑色显示“Cost”字段的值。
=IIf(Fields!Cost.Value > Fields!Revenue.Value, "Red", "Black")
以下表达式根据用户的输入来决定数据集内包含的查询语句。
="SELECT * FROM vProductProfitability WHERE (Year = 2003) AND (MonthNumberOfYear IN (" + Parameters!Month.Value + "))"
最基本的表达式是在文本框中显示字段值的表达式。这种类型的表达式称作字段表达式。要将数据库字段链接到报表项,表达式必须包括 Fields 集合、字段名称和 Value 属性。
表达式也可以是基于字段或其他报表项的判定函数或格式设置的长表达式。示例如下:
l 以下表达式连接 FirstName 字段和 LastName 字段。
=Fields!FirstName.Value & " " & Fields!LastName.Value
l 以下表达式是计算产品的销售额在整个子类的百分比
=RunningValue(Fields!SalesAmount.Value,Sum,“table1_SubCategory”)/ReportItems!SalesAmount_SubCategory.Value
关于基本表达式的更多信息,请参阅 Reporting Services 联机丛书中的“使用全局集合”。
报表服务可以对从数据库中获取的数据作分组、筛选和聚合。可以在表达式中使用标准的聚合函数,如Avg, Sum, Count等。也可以使用运行聚合函数:
RowNumber 返回对指定范围中所有行的运行计数值。
RunningValue 使用指定的函数来返回指定表达式的运行聚合值。
在报表中嵌入 Visual Basic 代码
内置函数的功能毕竟有限,但是报表中可以包含对 Microsoft.VisualBasic 命名空间、System.Convert 命名空间和 System.Math 命名空间中的类的引用。如果您使用其他系统命名空间的类或函数,则必须使用完整命名空间(如 System.Collections.ArrayList)。这样就很大限度的提高了报表表达式的功能。
如果报表函数和系统类尚不能满足需求,那么您可以编写自定义代码,用在报表的表达式中。为此可采用两种方法:在报表中嵌入代码和引用自定义程序集中的方法。对于复杂的函数,或在一个报表中多次使用的函数,可使用嵌入代码。
在“报表”菜单上,单击“报表属性”。 然后就可以在“代码”选项卡的“自定义代码”中,键入代码。代码块可以包含多个方法。嵌入代码中的方法必须采用 Visual Basic .NET 编写,并且必须是基于实例的方法。
嵌入代码中的方法可通过全局定义的 Code 成员使用。您可以通过引用 Code 成员和方法名称来访问这些方法。以下示例调用了 ToUSD 方法,该方法将 StandardCost 字段值转换为美元值:
=Code.ToUSD(Fields!StandardCost.Value)
在报表中使用自定义程序集
为了在一个位置维护代码或在多个报表间共享代码,可以使用代码程序集。在“报表”菜单上,单击“报表属性”。在“引用”选项卡上,执行以下操作:
在“引用”中,单击添加 (...) 按钮,然后在“添加引用”对话框中选择或浏览查找程序集。
在“类”中,键入类的名称并提供在报表中使用的实例名。
要引用表达式中的自定义代码,您必须调用自定义程序集中某个类的成员。调用方式取决于该方法是静态方法还是基于实例的方法。自定义程序集中的静态方法可在报表内全局使用。您可以通过命名空间、类和方法名称来访问表达式中的静态方法。以下示例调用了 ToGBP 方法,该方法将 StandardCost 字段的值从美元转换为英镑:
=CurrencyConversion.DollarCurrencyConversion.ToGBP(Fields!StandardCost.Value)
基于实例的方法可通过全局定义的 Code 成员使用。您可以通过先引用 Code 成员,再引用实例和方法名称来访问这些方法。以下示例调用了实例方法 ToEUR,该方法将 StandardCost 字段的值从美元转换为欧元:
=Code.m_myDollarCoversion.ToEUR(Fields!StandardCost.Value)
小结
Reporting Service 提供了丰富的编程接口,使得Reporting Service很容易和与SharePoint, Office应用,浏览器与其它您所熟悉的工具集成,而且很容易做到可扩展的,可管理的与可以嵌入的服务器体系结构。它从第一天起就被设计为一个 .NET Web Service,所有的服务器组件都是可扩展的、完全可嵌入的,而且报表定义语言也是公开的, 可扩展的,可以用自定义的工具来设计。
这些设计,提高了开发人员的效率,节省了大量的IT资源,而且便于最终用户作更多的控制,实现最终用户的个性化。