群組與聚合
# 組和聚合
# 1. 組示例
在之前的示例中,我們使用Basic_CommonDataType
與Basic_CommonData
來構建主-從數據集報表,如果我們僅用Basic_CommonData
來實現相似的功能,可以使用群組首數據段。
在設計器頁面中插入群組首與主數據兩個數據段,設計方式如下。
注意,在填寫的時候B使用的SQL語句要新增Order By
對FTypeID
進行排序,在輸出的時候將所有分類下的數據集欄位自動歸類。
# 2. 其他組功能
讓我們看一下當報表呼叫新頁面時如何輸出組:
檢視報表發現在檢視的時候可能會不清楚第二頁頂部的資訊是屬於哪一個分組。 FastReport允許在新頁面上輸出組頭。為此,請使用對像檢查器或上下文功能表為「組標題」區域啟用ReprintOnNewPage
屬性。這將改變報表,如下所示:
還有另一種方法可以避免在頁面邊界處破壞組。這是為對像檢查器或上下文功能表中的組頭啟用KeepTogether
屬性。然後,如果整個組不適合輸出頁面上的可用空間,則將其作為整體移動到新頁面。在我們的示例中,出現如下:
某些頁面上可能會留下大量空白,但如果可能,該組將在一頁上顯示完整。
StartNewPage
組標題屬性允許在不同頁面上輸出組。它可能會導致紙張的浪費,但在某些情況下可能會有用。
# 3. 重置頁碼
群組首區域具有ResetPageNumbers
屬性,允許我們在列印組時重置頁碼。它是爲了什麼?
下面是一個示例:您建立了一個報表,該報表將客戶名稱放在數據段中的組頭和客戶訂單中。現在,您需要列印報表並將其發送給所有客戶,每個客戶只需獲得引用它們的報表頁面。遺憾的是,報表中的頁碼編號是連續的,因此獲得編號為50到52的頁面的客戶會詢問「前49頁在哪裡?」。爲了避免這種情況,您必須使用自己的順序為每個客戶的頁面編號。在報表內,每個組的頁面編號為1。
請注意:如果將ResetPageNumbers
設定為True
,則還應將StartNewPage
設定為True
,以便每個組都將在新頁面上啟動。要列印頁碼或總頁數,應使用[Page]
和[TotalPages]
系統變數,而不是[Page#]
和[TotalPages#]
。
# 4. 互動式分組
群組首有一個名為DrillDown
的屬性。如果將其設定為True
,則該組將變為互動式。這意味著您可以單擊預覽視窗中的組標題,組將展開(顯示組中的所有記錄)或摺疊(僅顯示標題,如果ShowFooterIfDrillDown
為True
,則顯示頁尾)。
以下是具有一個擴充套件標頭的此類組的示例:
# 5. 行號
讓我們使用我們的示例來說明如何對組中的行進行編號。為此,我們將兩個包含系統變數[Line]
的文字對像新增到我們的兩個段(可以從右側「數據樹」窗格的「變數」選項卡中拖放來完成)。
在預覽報表時,我們可以看到兩個數據集現在都有自己的行號:
要連續編號第二級數據行,請在數據段上的文字對像中使用[Line#]
變數而不是[Line]
。結果將如下所示:
# 6. 聚合函式
在大多數情況下,組報表需要顯示一些摘要資訊(例如:「組的總數」,「組元素的數量」等)。 FastReport提供聚合函式,用於計算某些數據範圍內的聚合值。聚合函式是:
名稱 | 說明 |
---|---|
SUM | 返回表達式的總和 |
MIN | 返回表達式的最小值 |
MAX | 返回表達式的最大值 |
AVG | 返回表達式的平均值 |
COUNT | 返回數據範圍中的行數 |
所有聚合函式(COUNT除外)的語法類似於SUM函式的語法:
SUM(expression, band, flags)
SUM(expression, band)
SUM(expression)
2
3
參數說明:
expression
:要計算的表達式band
:執行機端的數據段的名稱flags
:一個位欄位,取值說明如下:1
:包含計算中不可見的段。2
:累計聚合作為運行總計(目前數據跨度重置時不要重置聚合)。3
:(前兩個選項都是)。
表達式是唯一的必需參數,其他兩個是可選的。儘管如此,爲了避免出錯,建議始終給出數據段參數。
「COUNT」聚合函式具有以下語法:
COUNT(band, flags)
COUNT(band)
2
其中參數與上述含義相同。
所有聚合函式都有一個通用規則:聚合只能在數據段上計算,並且只能在該段的頁尾中使用,該頁尾可以是以下之一:尾,頁尾,群組尾,列尾或報表頁尾(摘要段)。
聚合函式如何工作?我們將使用前面的示例來檢視此內容。讓我們在報表中新增一些新元素:
在組頁尾中放置一文字對象,其中包含上面顯示的聚合SUM。它將顯示給定客戶下達的所有訂單的總和。使用計算器,我們可以檢查結果是否正確。
聚合函式的工作方式如下:在輸出報表之前,FastReport會掃瞄文字對像內容以查詢任何聚合函式。找到的聚合鏈接到其參數中的數據段(在我們的示例中,「SUM」鏈接到「MasterData1」段)。在報表輸出期間(顯示數據段時),計算鏈接到它的聚合的值。在我們的例子中,B.FInterID
欄位值被累積。一旦輸出顯示聚合的組頁尾,聚合值將重置為零,併爲下一組重複循環,依此類推。
聚合函式中可選「Flags」參數的用途是什麼?報表可能隱藏了部分或全部數據段。但是,我們可能需要計算所有數據段的聚合,無論是否可見。在我們的示例中,將數據段的Visible
屬性設定為false
,以防止其顯示。爲了使這個隱藏的數據段包含在計算中,我們必須在函式呼叫中設定第三個可選參數,如下圖所示,即:
[SUM(<B."FInterID">,MasterData1,1)]
這會產生一個分組統計的報表。
當Flags
參數值設定為2時,聚合值在顯示后不會立即重置:聚合成為每個連續輸出的「運行」計算。讓我們修改函式呼叫,如下所示:
[SUM(<B."FInterID">,MasterData1,3)]
值3
是1
和2
的位組合,這意味著我們需要包括不可見的段,而不需要在每個組之後重置總數。因此,我們有:
# 7. 頁面和報表總計
通常,我們需要顯示頁面或整個報表的摘要總計。我們也可以在這種情況下使用聚合函式。我們將通過對我們的示例進行一些更改來顯示:
正如您所看到的,我們新增了一個「報表(報告)摘要」數據段,其中包含文字對象,其中聚合SUM指向「報表(報告)摘要」區域和「頁尾」區域。這就是所需要的:
# 8. 插入聚合函式
到目前為止,我們已將聚合函式手動插入文字對象。現在我們將看看插入聚合函式的其他方法。
首先,我們可以使用「系統文字」對像來輸出聚合。事實上,這個對像類似於「Text」對象,它有自己 的特殊編輯器,可以更輕鬆地指定系統變數或聚合函式:
選擇一個函式型別,然後選擇一個數據段(在其上計算聚合),最後選擇一個欄位或要計算其值的表達式。如果需要,您還可以設定計算不可見band數目
和執行總數
標記。
第二種方法是使用文字對象並單擊其編輯器中的/按鈕:這將打開類似於「系統文字」對像編輯器的對話方塊。單擊「確定」按鈕時,會將對聚合函式的呼叫插入到對象的文字中。