星期二, 4月 18, 2023

[SSRS] 新聞稿樣式報表 - 子報表

在 [SSRS] 新聞稿樣式報表 - 分欄 內確定沒有辦法達到分頁功能後,想到可以透過清單 (List) 搭配子報表 (Subreport) 來嘗試看看,發現多欄位設定在子報表內沒有辦法一欄接續一欄呈現,會變成一欄一頁,EX:報表一頁有兩欄,但在子報表內會變成一頁一欄,總共兩頁

以 AdventureWorks2019 Person.Address Table 資料為主,把同一個城市內的地址群組在一起來紀錄,子報表設計可以參考這三篇筆記
以下就單純文字紀錄而已

資料來源,只抓取一個城市資料來顯示,資料量可以呈現一頁兩欄效果就好

namespace MultiColumnSubreport
{
    // 故意弄兩個 class 來呈現資料,不要都用 Address
    public class MasterReportModel
    {
        public string City { get; set; }
    }
    
    public class DetailReportModel
    {
        public string City { get; set; }

        public string Address { get; set; }
    }
    

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

        private void Form1_Load(object sender, EventArgs e)
        {
            var dbContext = new AdventureWorks2019Entities();

            var source = dbContext.Address
                .Where(x => x.City == "Perth")
                .OrderBy(x => x.City)
                .ThenBy(x => x.AddressLine1)
                .ToList();

            var masterSource = source.GroupBy(g => g.City).Select(g => new MasterReportModel() { City = g.Key }).ToList();
            reportViewer1.LocalReport.DataSources.Add(new ReportDataSource(nameof(MasterReportModel), masterSource));

            reportViewer1.LocalReport.SubreportProcessing += (senderInner, eInner) =>
            {
                string city = eInner.Parameters[nameof(DetailReportModel.City)].Values[0]?.ToString();

                var detailSource = source
                .Where(w => w.City == city)
                .Select(s => new DetailReportModel()
                {
                    City = s.City,
                    Address = s.AddressLine1
                })
                .OrderBy(x => x.Address)
                .ToList();

                eInner.DataSources.Add(new ReportDataSource(nameof(DetailReportModel), detailSource));
            };

            reportViewer1.SetDisplayMode(DisplayMode.PrintLayout);

            reportViewer1.RefreshReport();
        }
    }    
}
正常的一頁兩欄位的多欄位報表

[SSRS] 新聞稿樣式報表 - 子報表-1

清單搭配子報表來呈現多欄位,變成一頁一欄,總共兩頁

   [SSRS] 新聞稿樣式報表 - 子報表-2

[SSRS] 新聞稿樣式報表 - 子報表-3

原本擔心多欄位設計在單一群組有第二頁情況下,子報表無法呈現,一整個多慮,連正常多欄效果都出不來,完全無法使用

沒有留言:

張貼留言