星期二, 10月 01, 2024

[SSRS] 雙面列印

被告知要製作郵件報表 (不知道這樣稱呼適不適當就是),一張 A4 紙兩頁都會有文字說明
  • 第一頁 (正面):為郵寄相關地址
  • 第二頁 (反面):我方提供給對方確認內容
第一頁三摺就可以寄出去,對方確認後反摺可以寄回來

透過雙面列印這想法完成該需求,重點如下
  • 報表來源
  • 資料成對
  • 識別第一頁、第二頁
以下會針對這三點來筆記

報表來源

報表來源是以 class 為主,所以該 class 會同時有第一頁和第二頁 property,用個 super class 承載全部資料,且該 class 必須自訂 PageNumber 來判斷是第一頁、第二頁
namespace PageNumberVisible
{
    public class ReportModel
    {
        public int PageNumber { get; set; }

        // 第一頁 Property

        // 第二頁 Property
    }
}

資料成對

是在 C# WinForm 上搭配 ReportViewer 來進行列印,所以在 AP 端要把資料變成兩筆,並同時給 PageNumber 值
using Microsoft.Reporting.WinForms;
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace PageNumberVisible
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // 理論上資料來源變成兩筆並要特別注意資料排序,筆記就簡易紀錄就好
            List<ReportModel> reportSource = new List<ReportModel>();
            reportSource.Add(new ReportModel() { PageNumber = 1 });
            reportSource.Add(new ReportModel() { PageNumber = 2 });
            reportSource.Add(new ReportModel() { PageNumber = 1 });
            reportSource.Add(new ReportModel() { PageNumber = 2 });

            this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(nameof(ReportModel), reportSource));
            this.reportViewer1.RefreshReport();
        }
    }
}

識別第一頁、第二頁

控件可見性屬性內使用 VB.NET MOD 函數搭配頁碼來判斷是第一頁、第二頁
  • 頁首、頁尾:使用 SSRS 內建欄位 PageNumber 
  • 報表主體:使用 class 內自訂的 PageNumber 欄位
另外不是每個控件 GUI 內都會有可見性可以進行設定,沒有的話,可以在屬性視窗內找到 Hide,英文和中文翻譯剛好相反詞

內建欄位 PageNumber 只能應用在頁首、頁尾 


線條控件就沒有 GUI 可見性,只能在屬性視窗內使用 Hide 設定
報表呈現設計

在報表頁首和實體內放三個控見示意,左側控件是顯示頁碼,右側控件則是根據頁碼來決定是否顯示

報表執行

第三頁 (正面)
第四頁 (反面)

輸出時選擇印表機雙面列印,兩兩一份就可以完成該需求

沒有留言:

張貼留言