如何制作动态报表(100分)

  • 主题发起人 主题发起人 davidjwilson
  • 开始时间 开始时间
D

davidjwilson

Unregistered / Unconfirmed
GUEST, unregistred user!
报表的字段是动态生成的,其数目是可变的。
如何动态生成这样的报表?
有没有现成的控件可以做到?
 
用TPrintDBGridEh控件
 
任何一套报表控件都可以做到
动态生成报表静态标签或动态字段对象
以ReportBuilder为例,要将一个数据集的内容动态生成到报表中
1、动态创建一个TppReport对象
2、创建一个TppDBPipeline对象,设置其DataSource属性为数据集的DataSource
3、创建这个TppReport对象的HeadBand和DetailBand; (用AddBand()的方法)
4、读取数据集的字段列表,创建字段标题于HeadBand中,即创建一个个TppLabel,
并设置其Band属性为ppReport的HeadBand; 创建字段对象于DetailBand中,即创建
一个个TppDBText,设置其字段名为从数据集中读到的字段名,设置其DataPipeline
属性为前面创建的TppDBPipeline对象。然后预览打印

关于动态创建RB对象的方法请看我之前提问的一个帖子
上述方法也可用来打印DBGrid,方法类似
另外,用Delphi自带的QReprot更容易事先动态报表,但其Bug甚多,不推荐使用

 
楼上的朋友说的对,说白了就是用感知组键
如,一个adodataset1,一个quickrep,设定其dataset为前面的adodataset1,在加入几个
qrdbtext,设定其dataset为dataset1就可以了。这是主要的设定,其它就不多说了
 
用fastreport的frPrintGrid1控件,只要DBGRID中显示的是什么,打的就是什么。
 
我这儿有一个例子,是动态把表中的字段制作报表:
是一个工资程序:
     frReport1.Pages.Clear;
frReport1.Pages.Add;
Page := frReport1.Pages[0];

b := TfrBandView(frCreateObject(gtBand, ''));
b.SetBounds(20, 20, 0, 60);
b.BandType := btpageheader;
Page.Objects.Add(b);


v := frCreateObject(gtMemo, '');
v.SetBounds(20,40, 400, 32);
v.Memo.Add(title_rep);
TfrMemoView(v).Font.Name:='黑体';
TfrMemoView(v).Font.Size:=14;
TfrMemoView(v).BandAlign:=bacenter;
Page.Objects.Add(v);

b := TfrBandView(frCreateObject(gtBand, ''));
b.SetBounds(20, 140, 20, 68);
b.BandType := btMasterData;
b.Dataset := 'frDBDataSet1';
Page.Objects.Add(b);

gz_x:=20;

for I:=0 to gz.FieldCount-1 do
begin
gz_xm:=trim(gz.Fields.FieldName);

v := frCreateObject(gtMemo, '');
v.SetBounds(gz_x,140, 50, 32);
v.Memo.Add(gz_xm);
TfrMemoView(v).Font.Name:='宋体';
TfrMemoView(v).Font.Size:=9;
TfrMemoView(v).FrameTyp:=15;
TfrMemoView(v).Alignment:=frtamiddle+frtacenter;
Page.Objects.Add(v);


v := frCreateObject(gtMemo, '');
v.SetBounds(gz_x,172, 50, 16);
v.Memo.Add('[gz."'+gz_xm+'"]');
TfrMemoView(v).Font.Name:='宋体';
TfrMemoView(v).Font.Size:=9;
TfrMemoView(v).FrameTyp:=15;
TfrMemoView(v).Alignment:=frtamiddle+frtaright;
Page.Objects.Add(v);

gz_x:=gz_x+50;
end;

frReport1.ShowReport;

 
后退
顶部