報表設計基礎
# 報表設計基礎
FastReport設計器將報表(報告)表示為原理圖頁面的集合。 對像放置在報表(報告)頁面上的任何位置,用於定義報表(報告)的外觀並顯示各種資訊,例如文字和圖形。 標準軟體包中包含的FastReport對像有:
圖示 | 名稱 | 說明 |
---|---|---|
插入數據段 | 設計頁面上根據其型別表現的區域(例如標題數據段,數據數據段) | |
文字對像 | 在矩形區域內顯示一行或多行文字 | |
圖片對像 | 以BMP ,JPEG ,ICO ,WMF 或EMF 格式顯示圖形檔案 | |
系統文字 | 顯示系統資訊(日期,時間,頁碼等)或合計值等 | |
子報表對像 | 允許在宿主頁面中插入另一個報表設計頁面 | |
繪製 | 顯示各種幾何形狀(對角線,矩形,圓角矩形,橢圓形,三角形和菱形) | |
圖表對像 | 以各種圖表格式(餅圖,直方圖等)顯示數據 | |
富文字對像 | 以RTF(富文字)格式顯示文字 | |
覈取方塊對像 | 顯示帶有打勾或叉號的覈取方塊 | |
條形碼對像 | 根據數值顯示條形碼或者二維碼的元件 | |
交叉表對像 | 顯示交叉數據表的對象,數據通過手工或者指令碼引入 | |
DB交叉表對像 | 顯示交叉數據表的對象,數據來源於資料庫的欄位 | |
圖表對像 | 顯示圖表數據的資訊 | |
漸變色對像 | 作為背景使用,顯示漸變的顏色 | |
條形碼對像 | 用作顯示條形碼或者二維碼的對象 |
Flying中包含的擴充套件對像如下:
圖示 | 名稱 | 說明 |
---|---|---|
郵政編碼對像 | 用於展示郵政編碼型別的對象 | |
網格文字對像 | 金融應用中使用較多,使用方式與文字對像類似 | |
地圖對像 | 用於展示地圖等相關資訊的對象 | |
儀表對像 | 用於展示儀表等相關的功能 | |
間距標尺儀表對像 | 用於展示包含間距測量功能的儀表 | |
最常用的基本對象是數據段和文字對象。 您將在本節詳細瞭解它們的功能。
# 1. HelloWorld報表示例
示例報表(報告)僅包含一條資訊:「 Hello,World!」。 打開報表設計器,然後單擊對像工具欄中的「文字對像」按鈕。 將滑鼠游標移到頁面上,然後再次單擊。 該對像將插入到滑鼠位置。
文字編輯器視窗將立即打開; 如果它沒有自動出現,則雙擊該對象。 可以在設計器設定中配置文字編輯器的打開。 輸入「 Hello,World!」,然後單擊[確定]
按鈕。
報表(報告)設計完成。 要預覽報表(報告),請選擇[檔案]
-[預覽]
功能表項,或單擊工具欄中的相應按鈕。 將出現預覽視窗,其中包含帶有「 Hello,World!」文字的報表(報告)頁面。 該報表(報告)可以列印出來,可儲存到檔案(* .fr3)或導出為支援的導出格式。
# 2. 文字對像
# 2.1. 基本使用方式
文字對像具有許多功能。 它可以在框架中顯示文字並用一種顏色填充。 可以使用任何大小和樣式的任何字型顯示文字。 可以在工具欄上直觀地設定所有屬性。以下是一些文字設計示例:
現在,讓我們看一下該基本對象的其他功能。 例如,讓我們建立一個新的文字對像以顯示兩行文字:
This is a very, very, very long text line.
And this is another line, the shorter one.
從工具欄啟用對像邊框,然後使用滑鼠將對像調整為最大9x3cm的大小。 我們看到對像不僅可以顯示一行,而且可以顯示多行文字。 現在將對像寬度減小到5釐米。 顯然,長文字不適合邊框內容,因此被換行了。 這是由WordWrap
對像屬性控制。 如果禁用該功能(在對像檢視器中或通過對像上下文功能表),任何長行都將被裁切。
現在,讓我們看看對像內部的文字對齊方式是如何工作的。 對齊按鈕位於文字格式工具欄中,用於控制水平或垂直文字對齊。 注意兩端對齊按鈕,該按鈕可讓您將段落對齊到對象的兩個邊緣。為此,必須啟用WordWrap
。
對像中的所有文字都可以旋轉到0..360°範圍內的任何角度。 文字格式工具欄中的[文字方向]
按鈕可讓您快速將文字旋轉到0、45、90、180或270°的預設值。 對於任何其他值,請在對像檢視器的Rotation
屬性中設定所需的角度。 如下圖所示,將文字旋轉到90、180或270°以外的角度時,文字可能會被對象的邊框切斷。 要解決此問題,請稍微增加對像高度,以使所有文字都適合對象。
讓我們簡要地看一下影響其外觀的其他文字對像屬性。 這些屬性大多數僅在對像檢視器中可用:
- BrushStyle: 對像填充的型別
- CharSpacing: 在字元之間進行儲存(以畫素為單位)
- GapX,GapY: 左右邊緣的文字縮排,以畫素為單位
- LineSpacing: 行間距,以畫素為單位
- ParagraphGap: 段落的第一行縮排,以畫素為單位
# 2.2. 在文字對像中使用HTML標籤
文字對象可識別一些簡單的HTML標籤。 標籤可以位於對象的文字內。 預設情況下,標籤是禁用的,要啟用它們,請在對象的右鍵功能表中選擇[允許HTML標記]
,或者在對像檢查器中啟用AllowHTMLTags
屬性。 以下是受支援標籤的列表:
<b>:粗體
<i>:斜體文字
<u>:帶下劃線的文字
<sub>:下標
<sup>:上標
<font color>:字型顏色
<nowrap>:啟用WordWrap時未拆分的文字,整個文字移至下一行
2
3
4
5
6
7
請注意,文字對像僅支援少量標籤,但這對於大多數應用程式來說已經足夠。 無法通過HTML標記修改字型大小或名稱。
以下示例將展示如何使用這些標籤。
text <b>bold text</b> <i>text in italic</i> <b><i>bold and in italic</b></i>
E = mc<sup>2</sup>
A<sub>1</sub> = B<sup>2</sup>
this is a usual text, <font color=red>and this is a red one</font>
this is a usual text, <font color="#FF8030">and this is an orange one</font>
2
3
4
5
# 2.3. 在文字對像中顯示錶達式
文字對象的最重要特徵之一是它不僅可以顯示靜態文字,還可以顯示錶達式。 表達式可以位於與普通文字混合在一起的對象中。 讓我們看一個簡單的例子。 在對像中鍵入以下內容:
Hello, World! Today is [DATE].
運行報表時,我們可以得到類似如下資訊:
Hello, World! Today is 01.01.2018.
當報表引擎建立報表(報告)並遇到方括號中的表達式時,報表引擎將計算該表達式的值,並將該值插入文字中以代替該表達式。 文字對象可以包含任意數量的與普通文字混合的表達式。 複雜表達式可以包含方括號(例如[1 + 2 *(3 + 4)])。 常量,變數,函式和數據表字段都可以在表達式中使用。 我們將在後面詳細瞭解這些內容。
報表引擎可以自動識別文字中方括號內的表達式。 但是,如果我們的普通文字包含不希望被視為表達式的方括號,會發生什麼? 例如,如果我們需要顯示以下內容:
a[1] := 10
報表引擎會將[1]
視為表達式並將文字顯示為:
a1 := 10
當然,這不是我們想要的。 避免這種情況發生的其中一種方法是禁用表達式識別。 禁用AllowExpressions
屬性(或右鍵功能表中的[允許表達式]
),文字中的所有表達式將被忽略。 在我們的示例中,報表引擎將準確顯示我們需要的內容:
a[1] := 10
但是有時文字需要同時包含表達式和帶方括號的普通文字,例如:
a[1] := [myVar]
禁用AllowExpressions
可以使我們在所需的位置顯示方括號,但同時也禁用對錶達式的處理。 在這種情況下,報表引擎允許您使用另一組符號來指定表達式。 預設情況下, ExpressionDelimiters
屬性值為[,]
。 在我們的示例中,我們可以使用尖括號代替表達式:
a[1] := <myVar>
必須在 ExpressionDelimiters
屬性中設定<,>
,在此屬性中需要使用逗號分隔開頭和結尾符號。 另一個要求是,開始和結束符號不能相同,因此%,%
將不起作用。 可以使用複數符號,例如<%,%>
。 因此我們的示例可能如下所示:
a[1] := <%myVar%>
# 3. 數據段(顯示區域)
數據段用於將它們包含的對象放置在輸出頁面上的特定位置。 將對像放在PageHeader(頁首)
區域中時,我們告訴報表引擎,給定的對象必須顯示在完成的報表中每個頁面的頂部。 同樣, PageFooter(頁尾)
區域中的對象顯示在每個頁面的底部。 讓我們用一個例子來證明這一點。 我們將在頁面頂部建立一個包含「 Hello!」的報表(報告),其右側為目前日期,在頁面底部的右側為頁碼。
打開報表設計器后 您將看到一個報表(報告)模板,首先使用報表設計器插入三個區域:「 ReportTitle」(報表抬頭),「 MasterData」(主數據)和「 PageFooter」(頁尾)。 讓我們先暫時刪除「 MasterData」區域(單擊該區域內部或其標題上的任何可用空間,然後使用右鍵功能表中的[刪除]
或按下Delete按鍵將其刪除)。 現在,我們新增一個新的數據段(「 PageHeader(頁首)」)。 單擊對像工具欄上的[插入數據段]
按鈕,然後從下拉選單中選擇[頁首]
」。 我們看到一個新的數據段被新增到頁面。 同時將現有數據段下移。 報表設計器自動在頁面上放置區域(標題區域在頂部,數據區域在中間,頁尾在底部)。
現在,我們新增一些對象。 在「 PageHeader」區域中新增一個系統文字對象,然後在其編輯器中,從[變數]-[系統變數]
的列表中選擇、DATE
(目前日期也可以通過文字對像顯示) 在其編輯器中會鍵入[DATE]
。 接下來,將一個包含「 Hello!」的文字對像新增到「 ReportTitle」區域。 將顯示頁碼的文字第[<Page>]頁 共[<TotalPages>]頁
對像新增到「 PageFooter」區域。注意在報表-選項
中要勾選兩遍過程
,否則文字的總頁數不顯示。
運行報表(報告)時,您將看到完成的報表(報告)中的對象被列印在頁面上的適當位置。
數據段負責在頁面上定位對象。 根據數據段的型別,我們可以在頁面頂部或底部以及第一頁或最後一頁上列印對象。 大多數報表(報告)中需要的基本範圍如下:
- PageHeader(頁首): 顯示在每頁的頂部
- PageFooter(頁尾): 顯示在每頁的最底部
- ReportTitle(報表抬頭): 顯示在第一頁的頂部-可以在「 PageHeader」區域之前或之後,具體取決於頁面的
TitleBeforeHeader
屬性(在單擊頁面上的任何可用空間后在對像檢查器中找到 ) - ReportSummary(報表合計): 顯示在報表(報告)末尾的空白處
# 3.1. 數據數據段
現在,我們將學習如何從資料庫表中列印數據。資料庫表由組織成行(記錄或行)的數據組成,其中包含一個或多個列(欄位)。 爲了列印這些數據,FastReport使用一種特殊的數據段,將各種數據段命名為... Data
。 要列印整個表格或其中的某些行和欄位,必須將一個或多個這些數據段新增到報表中,將它們連線到表格並將欄位對像放在其中。 當FastReport產生報表(報告)時,數據段區將被列印在輸出頁面上,表中的每個記錄都會輸出一次。 如果數據段的輸出頁面上沒有剩餘空間,則報表引擎將建立一個新的輸出頁面以繼續接上頁進行輸出。
# 3.2. 匯入數據集
爲了使數據集(及其連線的數據)可用於報表,必須啟用報表中使用的所有數據集。 通過FastReport設計器中的[報表]
-[數據...]
功能表項執行此操作,在打開的對話方塊中選擇所需的數據集。
# 3.3. 在文字對像中顯示資料庫欄位
如您所見,文字對像除可以顯示資料庫中的數據以及靜態文字和表達式外,還可以通過兩種方式完成此操作:通過將指向資料庫欄位的鏈接放在對像文字中,或者通過對象的 DataSet
和 DataField
屬性將對像連線到所需欄位。 第一種方法適用於在同一對像中同時顯示欄位內容和限定文字。 例如:
物料程式碼:[dts1."FItemCode"]
指向資料庫欄位的鏈接需要特殊的語法:[datasetname.「fieldname」]
。 欄位名稱(以及數據集名稱)可以包含空格,但點和引號符號之間不能有任何空格。
此外,我們還可以將計算操作應用於表達式中的欄位,如下所示:
物料程式碼: [<dts1."FInterID"> * 1]
請注意必須使用方括號和尖括號。 請記住,預設情況下使用方括號來分隔對像文字中的表達式。 如有需要,方括號可以替換為其他任何打開/關閉字元對(請參考在文字對像中顯示錶達式)。 表達式內部使用尖括號來描述FastReport變數或資料庫欄位。 邏輯上我們應該寫:
物料程式碼:[<dts1."FItemCode">]
而不是
物料程式碼:[dts1."FItemCode"]
但是,這兩種表示法都是正確的,因為FastReport不需要尖括號,其中表達式僅包含變數或僅包含資料庫欄位。 在所有其他情況下,都需要使用尖括號。
# 4. 變數
在上述示例中,數據集名稱和欄位名稱均為數據表中指定的內容,對於製作報表來說可能會難以理解,在SQL中可以使用別名的方式使數據集中的欄位名稱便於理解,這種方式也可以用在FastReport的數據集構建過程中,除此之外,FastReport還有另一種方法可以幫助報表設計者為資料庫欄位和其他資訊元素設定更易理解的名稱。資料庫欄位名稱或任何表達式都可以與變數關聯。要在FastReport中建立和使用變數,請選擇[報表(報告)]
-[變數...]
功能表項。
FastReport中的變數列表具有兩級結構。第一級僅包含類別,第二級包含變數本身。當變數列表很長時,此變數分類很方便。變數列表必須至少包含一個類別,這意味著變數不能位於頂層。此外,類別名稱不能包含在報表中,因此列表中的每個名稱都必須是唯一的。
讓我們通過以下示例來說明變數的用法。假設我們有兩個數據源:第一個是帶有FItemCode
和FItemName
欄位的dts1
,來源於FastERP
資料庫中的Basic_Item
表,第二個是帶有FCompanyCode
和FCompanyName
欄位的Basic_Company
表。我們可以將以下變數列表與欄位相關聯:
公司
公司編號
公司名稱
物料
物料編號
物料名稱
2
3
4
5
6
其中「公司」和「物料」是兩個類別。打開變數編輯器,並使用[類別]
,[變數]
和[編輯]
按鈕建立此結構。

工具欄中分別為類別、變數、編輯、刪除、列表、匯入、導出、取消、確定按鈕。
也可點選工具欄中的第五個按鈕[列表]
,在出現的字串清單界面快速設計類別與變數目錄。
要將變數鏈接到資料庫欄位,請選擇一個變數,然後在右側窗格中雙擊所需的欄位。資料庫欄位的鏈接將顯示在底部窗格中。此時變數已與此表達式關聯,因此變數的值成為表達式的值。如有必要,可以手動編輯或修改表達式,並且可以在其中使用任何FastReport函式或其他變數。請記住,類別不得與任何表達式關聯。
建立變數列表后,關閉變數編輯器。現在我們可以將變數插入報表中。與資料庫欄位相比,插入方法較少。我們可以通過鍵入[物料名稱]
將變數手動插入對像文字中,也可以將變數從數據樹窗格拖到報表頁面上,在這種情況下,請切換到變數選項卡窗格。
讓我們回顧一下到目前為止所學到的知識點:
- 報表(報告)設計由設計頁面組成
- 頁面可能包含報表對象,可以放置在頁面上或在數據段內
- 數據段是設計頁上的佔位符,並根據數據段型別控制它們包含的對象在輸出頁上的顯示位置
- 文字對像包含我們要在給定位置輸出的文字,它們可以多行顯示,並且可以包含靜態文字,數據欄位,變數,表達式或所有這些的組合
- 數據型別數據段(主數據、明細數據、子明細數據),當連線到數據集時,會控制這些數據段出現(行)的次數,並與報表引擎一起確定報表輸出的完成頁面數。注意:即使這些數據波段可能具有諸如「主數據」,「明細數據」之類的型別,但這僅是數據段在輸出頁面上的分層位置的位置關係。實際的數據關係取決於所連線的數據集中的表/查詢關係。每個數據數據段都需要一個單獨的或等效的數據集來關聯。
# 5. 圖片對像
使用此對象,您可以插入圖表,照片或任何其他圖片資訊。 該對象可以顯示「 BMP」,「 JPEG」,「 ICO」,「 WMF」或「 EMF」格式的圖形。
讓我們看一下該對象的功能。 在報表頁面上放置一個圖片對象。 如果圖片編輯器沒有自動打開,則雙擊「圖片」對象。 您可以從圖形檔案中載入任何圖片,也可以清除現有圖片並通過單擊綠色的勾來關閉編輯器。

對象的某些屬性在右鍵功能表以及對像檢視器中可用:
- AutoSize: 自動大小
- Stretch: 伸縮,預設啟用
- Center: 中間
- KeepAspectRatio: 保持縱橫比率,預設啟用
僅在對像檢視器中可用的一個屬性是FileLink
,輸入檔名(例如c: picture.bmp)或包含檔名的變數(例如[picture_file]),將在運行報表時從命名檔案中載入圖片。
像FastReport中的許多對像一樣,圖片對象可以顯示來自資料庫的數據。通過在對像檢查器中設定DataSet
和DataField
屬性,可以將該對像連線到資料庫欄位。與文字對像相反,這是將對像連線到其數據的唯一方法。
# 6. 多行文字顯示優化
在實際的報表操作中,有時可能會遇到需要列印備註的情況,如果需要列印備註,需要在報表中新增該欄位來更新報表(報告)。
乍一看,這似乎很容易-在現有對象之間的數據數據段中新增一個文字對象,將其連線到註釋(FastERP中註釋欄位名為FNote
)欄位,並將對象的大小設定為一個固定數值。但是,報表(報告)預覽並不是我們想要的:FastReport完全按照指示執行。 註釋欄位包含長度可變的多行文字,但是顯示該欄位資訊的文字對像具有固定大小。這就是為什麼某些行似乎被切斷的原因。
當然,可以增加對象的大小或減小其字型的大小。但是,這可能會導致輸出頁面上的空間浪費,因為有些備註資訊可能會很長,有些會很短。FastReport提供了一些屬性用來解決這個問題。
這些屬性允許數據段或對像自動調整其高度,為給定記錄(行)建立必要的空間。為此,我們只需要啟用數據段和文字對象的Stretch
屬性。但是,這還不夠,因為文字較長的文字對像應該能夠自行拉伸,因此我們還需要設定其他一些屬性。
文字對象可以自動設定其高度和寬度,以為其內容騰出空間。可以使用AutoWidth
和StretchMode
。AutoWidth
允許文字對像改變其寬度,以使所有行都留出空間而不會拆分任何單詞。當一個對像只有一個文字行並且向右增長不會影響其他對像時,此模式很有用。 Stretch
屬性允許對象的高度增加以容納文字,而無需更改對象的寬度。 Stretch
有幾種模式可以在對像檢查器中選擇:
- smDontStretch –不拉伸對像(預設)
- smActualHeight –拉伸對象,以便為整個文字騰出空間
- smMaxHeight –拉伸對象,使其底部到達放置對象的區域的底部,我們將在以表格形式展現數據介紹此模式
在這裡,我們對文字對象的屬性感興趣。通過對像檢視器將StretchMode
設定為smActualHeight
啟用它。同時啟用數據段的Stretched
屬性。預覽報表(報告),並確保現在一切都按預期進行。

如您所見,在構建報表時,FastReport使用數據填充對象,並在啟用拉伸的情況下拉伸對象。然後計算數據段的高度,以便每個對象都有足夠的空間。如果禁用了數據段的拉伸屬性,則不會執行此高度調整,並且頻段將以設計中設定的高度顯示。在這種情況下,我們將看到具有較長文字的對象仍將被拉伸,但是數據段不會被拉伸,這會導致文字覆蓋。
# 7. 數據分隔
讓我們看一下上圖中顯示的報表(報告)內容顯示區域的特別之處:頁面底部有很多空白。 為什麼會出現這樣的情況?建立報表(報告)后,FastReport引擎將數據段填充頁面的空白區域。 顯示每個數據段后,目前位置向下移動。 當FastReport發現沒有足夠的空白顯示下一個區域時(其高度大於頁面上剩餘的空白),FastReport會建立一個新頁面並從此處繼續顯示。
報表(報告)包含一個大文字的對象的數據段,這就是數據段高度很大的原因。 此外,如果較大的數據段區在頁面上沒有足夠的空間顯示,則將其移至下一個數據段區,從而在頁面底部留下大量未使用的空間。
爲了減少紙張浪費,我們需要使用FastReport中的一個功能,該功能可以根據數據段的內容製作段落。 我們需要做的就是啟用MasterData 數據段的AllowSplit
屬性。 您將看到報表(報告)頁面底部的空白越來越少:
此數據段拆分如何工作? FastReport中有一些對像支援此功能。 它們是文字對像和Rich文字(富文字)對象。 它們可以拆分,而其他對像則不能。 當FastReport需要拆分數據段時,它會通過以下方式進行拆分:
- 顯示在空白區域有空間的不可拆分對像
- 部分顯示可拆分的對象(文字對像以對像中所有行都有空格的方式顯示)
- 建立一個新頁面並繼續顯示對像
- 如果不可拆分的對象在空白區域中沒有空間,則將其移至下一頁; 同時,位於其下方的所有對象均根據需要移動
- 該過程一直持續到所有數據段對象都完全顯示為止。
以下示例為拆分的具體過程分析:
分割演算法並不完美,最終輸出可能與預期不符。 如果分割數據段上的對象以複雜的方式分組和/或它們的字型大小不同,則應非常謹慎地使用此選項。 這是可能產生的示例:
# 8. 對象的文字換行
在某些報表設計中,可能需要文字來包裹其他對像(通常在使用圖片時)。 讓我們在目前示例中演示FastReport如何做到這一點。
在下方的數據數據段中再新增一個文字對象。示例如下所示:
我們將為[Bio."Notes"]
對像禁用拉伸,併爲底部對像啟用拉伸。使文字從[Bio."Notes"]
對像「流動」到底部,在對像檢視器中設定[Bio."Notes"]
對象的FlowTo
屬性,這是一個下拉選單。從此列表中選擇底部對象的名稱。結果報表(報告)將如下所示:

產生報表(報告)時,如果文字不適合頂部對象,則多餘部分將移至底部對象。通過將兩個對像排列在圖片周圍,可以實現文字環繞效果。
請注意: 在插入鏈接的對象之前,必須在報表中插入主要對象,否則文字流動可能無法正常工作!如果發生這種情況,請選擇鏈接的對象,然後使用[編輯]
-[置於頂層]
功能表項將其置於最前。
# 9. 以表格形式展現數據
有時有必要以框架表的形式來顯示數據。要在FastReport中建立這種型別的報表(報告),只需為位於數據數據段中的對象啟用框架即可。 讓我們用一個示例來演示框架的幾種變體。
建立與此類似的報表(報告):
將文字對象並排放置在數據段上,並最小化數據段的高度。
第一種也是最簡單的表具有完整的單元框架。 為此,請為每個對像啟用所有框架線(位於Frame.Typ
屬性中):
再次通過設定Frame.Typ
屬性,框架僅繪製水平或垂直單元格線:
最後,要僅在表上繪製外部框架,需要對報表(報告)進行修改:
可以看到,我們新增了兩個文字對象,一個在頁首,另一個在頁面頁尾區域中。 啟用了沿數據數據段邊緣的對象的適當框架線,結果報表(報告)如下所示:
所有這些示例都包含大小固定的數據段。 伸展數據段時如何顯示錶格? 讓我們通過一個例子來解釋。 在我們的報表(報告)中新增一個新欄位FNote
。 正如您已經瞭解的那樣,必須為此對像以及對像所在的數據段都啟用Stretch
屬性,以便更改數據段高度,具體取決於文字對像中文字的大小。 產生的報表(報告)如下所示:

這與我們需要的有所不同。如果相鄰對象的框架也拉伸,則看起來會更好。 FastReport可以輕鬆解決此問題。 在對像檢視器中,將所有要拉伸的對象的StretchMode
屬性設定為smMaxHeight
,FastReport引擎將首先計算最大帶高度,然後在啟用拉伸的情況下拉伸對像到數據段的底部邊緣。 由於對像框架與對像一起伸展,因此報表的外觀會發生變化:

# 10. 標籤報表(顯示順序)
與表格型別的報表(報告)相比,其他報表(報告)(例如標籤報表(報告))可能會將數據安排在一個欄位的另一欄位下。 讓我們看一看此類報表(報告)的示例,該示例顯示有關物料的數據,如前一個示例所示。 報表(報告)數據以標籤形式顯示,並具有以下結構:
預覽效果如下:
請注意,頁面右側有很多空白。 要使用整個頁面,可以在報表(報告)頁面設定中設定顯示數據的列數。 為此,請雙擊設計頁面上的空白區域,或使用功能表上的[檔案]
-[頁面設定...]
。
在對話方塊的[其他選項]
選項卡上設定欄數,欄間距和位置。 在我們的示例中,欄數需要設定為3,FastReport會自動調整其他選項。 列框架在設計器中顯示為垂直細線:
現在可以通過以下方式建立報表(報告)。 只要頁面底部有空白,FastReport就會重複主數據數據段。 之後,將在同一頁面上建立一個新列,並且數據數據段將從新列的頂部開始重複:這與簡單報表形成對比,在簡單報表中,將建立一個新頁面而不是一個新列。 當第二列被填充后,將建立第三列,依此類推-我們的示例中有三列。 當所有列都填滿后,FastReport將建立一個新頁面並繼續從第一列開始顯示數據。
我們的三列報表(報告)如下所示:
對像檢視器中可用於所有數據數據段的Coloums
屬性是設定列數的另一種方法。 但是,如果將此屬性從零更改,則僅針對所選數據數據段而不是整個頁面設定列數(如上例所示)。 效果是首先從「從左到右然後從上到下」顯示數據,這與上面顯示的「從上到下然後從左到右」輸出相反。
在[頁面設定]
對話方塊中禁用列(將[欄數]
設定為1),然後在數據數據段的Coloums
屬性中輸入3。 請注意,ColumnWidth
屬性也必須從預設值零更改,以防止第2列第3列與第1列重疊; 也可以選擇更改[欄間距]
屬性。 然後,FastReport將列框架顯示為虛線:
此設計以「從左到右然後從上到下」的順序顯示數據。
# 11. 子數據段
當標籤型別報表(報告)中的一個欄位的內容長度可變時,可能會出現問題。 爲了在我們的示例中模擬此情況,讓我們將[dts1."FNote"]
對象的寬度減小到2.5釐米,併爲此對像以及數據段啟用 Stretch
屬性。 啟用所有對象的所有框架線,以使拉伸功能的效果清晰可見。 現在,設計輸出如下報表(報告):
在這裡,[dts1."FNote"]
欄位對像包含很多文字,並被拉伸成多行。 這會使位於其下方的對象向下移動。 發生這種情況的原因是,所有對象的預設ShiftMode
屬性均設定為smAlways
,這意味著如果它們上方有可拉伸對像(啟用了Stretch
屬性的文字對像),則它們將向下移動。 偏移的距離取決於上方對象的伸展程度。
我們不希望在標籤上發生這樣的事情,我們希望[dts1."FItemName"]
對象也能移動相同的量。 此時我們可以通過使用特殊的FastReport數據段型別(稱為子數據段)來實現。 子數據段鏈接到其父數據段(並顯示在其父數據段之後)。 在設計中新增一個子數據段,並將兩個文字對像拖到其中,如下所示:
通過在對像檢視器中將MasterData 數據段的Child
屬性設定為 Child1
,將MasterData 數據段鏈接到Child 數據段。 現在,每次MasterData 數據段顯示時,Child 數據段都將緊隨其後顯示:
現在,子數據段中的內容完全對齊。要防止子數據段在頁面上的空白空間不足(從其父數據段變為「孤立」)的情況下移至下一頁,請在對像檢視器中啟用父數據段的KeepChild
屬性。
# 12. 轉移對像
您已經瞭解了smAlways
如何用於ShiftMode
屬性。 讓我們看一下smWhenOverlapped
。 在此模式下,當上方的對象伸展並與下方的對象重疊時,會發生對像移動。
頂部的三個對像啟用了拉伸,底部的三個對像將
ShiftMode
設定為smAlways
。 底部對像僅移動足夠遠,以為其上方的對象拉伸留出空間:三個頂部對像已啟用拉伸,三個底部對像已將
ShiftMode
設定為smWhenOverlapped
。 底部對像移動以為拉伸的對象留出空間,並保持兩個對象的間隔:這樣就可以建立複雜的報表(報告),特別是在一個對象可能同時與上面其他幾個對像重疊的情況下。 在下面的示例中,所有上部對像均包含可拉伸文字,所有下部對像均處於
smWhenOverlapped
模式。 下部對像將始終顯示在上方對像附近,而與上方對像中的文字長度無關。
# 13. 主-從數據集報表
到目前為止,我們的示例報表(報告)僅使用一個數據集(「一級數據」或MasterData)來控制數據輸出。 這足以從一個資料庫表中輸出數據。 FastReport還允許設計的報表(報告)最多具有六個數據級別,所有這些數據級別都在一個設計頁面上。 此外,通過使用子報表對象可以實現報表(報告)中無限數量的數據級別。 通常,大多數報表(報告)僅需要一個,兩個或三個數據級別,很少有大量數據級別。
讓我們看看如何設計兩個數據級別的報表(報告)。分別使用FastERP
中的兩種數據表Basic_CommonDataType
與Basic_CommonData
,分別對應為主-從數據表。將這兩個表種的數據製作成為對應的數據集A
、B
。
在報表設計器中,在[報表]-[數據]
對話方塊中勾選使用的數據源,新增一個主數據
和明細數據
。並在其中設定以下欄位內容。
主數據必須放在明細數據上方,否則在產生報表時會產生出錯資訊。
如果現在執行預覽報表,您會發現每個B的列表都沒有發生變化,這是因為我們還沒有鏈接相關的屬性。雙擊明細表,在其過濾條件中輸入<A."FInterID">=<B."FTypeID">
,即表示的是,在輸出這些資料時,只有屬於目前分類下的資料才會顯示在明細數據中。這是一個需要掌握的重要概念。儘管數據段可以是主數據段或詳細型別,但它們僅控制輸出頁面上數據的定位(顯示的順序和次數)。由條段中的對象顯示的數據取決於對像鏈接到哪些欄位以及兩個表的外部鏈接。儲存確認後進行預覽。

# 14. 數據段的頁首頁尾
每個數據段可以具有頁首和頁尾。首先輸出標題,然後輸出數據段中的所有記錄,最後輸出頁尾。以下是頁首和頁尾如何在簡單報表中工作的示例:
讓我們看一個使用兩個數據級別的更復雜的例子 - 主數據和詳細資訊:
如您所見,標頭在所有數據段記錄之前輸出。因此,主數據頭在報表開始時輸出一次,並且在屬於目前主記錄段的每組細節段之前輸出詳細數據頭。在輸出所有主數據段記錄之後,直到屬於主記錄段和主頁尾的細節段組才輸出之後輸出細節頁尾。
使用數據段的FooterAfterEach
屬性,我們可以覆蓋此行為。將此屬性設定為True(您也可以使用數據段的上下文功能表 - 每行後腳注
)在每個數據行之後導致頁尾輸出。這在設計一些主 -明細報表時可能很有用。如果主數據段的FooterAfterEach
設定為True,則報表將如下所示:
# 15. 多頁報表
FastReport報表可以包含多個設計頁面。多頁設計允許調整每個頁面的大小和方向等屬性,以及允許在頁面上放置對像和數據段的位置。當輸出這種型別的報表時,將顯示來自第一個設計頁面的所有段,然後顯示來自第二個頁面的段,依此類推。
在設計器中建立新報表時,預設情況下它包含一個頁面。您可以通過單擊工具欄中的/按鈕或選擇檔案-新頁面
功能表命令來新增新頁面。然後您會看到設計器中出現一個新頁面選項卡:
您可以通過單擊頁面選項卡輕鬆切換頁面。可以拖動頁面選項卡(「拖放」)以輕鬆更改其列印順序。可以使用工具欄中的/按鈕或選擇編輯-刪除頁
功能表命令刪除不必要的頁面。您也可以通過右鍵單擊頁面選項卡來呼叫上下文功能表:
報表中的設計頁面數量不受限制。通常,附加頁面用於標題頁,或者在更復雜的報表中,用於來自許多數據源的數據。
以下是建立標題頁的簡單示例。讓我們使用我們之前的報表,它有一個數據級別。向其新增新頁面,它將作為第二頁新增。通過使用滑鼠抓住page2選項卡並將其拖到第一頁選項卡page1上,將其移動到報表的前面。這會更改頁面順序。選擇新頁面並在頁面中間放置一個包含「我們的報表」的「文字」對象。這就是所需要的。標題頁的報表已完成:

但是,請注意多頁報表的一個功能。如果在第二個輸出頁面的對象檢查器中啟用了PrintOnPreviousPage
屬性,則第二個輸出頁面的對象將開始在第一個輸出頁面的空白區域上列印,而不是在新的輸出頁面上列印。
# 16. RowCount與PageCount屬性
有時需要多次顯示靜態數據,例如在列印「空白」名片或明信片時。為此,數據段具有RowCount
屬性,報表頁面具有PageCount
屬性。
這兩個屬性控制報表中的段/頁重複的程度,而不受報表數據的影響。