建立 Sales_Order_Detail_2008R2 報表

本教學課程可幫助您根據 AdventureWorks 2008R2 範例報表建立 Sales_Order_Detail_2008R2 報表。

這份詳細報表是 Employee_Sales_Summary_2008R2 報表中 SalesOrderNumber 欄位之鑽研動作的目標。此報表會顯示某個銷售訂單連續範圍的銷售標頭和銷售產品項目詳細資料。詳細資訊包括訂單號碼、商店名稱、帳單和出貨地址、銷售人員連絡資訊,以及 AdventureWorks2008R2 資料庫中的其他可用詳細資料。如需有關報表以及其關聯性套件的詳細資訊,請參閱<教學課程:建立 AdventureWorks 2008R2 範例報表>。

學習內容

在本教學課程中,您將會執行下列工作:

  • 加入資料集和查詢,以便擷取某個銷售訂單範圍的銷售訂單詳細資料。

  • 針對範圍內的第一個和最後一個銷售訂單號碼設定報表參數。

  • 將下列資訊加入至頁首:

    • 頁面名稱。如果您將報表匯出到 Excel,工作表的索引標籤名稱就會以頁面名稱為基礎。

    • 整個報表的頁數。

    • 每個銷售訂單內的頁數。

    • 有關如何讓報表使用者返回主報表的指示。

  • 加入清單,其中包含以 SalesOrderID 為基礎的單一資料列群組。在此清單中,您將會加入下列項目:

    • 做為容器的巢狀矩形,可協助控制銷售訂單標頭和詳細資訊的配置。

    • 多個文字方塊,可顯示銷售訂單標頭資訊。

    • 子報表,可顯示多個商店連絡人的電話號碼。

    • 資料表,可顯示銷售訂單中每個產品項目的詳細資料。

  • 加入自訂程式碼來計算總頁數以及後續頁面的累計總頁數。

  • 定義報表變數來簡化累計總數運算式。

  • 針對詳細資料列定義自訂群組運算式,以便每隔 25 個資料列啟動新的頁面。

完成這個教學課程的估計時間:30 分鐘。

需求

如需有關需求的詳細資訊,請參閱<AdventureWorks 2008R2 範例報表的必要條件>。

本教學課程會假設您已完成<建立報表伺服器專案及 AdventureWorks2008R2_Base 報表>。

提示

銷售訂單詳細資料報表是使用資料區、矩形、巢狀資料區和巢狀文字方塊來組織資料的自由格式報表。這些項目的包含階層很重要。請檢閱<報表設計提示 (報表產生器 3.0 和 SSRS)>中的提示,然後使用下列提示來協助建立此報表:

  • 建議您開啟範例報表 Sales_Order_Detail_2008R2,並搭配本教學課程來檢視它。當您開啟 Sales_Order_Detail_2008R2 之後,請在 [文件大綱] 窗格內檢視報表項目階層。當您建立報表時,請驗證 Tablix 報表項目與矩形之間的包含關聯性。

    [!附註]

    若要開啟 [文件大綱] 窗格,請在 [檢視] 功能表中,按一下 [其他視窗],然後按一下 [文件大綱]

  • 清單是自由格式的 Tablix 配置。根據預設,清單會包含單一 Tablix 資料格,該資料格則包含矩形。在這個報表中,您將會加入下列項目:

    • 額外的巢狀矩形,可包含標誌、銷售訂單號碼,以及銷售訂單標頭資訊。

    • 資料表,可顯示每個產品的銷售訂單詳細資料。

  • 您可能會發現,在原始報表與複本之間複製及貼上資料區或矩形容器,要比建立報表項目和配置的所有工作都來得更輕鬆。您可以在開放報表的索引標籤式檢視之間複製及貼上報表項目。當您從一份報表複製項目時,請按一下您想要複製的目標報表索引標籤,然後按一下要將項目貼到哪一個位置。貼上動作會區分內容。例如,您不能將資料區貼到頁首。

若要開啟專案並建立報表的複本

  1. 在 Business Intelligence Development Studio 中,開啟報表伺服器專案 AdventureWorks 2008R2。

  2. 在 [方案總管] 中,進行下列動作:

    1. 以滑鼠右鍵按一下報表 AdventureWorks2008R2_Base.rdl,然後按一下 [複製]

    2. 以滑鼠右鍵按一下專案節點,然後按一下 [貼上]

    3. 將複製的報表重新命名為 Sales_Order_Detail_2008R2.rdl。

若要建立個人銷售量的資料集

  • 在 [報表資料] 窗格中,加入名為 SalesOrder 的內嵌資料集。使用 AdventureWorks2008R2 共用資料來源和下列查詢:

    SELECT SOH.SalesOrderNumber, S.BusinessEntityID, S.Name, 
      SOH.SalesOrderID, SOH.SalesPersonID, SOH.TotalDue,
      SOH.OrderDate, SOH.PurchaseOrderNumber,
      SOH.BillToAddressID, SOH.ShipToAddressID, SOH.ShipMethodID,
      SM.Name AS ShipMethod, BA.AddressLine1 AS BillAddress1, BA.City AS BillCity, 
      BA.PostalCode AS BillPostalCode, BSP.Name AS BillStateProvince, 
      BCR.Name AS BillCountryRegion, 
      SA.AddressLine1 AS ShipAddress1,SA.City AS ShipCity, SA.PostalCode AS ShipPostalCode, 
      SSP.Name AS ShipStateProvince, SCR.Name AS ShipCountryRegion,
      e.JobTitle, per.[FirstName] + N' ' + per.[LastName] AS [SalesPerson], 
      ph.PhoneNumber,
      SD.SalesOrderDetailID, SD.OrderQty, SD.UnitPrice, 
      CASE WHEN SD.UnitPriceDiscount IS NULL THEN 0 ELSE SD.UnitPriceDiscount END 
         AS UnitPriceDiscount, 
      SD.LineTotal, SD.CarrierTrackingNumber, P.Name as ProductName, P.ProductNumber
      FROM [Sales].[SalesOrderHeader] SOH 
        INNER JOIN Sales.Customer C ON SOH.CustomerID = C.CustomerID
        INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID
        INNER JOIN Person.Address SA ON SA.AddressID = SOH.ShipToAddressID -- Shipping address
        INNER JOIN Person.StateProvince SSP ON SA.StateProvinceID = SSP.StateProvinceID 
        INNER JOIN Person.CountryRegion SCR ON SSP.CountryRegionCode = SCR.CountryRegionCode 
        INNER JOIN Person.Address BA ON SOH.BillToAddressID = BA.AddressID -- Billing Address
        INNER JOIN Person.StateProvince BSP ON BA.StateProvinceID = BSP.StateProvinceID 
        INNER JOIN Person.CountryRegion BCR ON BSP.CountryRegionCode = BCR.CountryRegionCode 
        INNER JOIN Purchasing.ShipMethod SM ON SOH.ShipMethodID = SM.ShipMethodID 
        INNER JOIN [Sales].[SalesPerson] sp ON sp.[BusinessEntityID] = SOH.[SalesPersonID]  
        INNER JOIN [HumanResources].[Employee] e ON SOH.[SalesPersonID] = e.[BusinessEntityID] 
        INNER JOIN [Person].[Person] per ON per.[BusinessEntityID] = sp.[BusinessEntityID]
        INNER JOIN Person.PersonPhone ph ON per.[BusinessEntityID] = ph.[BusinessEntityID]
        INNER JOIN Sales.SalesOrderDetail SD ON SD.SalesOrderID = SOH.SalesOrderID
        INNER JOIN Production.Product P ON SD.ProductID = P.ProductID 
    WHERE (SOH.SalesOrderID BETWEEN (@SalesOrderIDStart) AND (@SalesOrderIDEnd))
    

資料集查詢會傳回某個範圍中多個銷售訂單的資料。

若要設定報表參數 @SalesOrderIDStart

  1. 開啟 @SalesOrderIDStart[參數屬性]

  2. [提示] 變更為第一個訂單識別碼?

  3. [資料類型] 變更為 [整數]

  4. [預設值] 上加入值,並將它設定為 57030。

若要設定報表參數 @SalesOrderIDEnd

  1. 開啟 @SalesOrderIDEnd[參數屬性]

  2. [提示] 變更為最後一個訂單識別碼?

  3. [資料類型] 變更為 [整數]

  4. [預設值] 上加入值,並將它設定為 57032。

將名稱和號碼加入至頁首

若要加入頁面名稱

  1. 在頁首中,針對包含 [&ReportName] 的文字方塊,於新的一行加入下列文字:頁面名稱:。

  2. 在 [報表資料] 窗格中,展開 [內建欄位],並將 [PageName] 拖曳至您剛才加入的文字旁邊。

  3. 按一下報表背景,在 [屬性] 窗格中顯示 [報表屬性]

  4. [InitialPageName] 中輸入 SalesOrder。

  5. 在 [群組] 窗格中,按一下 SalesOrderID 群組。確認 [Tablix 成員] 屬性出現在 [屬性] 窗格中。

  6. 展開 [群組],並尋找 [PageName],然後輸入 =Fields!SalesOrderNumber.Value。

如果您將這個檔案匯出到 Excel,索引標籤名稱就會以頁面名稱為基礎。

若要加入頁碼

  1. 在頁首加入文字方塊,其中包含下列文字:

    • 銷售訂單頁面:[&PageNumber] / [&TotalPages]

    • 報表頁面:[&OverallPageNumber] / [&OverallTotalPages]

  2. 在 [群組] 窗格中,按一下 SalesOrderID 群組。

  3. 在 [屬性] 窗格中,確認已經選取 [Tablix 成員]。依序展開 [群組][PageBreak],然後將 [ResetPageNumber] 設定為 true。

當您逐頁瀏覽報表時,就會同時顯示群組的頁碼以及整份報表的頁碼。

加入報表使用者指示

若要加入讓報表使用者返回主報表的指示

  1. 在頁首的正下方,為使用者加入有關如何返回主要報表之指示的文字方塊。加入下列文字:

    使用瀏覽器的上一頁按鈕回到主報表。

  2. 視需要設定文字方塊的格式。

加入及設定清單

若要加入具有群組資料列的清單

  1. 在案例切換文字指示下方,插入 [清單]

    根據預設,清單會在詳細資料列中包含單一 Tablix 資料格。在步驟 2-6 中,您將會加入群組資料列並移除詳細資料列,讓此清單的群組資料列包含單一 Tablix 資料格。

  2. 將 [SalesOrderID] 從 SalesOrder 資料集拖曳至 [群組] 窗格中的 [資料列群組],然後將它放在詳細資料群組上方。

  3. 在 [群組] 窗格中,以滑鼠右鍵按一下 [詳細資料] 群組,然後按一下 [刪除群組]

  4. [刪除群組] 對話方塊中,按一下 [刪除群組及相關資料列和資料行]

  5. 在選取的清單中,確認資料列控點顯示單一括號,表示單一資料列群組。

  6. 以滑鼠右鍵第一個資料行的資料行控點,然後按一下 [刪除資料行]

  7. [刪除資料行] 對話方塊上,按一下 [只刪除資料行]

    此 Tablix 現在具有單一資料格,該資料格包含矩形而且依據 [SalesOrderID] 分組。這個矩形是單一銷售訂單之相關資訊的容器。在之後的步驟中,您會將銷售訂單標頭和銷售訂單詳細資料加入至這個容器。

  8. 以滑鼠右鍵按一下資料格,然後按一下 [矩形屬性]

  9. 將名稱變更為 OrderHeader_Contents。

  10. 在 [群組] 窗格中,以滑鼠右鍵按一下 SalesOrderID 群組,然後開啟 [群組屬性]

  11. [分頁符號] 上,選取 [在群組的每個執行個體之間]

  12. 根據設計,每個銷售訂單都會在新的頁面上開始。

若要驗證清單的組態

  1. 按一下清單中的空白資料格,然後在工具列上,將 [背景色彩] 設定為 [白霧色]。當您使用矩形中的巢狀項目時,這樣做有助於查看容器。

  2. 若要驗證清單組態,請進行下列動作:

    1. 將 SalesOrderID 和 TotalDue 從 SalesOrder 資料集拖曳至矩形。

    2. 以滑鼠右鍵按一下 SalesOrderID、指向 [摘要方式],然後按一下 [第一個]

      因為這是群組資料列,所以請針對運算式中的欄位使用彙總函式。

    3. 將 TotalDue 格式化為貨幣。

    4. 執行報表。

    對於每一個出現的銷售訂單而言,清單都會出現在新的頁面上,並顯示銷售訂單號碼和銷售總額。應該會有三個頁面,每一個頁面各適用於銷售訂單 57030、57031 和 57032。當您逐頁瀏覽報表時,頁首值會變更。

    當您使用這份報表來提供單一銷售訂單的詳細資料時,您會將 @SalesOrderIDStart@SalesOrderIDEnd 設定為相同的 SalesOrderID。

  3. 在 [設計] 檢視中,從清單中刪除文字方塊。

建立訂單標頭配置

您將在兩個個別的矩形容器中建立訂單標頭配置、結合它們,然後將外部矩形加入至清單。

  1. 標誌、訂單號碼和 OrderHeaderData 矩形的父矩形容器。

  2. 名為 OrderHeaderData 的矩形容器,代表訂單標頭資料欄位。當您建立這個配置時,它有助於想像下列三個水平區段中的資訊:

    1. 帳單和出貨資訊

    2. 商店連絡資訊

    3. 其餘資訊:日期、銷售人員、採購訂單號碼和出貨方法

若要在矩形容器中建立訂單標頭

  1. 在清單外面插入 [矩形]

  2. 將標誌從頁首移至矩形。

  3. 插入包含下列文字的文字方塊:

    1. 銷售訂單

    2. 訂單號碼:[SalesOrderNumber]

  4. 將標誌拖曳至容器左邊,而將文字方塊拖曳至右邊。視需要設定格式。

若要加入矩形來代表訂單標頭資料欄位

  1. 在清單外部,插入 [矩形],並將名稱變更為 OrderHeaderData。

  2. 在頁面上擴展矩形,以便挪出空間給所有銷售訂單標頭資訊使用。

在這個矩形中,加入下列程序所描述的每個水平資訊區段。

若要建立帳單和出貨資訊區段

  1. 加入文字方塊。在編輯模式中,輸入付款人:

  2. 加入文字方塊以顯示下列文字行:

    1. [Name]

    2. [BillAddress1]

    3. [BillCity], [BillStateProvince] [BillPostalCode]

    4. [BillCountryRegion]

  3. 加入文字方塊。在編輯模式中,輸入送貨地點:

  4. 加入文字方塊以顯示下列文字行:

    1. [Name]

    2. [ShipAddress1]

    3. [ShipCity], [ShipStateProvince] [ShipPostalCode]

    4. [ShipCountryRegion]

  5. 對齊這些文字方塊的頂端。

若要建立商店連絡資訊區段

  1. 加入文字方塊。在編輯模式中,輸入連絡人:

  2. 插入 [子報表] 然後執行以下作業:

    1. [一般] 頁面上,選取子報表 Store_Contacts_2008R2。

    2. [參數] 頁面上,加入參數。

    3. [名稱] 設定為 StoreID 並將 [值] 設定為 [BusinessEntityID]。

  3. 對齊文字方塊和子報表的頂端。

若要建立其餘資訊區段

  1. 加入文字方塊以顯示下列文字行:

    1. 日期

    2. 預留位置文字。將標籤設定為 ProcessedDate 並將值設定為 [&ExecutionTime]。

  2. 加入文字方塊以顯示下列文字行:

    1. 訂單日期

    2. [OrderDate]

  3. 加入文字方塊以顯示下列文字行:

    1. 銷售人員

    2. [SalesPerson], [JobTitle]

    3. [PhoneNumber]

  4. 加入文字方塊以顯示下列文字行:

    1. 採購單

    2. [PurchaseOrderNumber]

  5. 加入文字方塊以顯示下列文字行:

    1. 出貨方法

    2. [ShipMethod]

  6. 對齊這些文字方塊的頂端,並視需要調整其寬度。

若要結合訂單標頭資訊並將它移至清單

  1. 抓取 OrderHeaderData 矩形,並將它拖曳至標誌下方。

  2. 將銷售訂單標頭矩形拖曳至清單。

  3. 具有標誌的矩形會擴展,以便包含訂單資料。

    清單資料格會擴展,以便包含銷售訂單標頭資訊。

建立銷售訂單詳細資料配置

顯示每個銷售訂單的產品項目,包括產品項目號碼。

若要加入資料表來顯示產品項目

  1. 在清單中,抓取資料列控點並擴展資料列高度。

  2. 在銷售訂單標頭下方,於您剛才建立的空間內,插入 [資料表]

  3. 在資料表中,將下列資料從 SalesOrder 資料集拖曳至詳細資料列:

    1. [OrderQty]

    2. [ProductNumber]

    3. [ProductName]

    4. [CarrierTrackingNumber]

    5. [UnitPrice]

    6. 加入預留位置文字。將標籤設定為 [Subtotal] 並將值設定為下列運算式:=Fields!OrderQty.Value * Fields!UnitPrice.Value

    7. 加入預留位置文字。將標籤設定為 [Discount],並將值設定為下列運算式:=0 - Fields!UnitPrice.Value * Fields!OrderQty.Value * Fields!UnitPriceDiscount.Value

    8. [LineTotal]

      [!附註]

      請注意,這個文字方塊命名為 ItemTotal。之後,當您撰寫運算式來計算頁面上所有項目的總計時,就會使用這個文字方塊名稱。

  4. 在資料表的開頭插入資料行。

  5. 在資料行標頭中,輸入行。

  6. 在文字方塊的資料列中,輸入 =RowNum("OrderDetail")

  7. 視需要設定格式。

若要加入資料列總計

  1. 以滑鼠右鍵按一下含有 [Qty] 的資料格,再按一下 [加入總計]

  2. 在文字方塊的最後一個資料列中,於第四個資料行輸入折扣總計:。

  3. 在相鄰的文字方塊中,加入預留位置文字。

  4. 將標籤設定為折扣總計,並將值設定為 =Sum(Fields!UnitPrice.Value * Fields!OrderQty.Value * Fields!UnitPriceDiscount.Value)。

  5. 在文字方塊的最後一個資料列中,於第八個資料行輸入總計:。

  6. 在相鄰的文字方塊中,加入預留位置文字。

  7. 將標籤設定為總計並將值設定為 [Sum(LineTotal)]。

  8. 視需要設定格式。

  9. 移除文字方塊、資料表和矩形之間的所有額外空白。

在銷售訂單詳細資料資料表中,每隔 25 個資料列定義一個分頁符號

若要針對詳細資料群組的每 25 個資料列設定一個分頁符號

  1. 在 [群組] 窗格中,以滑鼠右鍵按一下 OrderDetails_Details_Group,然後指向 [加入群組],再按一下 [父群組]

  2. 加入群組,然後使用下列運算式:=Ceiling(RowNumber("OrderDetail")/25)

  3. [分頁符號] 頁面上,選取 [在群組的每個執行個體之間]

定義 RunningTotals 的報表變數

若要加入報表變數

  1. 以滑鼠右鍵按一下報表背景,然後開啟 [報表屬性]

  2. [變數] 頁面上,加入名為 RunningTotal 的報表變數。

  3. [值] 設定為 =0.0。

定義自訂程式碼來計算累計總數

若要加入自訂程式碼

  1. 以滑鼠右鍵按一下報表背景,然後開啟 [報表屬性]

  2. [程式碼] 頁面上,加入下列程式碼:

    Public Function AddToVariable(var As Microsoft.ReportingServices.ReportProcessing.OnDemandReportObjectModel.Variable, ByVal increment As Double) As Double 
       var.Value = var.Value + increment
       return var.Value
    End Function 
    
    Public Function GetOrResetVariable(var As Microsoft.ReportingServices.ReportProcessing.OnDemandReportObjectModel.Variable, ByVal executeReset As Boolean) 
       if executeReset then
           var.Value = 0
       end if 
       return var.Value
    End Function
    

加入描述

若要加入描述

  1. 在頁尾中,插入 [矩形]

  2. 將描述文字方塊移至矩形中。

  3. 將描述取代成下列文字:

    用途:詳細資料報表。顯示某個訂單範圍的詳細資料,而且是 Employee_Sales_Summary_2008R2 中個人銷售訂單的鑽研報表。包括自由格式的配置、當做清單和資料表使用的 Tablix、子報表、用於計算累計總頁數的工作階段變數、自訂程式碼、影像、根據詳細資料列數目的運算式分頁符號、頁面名稱、報表和群組內的頁碼,以及條件式隱藏文字。

  4. 按一下報表背景,在 [屬性] 窗格中顯示 [報表屬性]

  5. [描述] 中,貼上描述文字。

在頁尾中顯示累計總頁數

若要加入累計總頁數

  1. 加入下列文字的文字方塊:之前總頁數

  2. 使用下列運算式加入相鄰的文字方塊:

    =Code.GetOrResetVariable(Variables!RunningTotal, Globals!OverallPageNumber = 1)

  3. 加入下列文字的文字方塊:目前總頁數

  4. 使用下列運算式加入相鄰的文字方塊:

    =Sum(ReportItems!ItemTotal.Value)

  5. 加入包含下列文字的文字方塊:累計總頁數

  6. 使用下列運算式加入相鄰的文字方塊:

  7. =Code.AddToVariable(Variables!RunningTotal, Sum(Reportitems!ItemTotal.Value))

加入空格字元文字方塊

描述文字具有條件式可見性。當描述隱藏時,總頁數文字就會在頁面的左側轉譯。若要維持總頁數文字在 Rig 上的位置,您必須加入沒有條件式可見性的文字方塊。

若要加入空格字元文字方塊

  1. 在矩形中,於描述上方加入其他文字方塊。

  2. 將文字方塊寬度設定為與矩形具有相同的寬度。

空白文字方塊會在看不到描述時,維持累計總數的位置。

預覽和驗證

若要部署及驗證報表

  • 預覽報表並驗證下列項目:

    1. 商店標頭和詳細資料區域會依照預期方式轉譯。

    2. 子報表會顯示商店連絡資訊。

    3. 目前頁面和之前頁面都有計算總頁數。

    4. 不論描述文字是否顯示,總頁數都會在相同的位置轉譯。

後續步驟

您已經完成這份報表的建立工作。若要建立其他 AdventureWorks 範例報表,請參閱<教學課程:建立 AdventureWorks 2008R2 範例報表>。

請參閱

其他資源

變更記錄

更新的內容

  • 將報表變更為以 AdventureWorks2008R2_Base.rdl 為基礎