Reportbuilder報表补充無記錄空行 ( 积分: 100 )

  • 主题发起人 主题发起人 hogan
  • 开始时间 开始时间
H

hogan

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi7
主從表
表身固定8行
當記錄不夠8行
Detailband不能印出剩下的空白行
怎麼才能令到不管夠不夠記錄,都印滿8行表格,空行也列印
我想過在程序中自己添加數據集空白記錄的方式,但此種方式挺不自在,如果報表有相應的設置項能做到就會更好
Detail band 有個PrintCount參數能限制每頁Detail band 列印的行,但不能末頁補空
 
Reportbuilder 補空
1. ppClass單元TppBand增加AddBlankRow 屬性,重新編譯所有包後,在Design報表的DetailBand中可以設置AddBlankRow屬性
2. ppBandEngine單元TppBandEngine.CheckForEndofGeneration
//原句 if GenerationComplete then
//原句 Result := True
改為
if GenerationComplete then
begin
if (FBand.PrintTimes = ptCount) and (FCount < FBand.PrintCount) then
Result := False
else
Result := True;
End
用途:當GenerationComplete為真時,仍然可以繼續列印
3. ppBandEngine單元TppBandEngine.ProcessQueue
//原句 while (liComponent < aQueue.Count) and not(GenerationComplete)do
//改為
if GenerationComplete and FBand.AddBlankRow then
if FBand.GetADataPipeline.Eof then
begin
FBand.GetADataPipeline.skip;
end;
//經證實此段無效, FBand.GetADataPipeline.Skip只能到Eof,也就是最後一條記錄,不能跳過最後一條記錄
while (liComponent < aQueue.Count) and (not(GenerationComplete) or FBand.AddBlankRow)do
用途:當GenerationComplete為真時,判斷是否要補充空行,如果AddBlankRow為真則繼續列印
4. ppCtrls單元
因為FBand.GetADataPipeline無法創造一個空記錄,當FBand.GetADataPipeline為Eof時,實際指向最後一條記錄,只好直接在每個控件輸出時,控制表格元件的內容
TppCustomText.PropertiesToDrawCommand
TppCustomText一般為
- TppDBCalc
- TppDBText
- TppLabel
- TppSystemVariable
- TppVariable
//xxx
{ if (Parent is TppBand) and TppCustomBand(Parent).GenerationComplete and TppCustomBand(Parent).AddBlankRow then
lDrawText.Text := ''
else
lDrawText.Text := Text;}
lDrawText.Text := Text;
//原具
//xxx

TppDBImage.LoadPicture
控制圖片輸出
//xxx
if (Parent is TppBand) and TppCustomBand(Parent).GenerationComplete and TppCustomBand(Parent).AddBlankRow then
exit;
barcode等尚未研究
此種方法在對於包不太熟的朋友不建議使用,用臨時表方案比較好
不懂怎麼樣結貼
 
ReprotBuilder已很久没有用了, 我说一下FastReport的做法,因该差不多
在报表上放一个 child,隐藏该child ,在报表pagefoot打印前,在报表中写代码,用while循环判断报表上是否还有空余的空间,如有,则显示child。
效果说明: 报表打印完主表数据,然后打印明细数据(从表),然后打印页脚,当打印页脚时,报表判断是否还有空余的空间,如有,则先打印child,直到报表上已无多余的空间,然后再打印页脚.(注意,child的高度做小一点,循环 每打印一次child,判断是否还有多余的空间,如有,则再打印一次child,直到报表上已没有多余的空间)
 
如果不想修改包可以參考xxdte的思路
在FooterBand放一個SubReport,格式不要放Detailband
在FooterBand的Beforeprint事件中循環列印該SubReport到足夠的行數
事先設置相關Band的PrintCount,根據Detailband的Count數性與PrintCount的差值就是要補的空行數,這樣做不需要計算與FootBand之間的空
或者在SubReport的Detailband中擺格式,用一個TClientDataset驅動,TClientDataset定義一個任意的字段,添加行數記錄,然後在FootBand列印之前印一次SubReport就行了
 
希望對使用Reportbuilder的朋友有幫助,這個報表工具很不錯的
結貼
 
后退
顶部