FastReport 问题(难)(35分)

  • 主题发起人 主题发起人 whyme
  • 开始时间 开始时间
试试下:
{
数据源:dsDataSet
使用SQL语句联合主从表
select * from t_Child left join t_Master on t_Master.id = t_Child.id
报表设计:
pageHeader : 页头
GroupHeader : 主数据 (双击) 设置属性 Condition = dsDataSet."MasterID", StartNewPage = True;
MasterData : 子数据 数据源 = dsDataSet
GroupFooter : 设计与 GroupHeader 一样
Child1 : 设计与 GroupHeader 一样
Child2 : 设计与 MasterData 一样 只是不要放数据,即空白页
pageFooter : 页脚
}
// 脚本代码
// <line> 当前数据行数 ,但主数据不同会时重置
// <line#> 当前数据行数
var
ChildDataLine : Integer;
// 子数据打印完一项时
procedure MasterData1OnAfterPrint(Sender: TfrxComponent);
begin
ChildDataLine := <line> mod 4;
end;

// 某项主数据的子数据打印完后准备打印主数据的最后页时
procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
var
I :Integer;
begin
if (ChildDataLine>0) and (ChildDataLine<4) then
// 子数据数量不是4的倍数
begin
I := 4 - ChildDataLine;
while I>0do
// 填充空白子数据
begin
Engine.ShowBand(Child2);
// Child2 设计空白与子数据块相同高度、边框
Dec(I);
end;
end;
end;

// 子数据打印前
procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
begin
// 子数据 不是第一页(也不是最后一页),刚刚打印的是否是4的倍数行,是则新页
if (<line> >1) and ((<line> -1) mod 4 =0) then
begin
Engine.ShowBand(Child1);
// 主数据的后面部份
Engine.NewPage;
// 新页
Engine.ShowBand(Child1);
// 主数据的后面部份
end;
// 注:
// 主数据的前面数据 在第一条子数据时打印的是 GroupHeader
// 主数据的后面数据 最后页打印的是 GroupFooter
end;

begin

end.
 
接受答案了.
 

Similar threads

回复
0
查看
863
不得闲
回复
0
查看
978
不得闲
回复
0
查看
848
不得闲
D
回复
0
查看
825
DelphiTeacher的专栏
D
后退
顶部