Services生成报表

骨干提醒:灵活的表格功能是大多数事务应用程序的一个渴求,这么些报表功用在合龙到
Web 应用程序中事后用场越发广阔

正文转自:

灵活的表格效用是一大半作业应用程序的一个渴求,这一个报表功用在合龙到 Web
应用程序中然后用项特别普及。利用 SQL Serverreg; 二零零一 Reporting 瑟维斯s
的摩登版本,您能够轻易地具备来自种种数据源的报表生成作用。在本文中,作者将介绍使用
Visual Studioreg; 和 Reporting 瑟维斯s
来编排报表,并演示怎么着将报表集成到 Web 应用程序中。

 

Reporting Services 是依附服务器的表格生成平台,该平台创设在 .NET
Framework 上并与 SQL Server 二零零四集成在一块,因而你能够接受三个恢宏的依附 Web 服务的 API
将增进的表格生成功用集成到应用程序中。即使报表服务器使用 SQL Server
作为报表的积攒库,但接纳 OLE DB、ODBC 或 ADO.NET
提供程序的任何数据源都能够用来为报表提供数据,那就使得 Reporting
Services 成为在各样铺面条件中生成报表的极佳工具。

若要查看布署到报表服务器的报表或在本土文件系统上存在的表格,您可以在 Web
应用程序中央银行使 WebForms ReportViewer 控件来显现它们。

Reporting Services 是当作 SQL Server 二零零四的一片段而授权的,由此一旦你有已授权的 SQL Server
的别本,则足以在长久以来服务器上运营 Reporting Services
而无需支付额外的许可证费用。假如您决定在单身的、尚未经 SQL Server
授权的微处理器(例如,Web 服务器卡塔尔上运转 Reporting
Services,您将索要购买额外的 SQL Server 许可证。

 

要从头选拔 Reporting Services,您能够下载坐落于 SQL Server 二零零零 Reporting
Services 的 120
天试用版软件,它还满含有关怎么样获得该付加物的设置媒体的表明。在安装该付加物时,请确定保障当选富含示例报表的选项,因为本身要将这一个报表集成到本文的
Web 应用程序中。

 

Reporting Services 概述

 

Reporting Services 报表设计使用新的 Visual Studio .NET 二零零一报表设计器,在装置有 Visual Studio 的平等Computer上安装了 Reporting
瑟维斯s 后,该设计器就足以应用。设计器以新的依照 XML 报表定义语言 (凯雷德DL卡塔尔国输出报表结议和数量访问的印证,而 GL450DL
文件会发表到报表服务器。借让你希望为顾客提供创作职能,也得以行使第三方的表格设计器。

 

领队能够行使基于 Web
的报表微处理器来处理已发布的表格,而且能够实行一些任务,譬喻,有限帮助有些顾客组报表的安全或退换已布置报表的多寡源连接字符串。客商也得以应用报表微处理器来浏览和查阅报表;可是不菲厂商扶持于采纳UENCOREL 哀告或 Reporting Services Web
服务,将报表查看直接集成到它们现成的中间 Web 站点或应用程序中。

 

图 1 Reporting Services 连串结构

 

能够将报表参数化,那样顾客能够在翻看报表时从接纳列表中进行抉择;它们还足以导出为八种格式,举例,Microsoftreg;Excel、PDF

XML。固然实时报表提供最新的多少,也能够将报表缓存一段时间以加强品质并削减数额源上的载重。对于商务智能应用程序,报表能够访问Analysis Services OLAP 多维数据集,而且 Reporting Services
以致可以导入现存的 Microsoft Access
报表,就算由于这两种技巧间存在差距,它并无法支撑全部的 Access 效用。有关
Reporting Services 种类构造的详细意况,请参见图 1。

将 ReportViewer 控件增添到 Web 应用程序

  1. 使用
    Microsoft Visual C# 或 Microsoft Visual Basic 创设贰个新的
    Microsoft ASP.NET 网址。


    或 –

    开垦贰个存世的
    ASP.NET 网址并加上多少个新的 Web 窗体。

  2. 在“工具箱”中找到 ReportViewer 控件。 若是“工具箱”不可知,则足以经过从“视图”菜单中选取“工具箱”来举行访谈。


  3. ReportViewer 控件拖到 Web 窗体的宏图图面上。

    名称为reportViewer1 的 ReportViewer 控件便加多到该窗体中。

将控件增加到该窗体之后,“ReportViewer
职分”智能标志将现出,提醒您接收某一表格。 假令你要翻看的报表已布署到报表服务器上,则从“选择报表”下拉列表中接受<服务器报表>选项。 选拔<服务器报表>选项后,将面世五个叠合的习性:“报表服务器 UTucsonL”和“报表路线”。 “报表服务器 UQX56L”是指向相应报表服务器的地点,“报表路线”是指向要表现的表格的欧洲经济共同体路线。
假如您想要以本地情势查看报表,则采纳“设计新报表”选项以运行报表设计器或选拔已然是现存项指标一局部的报表。

在中远间距处理形式下查看报表)


上面包车型大巴演示演示怎么着表现已配备到某一表格服务器的表格。
此示例使用     AdventureWorks2011  
示例报表项目随附的 Sales Order Detail 报表。

该示例使用集成的
Windows 身份验证,因而你首先必需启用模拟。 为此,将以下行插入
web.config 文件:

 

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_0ff6de4d-61a7-4a1b-a1a8-dc6e9b1ce19d’);)

<!-- Web.config file. -->
<identity impersonate="true"/>
注意

默认情况下,模拟处于禁用状态。

C#

VB

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_2aa292be-4209-49db-8bcb-ecc34256c22b’);)

protected void Page_Init(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // Set the processing mode for the ReportViewer to Remote
        reportViewer.ProcessingMode = ProcessingMode.Remote;

        ServerReport serverReport = reportViewer.ServerReport;

        // Set the report server URL and report path
        serverReport.ReportServerUrl =
            new Uri("http://<Server Name>/reportserver");
        serverReport.ReportPath =
            "/AdventureWorks Sample Reports/Sales Order Detail";

        // Create the sales order number report parameter
        ReportParameter salesOrderNumber = new ReportParameter();
        salesOrderNumber.Name = "SalesOrderNumber";
        salesOrderNumber.Values.Add("SO43661");

        // Set the report parameters for the report
        reportViewer.ServerReport.SetParameters(
            new ReportParameter[] { salesOrderNumber });
    }
}

在当地管理方式下查看报表)


下面的上行下效演示怎么着表现作为
Windows 应用程序的一有的还要未有安插到报表服务器的报表。

统筹首先个表格

 

即使本人介绍的基本点在于将报表集成到应用程序中并非编写报表,但纯熟Reporting Services
的最佳点子便是那个时候起始成立一个新的表格项目。为此,请张开 Visual Studio
并利用 Report Project Wizard 创造三个新的品种,该向导坐落于 Business
英特尔ligence Projects
部分。为您的花色钦定三个名称,单击“OK”,然后将展现报表向导对话框。在您选拔数据源的这一步骤中,单击“Edit”开关,以便钦点连接到您数据库服务器上的
AdventureWorks2004,单击“OK”,然后选中使其产生分享数据源的选项。

 

单击“Next”步向到“Design the Query”步骤,钦点轻易的 SQL
语句(举个例子,“SELECT * FROM Product”卡塔尔,然后单击“Next”。Reporting Services
帮忙显得一组固定列的正统表格式 (Tabular卡塔尔(قطر‎报表,也扶助使用带有动态列的时有时无表样式视图的矩阵式 (Matrix卡塔尔(قطر‎报表,由此为该报表选取 Tabular,然后单击“Next”。

 

将或多或少列(比方,ProductID 和 NameState of Qatar拖到 Details
部分并单击“Next”。采取默许的 Bold
样式,单击“Next”,然后内定您的报表服务器的虚构目录的
U中华VL,比如,。未来,单击“Next”。最终一步,您可以为您的首先个表格钦点名称,举例,Products
Report;然后单击“Finish”。

 

该引路将会创制该项目,同期还创制二个方可由八个表格分享AdventureWorks二〇〇〇 数据源,以致贰个在设计器中开拓的有关 Products
数据的报表(请参见图 2卡塔尔国。暗中认可景况下,展现使您能够修改报表设计的 Layout
选项卡。

 

图 2 Visual Studio 报表设计器

 

Data
选项卡用于钦定报表的查询,包罗安装参数以便在奉行报表时提醒顾客提供值。单击“Preview”选项卡来测验报表彰显给顾客的章程。

将 Sales Order Detail 报表增加到网址

  1. 开拓该报表将助长到的网址。

  2. 在“网址”菜单中,选用“增添现存项”。

  3. 浏览到安装了
    AdventureWorks 报表示例项目标地方。

    暗中同意位置是
    C:Program FilesMicrosoft SQL Server100SamplesReporting
    ServicesReport SamplesAdventureWorks Sample Reports。

  4. 选料
    Sales Order Detail.rdl 文件并单击“增多”开关。

    Sales
    Order Detail.rdl 文件现在应是该类型的一局地。

  5. 在设计方案能源微型机中右键单击
    Sales Order Detail.rdl 文件,然后选拔“重命名”。 将该报表重命名字为Sales Order Detail.rdlc,然后按 Enter。

    设若应用方案能源微处理机不可知,则能够因而从“视图”菜单中选拔“建设方案能源微电脑”来将其张开。

今昔,您能够将附加的报表加多到该项目,大概通过抬高附加列、将数据分组、增加汇总、以致是加上能够显示来自其余查询的多寡的附加表来改善Products 报表。与数不尽表格设计器区别,Reporting Services
使用带外设计,那使得它能够轻松地开创将种种源的数目聚集在同三个岗位的报表。
您刚刚创制的报表项目由近些日子驻留在您的支付计算机上的一组文件组成。为了将这么些报表公布给客商,您供给将该类型构造到报表服务器。

 

以下代码示例将为发售订单数量创立四个数据集,然后以本地方式展现Sales Order Detail 报表。

C#

VB

复制window.epx.codeSnippet.copyCode(‘CodeSnippetContainerCode_5b2d9d9f-d223-4308-a60b-eff4256eeade’);)

protected void Page_Init(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        // Set the processing mode for the ReportViewer to Local
        reportViewer.ProcessingMode = ProcessingMode.Local;

        LocalReport localReport = reportViewer.LocalReport;

        localReport.ReportPath = "Sales Order Detail.rdlc";

        DataSet dataset = new DataSet("Sales Order Detail");

        string salesOrderNumber = "SO43661";

        GetSalesOrderData(salesOrderNumber, ref dataset);

        ReportDataSource dsSalesOrder = new ReportDataSource();
        dsSalesOrder.Name = "SalesOrder";
        dsSalesOrder.Value = dataset.Tables["SalesOrder"];

        localReport.DataSources.Add(dsSalesOrder);

        GetSalesOrderDetailData(salesOrderNumber, ref dataset);

        ReportDataSource dsSalesOrderDetail = new ReportDataSource();
        dsSalesOrderDetail.Name = "SalesOrderDetail";
        dsSalesOrderDetail.Value = dataset.Tables["SalesOrderDetail"];

        localReport.DataSources.Add(dsSalesOrderDetail);

        // Create the sales order number report parameter
        ReportParameter rpSalesOrderNumber = new ReportParameter();
        rpSalesOrderNumber.Name = "SalesOrderNumber";
        rpSalesOrderNumber.Values.Add("SO43661");

        // Set the report parameters for the report
        localReport.SetParameters(
            new ReportParameter[] { rpSalesOrderNumber });
    }
}

private void GetSalesOrderData(string salesOrderNumber,
                           ref DataSet dsSalesOrder)
{
    string sqlSalesOrder =
        "SELECT SOH.SalesOrderNumber, S.Name AS Store, " +
        "       SOH.OrderDate, C.FirstName AS SalesFirstName, " +
        "       C.LastName AS SalesLastName, E.Title AS " +
        "       SalesTitle, SOH.PurchaseOrderNumber, " +
        "       SM.Name AS ShipMethod, BA.AddressLine1 " +
        "       AS BillAddress1, BA.AddressLine2 AS " +
        "       BillAddress2, BA.City AS BillCity, " +
        "       BA.PostalCode AS BillPostalCode, BSP.Name " +
        "       AS BillStateProvince, BCR.Name AS " +
        "       BillCountryRegion, SA.AddressLine1 AS " +
        "       ShipAddress1, SA.AddressLine2 AS " +
        "       ShipAddress2, SA.City AS ShipCity, " +
        "       SA.PostalCode AS ShipPostalCode, SSP.Name " +
        "       AS ShipStateProvince, SCR.Name AS " +
        "       ShipCountryRegion, CC.Phone AS CustPhone, " +
        "       CC.FirstName AS CustFirstName, CC.LastName " +
        "       AS CustLastName " +
        "FROM   Person.Address SA INNER JOIN " +
        "       Person.StateProvince SSP ON " +
        "       SA.StateProvinceID = SSP.StateProvinceID " +
        "       INNER JOIN Person.CountryRegion SCR ON " +
        "       SSP.CountryRegionCode = SCR.CountryRegionCode " +
        "       RIGHT OUTER JOIN Sales.SalesOrderHeader SOH " +
        "       LEFT OUTER JOIN  Person.Contact CC ON " +
        "       SOH.ContactID = CC.ContactID LEFT OUTER JOIN" +
        "       Person.Address BA INNER JOIN " +
        "       Person.StateProvince BSP ON " +
        "       BA.StateProvinceID = BSP.StateProvinceID " +
        "       INNER JOIN Person.CountryRegion BCR ON " +
        "       BSP.CountryRegionCode = " +
        "       BCR.CountryRegionCode ON SOH.BillToAddressID " +
        "       = BA.AddressID ON  SA.AddressID = " +
        "       SOH.ShipToAddressID LEFT OUTER JOIN " +
        "       Person.Contact C RIGHT OUTER JOIN " +
        "       HumanResources.Employee E ON C.ContactID = " +
        "       E.ContactID ON SOH.SalesPersonID = " +
        "       E.EmployeeID LEFT OUTER JOIN " +
        "       Purchasing.ShipMethod SM ON SOH.ShipMethodID " +
        "       = SM.ShipMethodID LEFT OUTER JOIN Sales.Store" +
        "        S ON SOH.CustomerID = S.CustomerID " +
        "WHERE  (SOH.SalesOrderNumber = @SalesOrderNumber)";

    SqlConnection connection = new
        SqlConnection("Data Source=(local); " +
                      "Initial Catalog=AdventureWorks; " +
                      "Integrated Security=SSPI");

    SqlCommand command =
        new SqlCommand(sqlSalesOrder, connection);

    command.Parameters.Add(
        new SqlParameter("SalesOrderNumber",
        salesOrderNumber));

    SqlDataAdapter salesOrderAdapter = new
        SqlDataAdapter(command);

    salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder");
}

private void GetSalesOrderDetailData(string salesOrderNumber,
                       ref DataSet dsSalesOrder)
{
    string sqlSalesOrderDetail =
        "SELECT  SOD.SalesOrderDetailID, SOD.OrderQty, " +
        "        SOD.UnitPrice, CASE WHEN " +
        "        SOD.UnitPriceDiscount IS NULL THEN 0 " +
        "        ELSE SOD.UnitPriceDiscount END AS " +
        "        UnitPriceDiscount, SOD.LineTotal, " +
        "        SOD.CarrierTrackingNumber, " +
        "        SOD.SalesOrderID, P.Name, P.ProductNumber " +
        "FROM    Sales.SalesOrderDetail SOD INNER JOIN " +
        "        Production.Product P ON SOD.ProductID = " +
        "        P.ProductID INNER JOIN " +
        "        Sales.SalesOrderHeader SOH ON " +
        "        SOD.SalesOrderID = SOH.SalesOrderID " +
        "WHERE   (SOH.SalesOrderNumber = @SalesOrderNumber) " +
        "ORDER BY SOD.SalesOrderDetailID";

    using (SqlConnection connection = new
        SqlConnection("Data Source=(local); " +
                      "Initial Catalog=AdventureWorks; " +
                      "Integrated Security=SSPI"))
    {

        SqlCommand command =
            new SqlCommand(sqlSalesOrderDetail, connection);

        command.Parameters.Add(
            new SqlParameter("SalesOrderNumber",
            salesOrderNumber));

        SqlDataAdapter salesOrderDetailAdapter = new
            SqlDataAdapter(command);

        salesOrderDetailAdapter.Fill(dsSalesOrder,
            "SalesOrderDetail");
    }
}

请参阅)


计划和测验

概念

动用 ReportViewer 控件集成 Reporting
Services

在布署报表项目事情发生前,须要钦点将项目配置到哪一个服务器。倘使您最早使用该引路创设了表格项目,那么您可能曾经钦赐了对象服务器。

要检查该装置或钦定三个新服务器,请选用“Project | Properties”来展现Project Properties 对话框。举办该装置使您能够钦命项目标文本夹名和
Reporting Services Web 服务的 UCRUISERL。在菜单上采摘“Build | Deploy
Solution”将创设报表项目,然后将其配置到服务器。

在布署报表项目后,您就足以扩充测量试验了。已布置到服务器的种种报表都有着唯一的路线,该路径能够用于在浏览器中展现报表。比方,要展现你创制的率先个表格,请展开浏览器并导航到
+Project1/Products+Report。这会以 HTML
格式显示报表并在页面包车型地铁上边呈现叁个工具栏,以便使你能够对报表进行翻页、改进缩放比例,以至以各样其他格式(比如,PDF卡塔尔国查看报表。

你还是可以透过导航到服务器上的以下
U凯雷德L,来浏览已计划到服务器的有所报表项指标列表:。报表服务器提供使您可以查看已布署的表格类型和查阅报表的小小的客户界面。

报表微机是三个尤为温馨、成效更丰硕的工具,能够通过轻易地导航到本地服务器上的以下
U昂科雷L 来访问该工具:。

将报表加多到 Web 应用程序

既然如此您领略怎样规划、布署和测量检验报表,就让我们将这一个报表集成到应用程序中呢!超级多Web
应用程序都囊括针对各个顾客的自定义主页,平日称为“仪表板”。那几个页面平时提供针对性顾客量身定做的摘要式音讯并作为跳转点来访谈应用程序的别样职能。

本人将动用 Reporting Services
附带的现身说法报表营造三个仪表板来演示报表集成,如图 3
所示。倘诺你在装置进程中设置了演示报表,您可以展开该报表项目(安装到
Reporting
ServicesSamplesReports卡塔尔并将其布局到测验服务器。您可以选择报表微机工具通过浏览到
SampleReports 文件夹来测量试验示例报表。

图 3 仪表板 Web 应用程序

为顾客提供从应用程序访谈报表的权柄的最简单易行方法就是利用一流链接。如你曾经观看的那么,每种报表都具备独一的、用于在浏览器中显得报表的路子。对于仪表板应用程序,报表应该在单独的窗口中开发,由此笔者将为该一流链接钦定二个指标。到近些日子结束,那是特简单的,可是对于具有参数报表的报表(比方,Employee
Sales Summary
报表卡塔尔国来讲,情况又怎么呢?要实在地将报表集成到应用程序中,您常常必要为参数钦赐有些值,以便顾客不会被日常提醒。

Reporting Services 使那项职责非常轻易:报表参数的值可以钦赐为 U昂科拉L
的一局地。举例,Employee Sales Summary 报表具备 ReportYear、ReportMonth
和 EmpID 参数,因而显得号码为 24 的工作者在 12月份的出售额的一级链接能够是:

a href= Sales SummaryReportMonth=11EmpID=24 target=_blankNovember Sales Summary/a

不富有在 U奥迪Q5L
中钦命的值的参数将利用在表格设计器中安装的暗许值,由此刚才来得的身教重于言教贩卖聚集报表使用的
ReportYear 值是 二零零零。Reporting 瑟维斯s
还会有一组用于调整报表呈现情势的放权参数。那个参数通过抬高前缀“rs:”来分化您本身的报表参数。

个中最管用的一个参数就是 rs:Format
参数,它用来钦点显示报表的格式。那让你能够包含无需展现在 HTML
中的报表,还足以选用诸如 PDF 以至是 XML 的格式。其余常用参数是
rs:Command,提醒出要接收到您所钦赐的门路的操作。比方,rs:Command=Render
将表现三个报表,而 rs:Command=ListChildren 将列出文件夹中有所项。

借使您未有一点点名命令,Reporting Services
将翻开您钦定的门路并思索出要运用的适当操作,比方,展现报表。图 4 显示了
rs:parameters 的列表。

发表评论

电子邮件地址不会被公开。 必填项已用*标注