摘要:CrystalReport父子報表實例2
嚴格來講,這篇其實應該不算是父子報表的應用
只是結果看起來像...
之前介紹的用法是設計階段在報表下方拉一個子報表的區塊,並加以設計
但這樣最明顯的缺點就是只能顯示固定筆數的子報表資料,如果資料超出範圍還得想辦法讓它列印到下一張去(而且還不知道能不能這樣印就是了)
果然,後來就有另一個需求了:父子報表資料數目不定,要依日期做群組分類及分頁並且印完父報表資料後要緊接著印子報表的資料
原本是做成一個勉強可以接受的結果:將子報表拉在父報表的細項中和父報表的資料用運算式判斷交換顯示
但是卻發現了一個致命的缺點:子報表資料的外框線在換頁的時候不能正確跟著資料一起列印,也就是可能在換頁時看到只有部份框線...
本來是想說沒辦法了,先搞一個版本出來,等到被抱怨再說...
結果突然被我想到:其實原來的問題似乎沒有我想的那麼難→為什麼一定要用到子報表?
於是我把原本兩個Sql硬是用Union組在一起,結果會像這樣的測試資料:
dtMasterDetail.Rows.Add("1", "111", "456", "789", null, null, DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add("1", "111", "456", "789", null, null, DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add("1", "111", "456", "789", null, null, DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add("1", "111", "456", "789", null, null, DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add("1", "111", "456", "789", null, null, DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add(null, null, null, null, "11", "aa", DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add(null, null, null, null, "11", "aa", DateTime.Parse("2010/07/01")); dtMasterDetail.Rows.Add(null, null, null, null, "11", "aa", DateTime.Parse("2010/07/01"));
有關聯的資料是最後日期的部份,其它放null的欄位就是兩個Sql裡面不相干的資料
再來報表分成兩個細目,利用兩個Sql的Primary key是否為null來判斷什麼時候該顯示哪一資料
看起來會像這樣:
再來設定一下群組條件為最後的日期欄位並且設定日期不相同時的分頁條件,就可以達到原本的需求了,結果會像這樣:
下一頁:
這樣不僅能達到原本的需求,而且不會有框線列印不佳的問題
有時候,真的是換個方向想,答案就出來了...