Compartir a través de


Usar el control ReportViewer de WebForms

Para ver los informes implementados en un servidor de informes o los informes que existen en el sistema de archivos local, puede utilizar el control ReportViewer de WebForms para representarlos en una aplicación web.

Para agregar el control ReportViewer a una aplicación web

  1. Cree un nuevo sitio web de Microsoft ASP.NET mediante MicrosoftVisual C# o MicrosoftVisual Basic.

    O bien

    Abra un sitio web ASP.NET existente y agregue un nuevo formulario Web Forms.

  2. Busque el control ReportViewer en el Cuadro de herramientas. Si el Cuadro de herramientas no está visible, puede tener acceso a él desde el menú Ver seleccionando Cuadro de herramientas.

  3. Arrastre el control ReportViewer a la superficie de diseño del formulario de Web Forms.

    Se agrega al formulario el control ReportViewer denominado reportViewer1.

Una vez agregado al formulario el control, la etiqueta inteligente ReportViewer Tasks aparecerá y solicitará que seleccione un informe. Si el informe que desea ver se ha implementado en un servidor de informes, seleccione la opción <Informe de servidor> en la lista desplegable Elegir informe. Una vez seleccionada la opción <Informe de servidor>, aparecerán dos propiedades adicionales: URL del servidor de informes y Ruta de acceso del informe. URL del servidor de informes es la dirección del servidor de informes y Ruta de acceso del informe es la ruta de acceso completa del informe que desea representar. Si desea ver un informe en modo local, seleccione la opción Diseñar nuevo informe para iniciar el diseñador del informe, o seleccione un informe que ya forme parte del proyecto existente.

Ver los informes en modo de procesamiento remoto

En el ejemplo siguiente se muestra la forma de representar un informe que se ha implementado en un servidor de informes. En este ejemplo se utiliza el informe Sales Order Detail que se incluye con el proyecto de informes de ejemplo AdventureWorks. Para obtener más información acerca de cómo implementar este informe de ejemplo, vea Ejemplos de SQL Server Reporting Services.

En el ejemplo se utiliza la autenticación integrada de Windows por lo que se debe habilitar primero la suplantación. Para ello, inserte la línea siguiente en el archivo web.config:

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

[!NOTA]

De manera predeterminada, la suplantación está deshabilitada.

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 });
    }
}
Imports Microsoft.Reporting.WebForms

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Init(ByVal sender As Object, _
            ByVal e As System.EventArgs) Handles Me.Init

        If Not Page.IsPostBack Then

            'Set the processing mode for the ReportViewer to Remote
            reportViewer.ProcessingMode = ProcessingMode.Remote

            Dim serverReport As 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
            Dim salesOrderNumber As New ReportParameter()
            salesOrderNumber.Name = "SalesOrderNumber"
            salesOrderNumber.Values.Add("SO43661")

            'Set the report parameters for the report
            Dim parameters() As ReportParameter = {salesOrderNumber}
            serverReport.SetParameters(parameters)

        End If

    End Sub

End Class

Ver los informes en el modo de procesamiento local

En el ejemplo siguiente se muestra cómo representar un informe que forma parte de la aplicación para Windows y no se implementa en un servidor de informes. En este ejemplo también se usa el informe Sales Order Detail del proyecto Ejemplos de SQL Server Reporting Services.

Para agregar el informe Sales Order Detail a un sitio web

  1. Abra el sitio web al que se agregará el informe.

  2. En el menú Sitio web, seleccione Agregar elemento existente.

  3. Vaya a la ubicación donde esté instalado el proyecto AdventureWorks Report Samples.

    La ubicación predeterminada es C:\Archivos de programa\Microsoft SQL Server\100\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports. Para obtener más información acerca de cómo instalar los ejemplos, vea Consideraciones para instalar ejemplos y bases de datos de ejemplo de SQL Server.

  4. Seleccione el archivo Sales Order Detail.rdl y haga clic en el botón Agregar.

    El archivo Sales Order Detail.rdl debe formar parte del proyecto.

  5. Haga clic con el botón secundario en el archivo Sales Order Detail.rdl en el Explorador de soluciones y seleccione Cambiar nombre. Cambie el nombre del informe a Sales Order Detail.rdlc y presione ENTRAR.

    Si el Explorador de soluciones no está visible, puede abrirlo en el menú Ver seleccionando Explorador de soluciones.

El ejemplo de código siguiente creará un conjunto de datos para los datos del pedido de ventas y, a continuación, representará el informe Sales Order Detail en modo local.

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");
    }
}
Imports System.Data
Imports System.Data.SqlClient
Imports Microsoft.Reporting.WebForms

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Init(ByVal sender As Object, _
                ByVal e As System.EventArgs) Handles Me.Init

        If Not Page.IsPostBack Then

            'Set the processing mode for the ReportViewer to Local
            reportViewer.ProcessingMode = ProcessingMode.Local

            Dim localReport As LocalReport
            localReport = reportViewer.LocalReport

            localReport.ReportPath = "Sales Order Detail.rdlc"

            Dim dataset As New DataSet("Sales Order Detail")

            Dim salesOrderNumber As String = "SO43661"

            'Get the sales order data
            GetSalesOrderData(salesOrderNumber, dataset)

            'Create a report data source for the sales order data
            Dim dsSalesOrder As New ReportDataSource()
            dsSalesOrder.Name = "SalesOrder"
            dsSalesOrder.Value = dataset.Tables("SalesOrder")

            localReport.DataSources.Add(dsSalesOrder)

            'Get the sales order detail data
            GetSalesOrderDetailData(salesOrderNumber, dataset)

            'Create a report data source for the sales 
            'order detail data
            Dim dsSalesOrderDetail As New ReportDataSource()
            dsSalesOrderDetail.Name = "SalesOrderDetail"
            dsSalesOrderDetail.Value = _
                dataset.Tables("SalesOrderDetail")

            localReport.DataSources.Add(dsSalesOrderDetail)

            'Create a report parameter for the sales order number 
            Dim rpSalesOrderNumber As New ReportParameter()
            rpSalesOrderNumber.Name = "SalesOrderNumber"
            rpSalesOrderNumber.Values.Add("SO43661")

            'Set the report parameters for the report
            Dim parameters() As ReportParameter = {rpSalesOrderNumber}
            localReport.SetParameters(parameters)

        End If

    End Sub

    Private Sub GetSalesOrderData(ByVal salesOrderNumber As String, _
                               ByRef dsSalesOrder As DataSet)

        Dim sqlSalesOrder As String = _
            "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)"

        Using connection As New SqlConnection( _
                      "Data Source=(local); " & _
                      "Initial Catalog=AdventureWorks; " & _
                      "Integrated Security=SSPI")

            Dim command As New SqlCommand(sqlSalesOrder, connection)

            Dim parameter As New SqlParameter("SalesOrderNumber", _
                salesOrderNumber)
            command.Parameters.Add(parameter)

            Dim salesOrderAdapter As New SqlDataAdapter(command)

            salesOrderAdapter.Fill(dsSalesOrder, "SalesOrder")

        End Using

    End Sub

    Private Sub GetSalesOrderDetailData( _
                           ByVal salesOrderNumber As String, _
                           ByRef dsSalesOrder As DataSet)

        Dim sqlSalesOrderDetail As String = _
            "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 connection As New SqlConnection( _
                      "Data Source=(local); " & _
                      "Initial Catalog=AdventureWorks; " & _
                      "Integrated Security=SSPI")

            Dim command As New SqlCommand(sqlSalesOrderDetail, _
                                          connection)

            Dim parameter As New SqlParameter("SalesOrderNumber", _
                salesOrderNumber)
            command.Parameters.Add(parameter)

            Dim salesOrderDetailAdapter As New SqlDataAdapter(command)

            salesOrderDetailAdapter.Fill(dsSalesOrder, _
                "SalesOrderDetail")

        End Using

    End Sub

End Class