服务器 频道

用SQL Server从应用程序生成用户友好的报表

  将报表嵌入到 Web 应用程序中
  如果在用户查看报表时,不再使用弹出新的浏览器窗口,您可能希望实际地将报表嵌入到自己的 Web 页中。最简单的方法就是在 Web 页上使用 IFRAME,并使用我介绍过的基于 URL 的相同技术来设置 SRC 属性。如果您使用这种技术,切记要将 rc:LinkTarget 参数设置为 IFRAME 的名称,以避免当用户单击报表的链接时在框架外弹出任意一个框架。
  
  如果您以前设计过 ASP.NET 的服务器控件,您可能会认为 IFRAME 技术并不十分完美,因为它要求 Web 开发人员理解 Reporting Services 的 URL 参数语法才能构建适当的 SRC 字符串。构建一个封装有所有参数并使开发人员可以简单地设置诸如 ReportPath 和 Zoom 之类的参数的服务器控件难道不是一个更好的想法吗?
  
  Reporting Services 非常方便地附带了名为 ReportViewer 的示例(安装到 \Reporting Services\Samples\Applications\ReportViewer 目录),它可以实现这个想法。该控件封装了 IFRAME 和 URL 访问参数逻辑,并提供了一个更简单的用于将报表嵌入到应用程序中的方法。要使用该控件,请打开并构建 ReportViewer 解决方案,然后通过浏览到 ReportViewer 解决方案的 bin 目录中的 ReportViewer.dll,切换到您的 Web 应用程序并将该控件添加到工具箱中。
  您可以使用该控件将嵌入报表添加到仪表板应用程序中。将控件添加到 Web 页,设置高度和宽度属性并添加以下代码以便在页面中显示一个报表:
  
  Private Sub Page_Load(ByVal sender As System.Object, ByVal _
  e As System.EventArgs) Handles MyBase.Load
  If Not IsPostBack Then
  ReportViewer1.ServerUrl = "http://MyServer/ReportServer"
  ReportViewer1.ReportPath = "/SampleReports/Sales Order" & _
  "Detail&SalesOrderNumber=so8153"
  ReportViewer1.Toolbar = ReportViewer.multiState.False
  ReportViewer1.Zoom = "75"
  End If
  End Sub
  
  保证报表的安全
  Reporting Services 安全性使用熟悉的基于角色的模型。用户和组可以分配给诸如 System Administrator 或 Browser 之类的角色,特定角色的所有成员都将允许执行为该角色定义的操作。
  
  报表管理器用于执行与安全性相关的任务,例如,分配用户角色或修改项(例如,报表)的权限等。默认情况下,Administrators Windows 组同时是所有文件夹的 System Administrator 和 Content Manager 的成员。为了扩展报表访问到其他用户,用户帐户或组必须添加到诸如 Browser 的角色中。这通常是在文件夹级设置的,同时也可以针对单独的报表进行重写。
  
  除了保护对报表的访问外,管理员还必须决定如何将报表连接到源数据库。可以配置数据源使用集成的安全性,以便可以使用当前的用户帐户进行数据库连接。此外,还可以定义 Windows? 或 SQL Server 用户名和密码,并将其安全地存储在报表服务器数据库中。这种方法要求报表运行在无用户交互(例如,订阅所涉及的交互)的情况下。
  
  使用 Reporting Services Web 服务
  到目前为止,我一直使用的 URL 访问方法提供了一种快速便捷的方式来查看报表并指定参数,但是它不能提供对所有可用的报表管理功能的访问。Reporting Services 还附带了一个具有丰富功能的 API,为您提供通过 Web 服务对高级功能的访问。例如,该 Web 服务包括用于管理报表的数据源信息的方法或者枚举某个文件夹中所有项的方法。
  
  我将使用 Web 服务将报表的动态列表添加到仪表板应用程序中。为此,您将需要使用 Add Web Reference 将一个 Web 服务引用添加到应用程序中。指定到 Web 服务的路径,如下所示:
  
  http://MyServer/ReportServer/ReportService.asmx
  
  在添加引用后,您可以创建 ReportingService 代理类的一个实例,并调用该服务上的一个方法,就像我在此处完成的一样:
  
  Private Sub LoadSampleReports()
  Dim rs As New ReportingService
  rs.Credentials = System.Net.CredentialCache.DefaultCredentials
  
  Dim item As CatalogItem
  For Each item In rs.ListChildren("/SampleReports", False)
  If item.Type = ItemTypeEnum.Report Then
  DropDownList1.Items.Add(New ListItem(item.Name, item.Path))
  End If
  Next
  End Sub
  
  如果您正在一个 Intranet 环境中部署应用程序,您要通过将 添加到应用程序的 web.config 文件中来启用模拟。您还要将客户端登录凭据传递到该服务,如前面的示例所示。
  
  ListChildren 方法返回 CatalogItem 对象的数组,该数组表示用户有权查看的项,包括报表、文件夹和数据源。Path 属性提供了到项的唯一路径,例如,/SampleReports/Sales Order Detail,Type 属性使您可以区别报表和其他类型的项。
  
  既然我已经将报表名称加载到了下拉列表中,我必须决定如何在仪表板应用程序内显示报表。我决定扩展我早期编写的 ReportViewer 代码并且只要用户选择某个报表并点击“Go”按钮就更改 ReportPath 属性。您还可以使用 IFRAME 并将 SRC 设置为适当的 URL(并为报表的名称加上前缀“http://MyServer/ReportServer?”)。
  
  除了报表管理功能外,Web 服务提供的其他主要功能就是报表呈现。大多数应用程序(包括报表管理器应用程序)都使用 Web 服务功能来列出报表或更改设置,并使用我介绍过的 URL 方法来显示报表。但是,如果您想要完全控制报表内容在应用程序中处理的方式,可以使用 ReportingService 类的 Render 方法。该方法返回一个可以在以后保存到输出文件的字节数组;取决于请求的格式,输出文件可以是图形文件或 Excel 电子表格。如果您要以 HTML 格式呈现报表,可能会更加复杂一些,因为您将需要使用 RenderStream 方法来分别呈现图像或其他资源。
  
  尽管本文的讨论重点在于 Web 应用程序,您也可以使用相同的技术将报表生成功能添加到基于 Windows 的应用程序中。最简单的方法仍是使用 URL 访问,或者从应用程序启动用户的浏览器,或者包括 Microsoft WebBrowser ActiveX? 控件并使用 Navigate 方法来加载适当的 URL。当您想要更好地控制某些操作(例如,在图片框中显示结果或将文件直接保存到磁盘的操作)时,Web 服务的 Render 方法是一个很好的备选方法。
  
  信息工作者通常必须处理两种类型的报表:当他们需要收集信息时他们想要获得的类型以及每周都出现在他们桌面上或他们电子邮件中的类型。至此,我已重点阐述了用户获取他们自己的报表的过程,但 Reporting Services 还包括一种非常强大的称为订阅的功能,它使您可以将报表“推”给客户。
  
  Reporting Services 订阅功能让用户按照计划接收报表。报表通常会通过电子邮件发送到用户,但 Reporting Services 同时还让您将报表生成到一个文件共享甚至可以编写自己的提交扩展。这使您可以轻松地完成分发任务,例如,向每个销售代表以电子邮件方式发送每周销售统计报表,或者设置每月财政报表在每个月的最后一天运行,并将其作为一个 PDF 写出到公司文件共享。
  
  在设置订阅前,您需要考虑报表将如何连接到数据库以检索其数据。因此,订阅的报表将不会由用户直接执行,您无法为数据源使用集成的安全性,但在报表运行时必须指定要使用的用户名和密码。如果您试图为使用集成安全性的报表设置订阅,Reporting Services 将会返回一个错误。
  
  要更改示例报表的数据源,请打开“Report Manager | Sample Reports”,然后单击 AdventureWorks 数据源。该数据源由所有示例报表共享,因此对它所做的任何更改将会影响所有报表。选中“Credentials stored securely in the report server”选项,指定一个具有访问 AdventureWorks 数据库权限的帐户的有效域用户名和密码,选中“Use as Windows credentials when connecting to the data source option”,然后单击“Apply”按钮。请注意,这种更改意味着指定的帐户将始终用于连接该数据库,不管实际上是哪个用户运行该报表。
  
  因此,您已经准备好深入研究并查看提供对订阅访问的 Web 服务 API。使用 Web 服务的这一部分比使用 List 或 Render 方法要多一些挑战,主要原因在于可用选项的数量。我将要使用的方法是 CreateSubscription,它也属于 ReportingService 类。有关该方法的参数的详细说明,请参阅 ReportingService 类,但最基本的是您需要指定要订阅的报表、生成计划(例如,每周一早晨或每月的最后一个周五)、电子邮件选项(包括电子邮件地址)以及所有报表参数值。
  
  我已经将名为 EmailSubscriber 的实用工具类包括在本文的示例代码中,该示例代码摘要了某些复杂的内容。仪表板应用程序使用该类允许用户指定他们的电子邮件地址并使 Employee Sales Summary 报表通过电子邮件每周一发送给他们。在产品应用程序中,您可以调整每个用户的报表,例如,当您创建订阅时,可以根据员工的 Windows 用户帐户检索他们的员工 ID,然后适当地设置报表参数。
  
  如果您不希望等到下周一才测试您的订阅,它有助于您了解有关 Reporting Services 如何处理订阅计划的更多信息。当您创建一个订阅时,Reporting Services 会创建一个根据要求的计划执行的 SQL Server 代理作业。您可以通过打开 Enterprise Manager,展开 Management、SQL Server Agent 和 Jobs 文件夹来查看这个作业。该订阅作业将具有“Report Server”类别,并以由 Reporting Services 用来跟踪该作业的 GUID 命名。右键单击该作业并选择 Start Job,如果您已正确地设置了您报表的方方面面,您的报表将会发送电子邮件给您。
0
相关文章