星期五, 1月 20, 2023

[SSRS] 電子發票 - 報表設計

公司導入電子發票,被要求要能列印 A4、A5 格式,根據 電子發票實施作業要點 P12 A5 範例,截圖如下來設計

[SSRS] 電子發票 - 報表設計-1
個人設計是把這兩頁當成兩張報表來設計,第一頁稱呼為主頁,第二頁為明細頁,因為明細頁設計方式會涵蓋主頁,該紀錄會以明細頁為主,歸納明細頁報表重點,分別為
  • 分頁顯示標題列
  • 強迫固定每頁資料筆數
  • 資料表最後橫線
  • 頁數顯示
主頁則是應用到 [強迫固定每頁資料筆數] 和 [頁數顯示] 這兩點而已

Layout 設計 

下圖為明細頁 Layout 設計,其實很單純

[SSRS] 電子發票 - 報表設計-6

分頁顯示標題列

明細頁超過一頁時,後續頁面也必須能夠正常顯示標題列,參考 [SSRS] 分頁資料表標題列

強迫固定每頁資料筆數

  • 確定 tablix 一筆資料要一行或 N 行來顯示,並取消 tablix 內文字方塊的 [允許高度增加 (預設為啟用)],資料太長會被截斷不折行
  • 補齊固定資料筆數的空白資料,數值型態預設值為 0,必須透過條件設定來隱藏,所謂的隱藏就是變更字型顏色,0 的話就跟背景同色,背景顏色理論上是白色才是
取消文字方塊的 [允許高度增加 (預設為啟用)]
 
[SSRS] 電子發票 - 報表設計-2

依據條件來變化字型顏色,在報表內有兩種做法
  • 資料來源有一個 flag 欄位,根據該欄位來判斷
  • 判斷數值是否為 0
下圖是以數值為 0 來判斷來變更字型顏色

[SSRS] 電子發票 - 報表設計-9

資料表最後橫線

tablix 框線設定分別為
  • 標題列:預設有外框線(上下左右)
  • 資料列:設定只有左框線和右框線就行
  • 最後橫線:頁尾頂端放一條同 tablix 等寬線條來呈現,再透過調整頁尾高度來讓頁尾線條逼近 tablix 
tablix 資料列和資料列之間不顯示橫線,所以資料列無法使用下框線,因為強迫固定每頁資料筆數,所以資料列會一直延伸到接近頁尾才會進行換頁

下圖框線設定 (紅線:標題列、綠線:資料列、黃線:最後橫線)
[SSRS] 電子發票 - 報表設計-3

最後橫線是苦力慢慢調整逼近 tablix,下圖是還沒有調整到位情況

[SSRS] 電子發票 - 報表設計-5
透過微調頁尾高度來讓頁尾線條逼近 tablix

[SSRS] 電子發票 - 報表設計-4

頁數顯示

因為拆成兩張報表,所以
  • 無法直接在主頁取得全部頁數,必須先列印明細頁後取得明細總頁數,之後加 1 才會是總頁數
  • 無法讓使用者預覽,必須直接輸出,參考 [RV] 列印本機報表而不進行預覽
直接輸出是使用 PrintDocumnet 進行輸出,沒有內建函數可以直接取得總頁數,必須依賴PrintDocument 進行 render 時,每產生一頁會呼叫 PrintPage 事件一次,透過該特性來取得總頁數
private int _pageCount { get; set; } = 0;
private static void PrintDoc_PrintPage(object sender, PrintPageEventArgs e)
{
    _pageCount++;
}
先列印明細頁取得總頁數後,在把總頁數塞回主頁後,參考 [RV] 從 C# 傳遞參數至 ReportViewer 就可以完成

執行結果

可以觀察到明細頁跨頁情況,該結果是以每頁固定 20 筆 資料來呈現

明細頁第一頁 (總頁數第二頁)
[SSRS] 電子發票 - 報表設計-8
明細頁第二頁 (總頁數第三頁)

[SSRS] 電子發票 - 報表設計-7

沒有留言:

張貼留言