2015年12月29日 星期二

使用 WebForms ReportViewer 控制項

引用
若要檢視已部署至報表伺服器或存在於本機檔案系統的報表,您可以使用 WebForms ReportViewer 控制項在 Web 應用程式中加以轉譯。
若要在 Web 應用程式中使用 ReportViewer 控制項
使用 Microsoft Visual C# 或 Microsoft Visual Basic 建立新的 Microsoft ASP.NET 網站。
-或-
開啟現有的 ASP.NET 網站並加入新的 Web Form。
在 [工具箱] 視窗的 [AJAX 擴充功能] 群組中找出 [ScriptManager] 控制項,並將它拖曳到 Web 表單的設計介面上。
如果看不到 [工具箱],可以從 [檢視] 功能表選取 [工具箱] 加以存取。
在 [工具箱] 中找出 [ReportViewer] 控制項,並將它拖曳至設計介面上的 [ScriptManager] 控制項下方。
名為 reportViewer1 的 [ReportViewer] 控制項會加入至表單。
將控制項加入表單後,[ReportViewer 工作] 智慧標籤將會顯示以提示您選取報表。如果您希望檢視的報表已部署到報表伺服器,請從 [選擇報表] 下拉式清單,選取 [<伺服器報表>] 選項。一旦選取 [<伺服器報表>] 選項,會出現兩個其他屬性:[報表伺服器 URL] 與 [報表路徑]。 [報表伺服器 URL] 是到報表伺服器的位址,[報表路徑] 則是要轉譯之報表的完整路徑。
如果您要以本機模式檢視報表,請選取 [設計新報表] 選項以啟動報表設計師,或選取已是現有專案一部分的報表。在您選取報表之後,請務必在 ReportViewer 控制項的 [ReportPath] 屬性中輸入報表 RDLC 檔案的名稱。這個屬性會出現在 [屬性] 窗格的 [LocalReport] 節點下。
當報表轉譯時,您可以選擇隱藏 ReportViewer 工具列上的一個或多個項目。例如,您可以隱藏列印按鈕。若要隱藏工具列項目,請在 [屬性] 窗格中將下列 ReportViewer 屬性設定為 False。
ShowBackButton
ShowExportControls
ShowFindControls
ShowPageNavigationControls
ShowPrintButton
ShowRefreshButton
ShowZoomControl
以遠端處理模式檢視報表
下列範例示範如何轉譯已部署到報表伺服器的報表。這個範例使用包含在 AdventureWorks2012 範例報表專案中的 Sales Order Detail 報表。
此範例使用整合式 Windows 驗證,因此您必須啟用模擬。若要這樣做,請將下列行插入 web.config 檔案:


System_CAPS_note注意事項
預設會停用模擬。
C#
VB
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:///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
以本機處理模式檢視報表
下列範例示範如何轉譯是 Windows 應用程式的一部分且尚未部署到報表伺服器的報表。
若要將 Sales Order Detail 報表加入網站
開啟將加入報表的網站。
從 [網站] 功能表上,選取 [加入現有項目]。
瀏覽至安裝 AdventureWorks 報表範例專案的位置。
預設位置是 C:\Program Files\Microsoft SQL Server\100\Samples\Reporting Services\Report Samples\AdventureWorks Sample Reports。
選取 Sales Order Detail.rdl 檔案,然後按一下 [加入] 按鈕。
Sales Order Detail.rdl 檔案現在應該是專案的一部分。
在 [方案總管] 中,以滑鼠右鍵按一下 Sales Order Detail.rdl 檔案,然後選擇 [重新命名]。將報表重新命名為 Sales Order Detail.rdlc,然後按 ENTER 鍵。
如果看不到 [方案總管],可以從 [檢視] 功能表選取 [方案總管] 加以開啟。
下列的程式碼範例會為銷售訂單資料建立資料集,然後以本機模式轉譯 Sales Order Detail 報表。
C#
VB
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

沒有留言:

張貼留言