用quickreport实现动态报表(200分)

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

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现一个动态报表,当一个(或某些)字段为空时,就不大因它,
也就是说,只打印非空的字段,如何用quickreport实现?我用它的
OnNeedData事件也没法实现。
 
动态创建字段非空的表,这一步实现起来没有问题吧!后来的事就比较容易了!
 
在QuickRep1的BeforePrint事件中写
procedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep;
var PrintReport: Boolean);
var
I:integer;
...
begin
...
for I=0 to n do
// n为列数字段个数
begin

...
if form1.DBGrid1.Columns .field='' then
//假设要求的字段都是‘字符型’其它改一改
begin
QRDBText.visible:=false;//不显示
end;
...
end;

end;
 
不,有问题,我的表有七十个字段,但每条记录通常只有几个字段是非空的,
而且是随机的。比如说第一条记录是a,b,c三个字段非空,而第二条记录是b,e,f
非空,不可能每条记录都创建动态表吧?而且即使实现了,打印也会出现问题,
因为这样无法实现在同一张纸上打印多条记录。
 
也有问题,比如说第一个字段非空,第三个字段非空,这样第二字段的位置
就会空出来,报表就会空出一块空白,不好看。
 
SELECT * FROM TABLE
WHERE C01 IS NOT NULL
AND C02 IS NOT NULL
AND C03 IS NOT NULL
AND C04 IS NOT NULL
...
AND C67 IS NOT NULL
AND C68 IS NOT NULL
AND C69 IS NOT NULL
AND C70 IS NOT NULL
 
1、动态创建QRDBTEXT
1、在TITLEBANK 中排除空字段
for i:=0 to query1.fieldscount-1do
begin
..
query2.sql.add('select :s from group by :s');
query2.params[0].asstring:=query1.fields
query2.open;
if (query2.recordcount=1) and (query2.feidls[0].asstring='') then
next
else
2、动态创建QRDBTEXT
....
end
 
e.com比较有建设性,但要改动一部分。等我试一试。其实我想还是需要在打印
或是预览时加以控制,因为我的每条记录的非空字段数目不等,比如说第一条记录是
a,b,c三个字段非空,而第二条记录是b,e,f,g,h非空,也可能是只有a非空。问题是
怎样(在哪里)加上e.com的这一段代码呢?(我实际上已经实现了动态报表的打印,
但不是用Quick Report控件。灵活性不够,且代码量较大。)
 
附加功能 将问题提前
 
这个问题我也碰到过,我采用的是自己控制打印内容,打印记录数目的方法:
1.不使用qrdb*控件,使用qrlabel控件,按照打印的方式放在detailband内,注意这时不要
设置report控件的dataset属性,这样可以使用onneeddata事件,
2.使用一个或多个 query控件,组成数据员,在打印前打开准备好.
3.在onneeddata事件中,对于每一行detailband中的打印内容进行控制,如当某一项为0时
该项为空,则可以:if query.fieldvalues['a']=0 then
qrlabel3.caption:=''
else
qrlabel3.caption:=floattostrf(query.fieldvalues['a'],fffixed,
12,2);
打印为:(0--->'' 1.2--->'1.20')
这样还可以控制打印数据的格式.
4.如果要控制一页纸上打印的记录数目,则可以引入一个计数器,累计超过相关数目时,
先分页newcolumn,再清0继续累加.
5.还有其他一些细节,我想大家也容易掌握.
希望对你有帮助!
 
多人接受答案了。
 

Similar threads

回复
0
查看
978
不得闲
回复
0
查看
690
不得闲
回复
0
查看
848
不得闲
后退
顶部