动态创建报表问题,请高手会诊。急用! 在线等待,谢谢。 (40分)

  • 主题发起人 主题发起人 jcjy
  • 开始时间 开始时间
J

jcjy

Unregistered / Unconfirmed
GUEST, unregistred user!
我用 select into 语句动态的创建了一张表tmp1,每次创建的表内字段有可能不同。
用adoquery 控件连接数据库表,
我如何才能用quickrep 做tmp1的所有字段数据的报表?
我作出来的效果是:
区名 校名 年级 班级 总人数 男生人数 女生人数
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 一班 60 25 35
每一行都是一样的。实际上用select 显示是:
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 二班 60 25 35
金城区 金城小学 二年级 三班 60 25 35
金城区 金城小学 二年级 四班 60 25 35
为什么呢?如何解决?
 
字段的個數是固定話直接設數據源就好,如不固定隻能動態創建報表
 
to bes96261
字段是不固定的。有时多,有时少,根据用户的选择而定。
 
动态创建报表[:D],不同的报表控件是不一样的
 
to 张无忌
我用的是delphi6自带的quickrep组件。
 
http://www.playicq.com/dispdoc.php?t=&id=624
http://www.playicq.com/dispdoc.php?t=&id=582
仅供参考
 
对不起,不会!
 
可以在报表中多放几个控件,但设置它的打印条件。
打印时动态设置字段名。
 
你看看能不能动态修改某报表显示控件的所属字段,要是可以就好办,要是不能,
只好动态创建,麻烦的说。要是这样,干脆用 FastReport 好了。
 
quickrep这个报表的做报表不大方便啊!
如果原始字段不确定可以动态生成的。
首先要,create,然后再指定它的parent,
然后还要指定它的parentband?
SORRY,我有点忘记了。
 
to beta
我不会fastreport呀!
 
我作出来的效果是:
区名 校名 年级 班级 总人数 男生人数 女生人数
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 一班 60 25 35
每一行都是一样的。实际上用select 显示是:
金城区 金城小学 二年级 一班 60 25 35
金城区 金城小学 二年级 二班 60 25 35
金城区 金城小学 二年级 三班 60 25 35
金城区 金城小学 二年级 四班 60 25 35
 
生成的报表子段要放到QRSubDetail1里面,放到其他的里面有这种现象。
不行再联系
 
我用的是一种笨办法。源码如下,请高手说说。
Scondition:='';
Sgroupby:='';
adoquery2.Close;
adoquery2.SQL.clear;
adoquery2.sql.Add ('select ');
if (checkbox2.Checked) then
adoquery2.SQL.Add('a.区名, ');
if (checkbox3.Checked) then
adoquery2.SQL.Add('a.学校, ');
if (checkbox4.Checked) then
adoquery2.SQL.Add('a.年级,');
if (checkbox5.Checked) then
adoquery2.SQL.Add('a.班级, ');
adoquery2.SQL.Add('count(*) as 总人数, ');
adoquery2.sql.Add ('sum(iif(性别='+''''+'女'+''''+',1,0))as 女生人数,');
adoquery2.sql.add('sum(iif(性别='+''''+'男'+''''+',1,0))as 男生人数');
sgroupby:='学籍基本信息表 a,';
if (checkbox2.Checked) then
sgroupby:=sgroupby+'区码表 b';
if (checkbox3.Checked)then
sgroupby:=sgroupby+'校码表 c,';
if (checkbox4.Checked) then
sgroupby:=sgroupby+'年级表 d,';
if (checkbox5.Checked) then
sgroupby:=sgroupby+'班码表 e,';
sgroupby:=copy(sgroupby,1,(strlen(pchar(sgroupby))-1));
adoquery2.SQL.Add(' from '+sgroupby);
sgroupby:='';
if (checkbox2.Checked)then
sgroupby:=sgroupby+' and a.区名=b.区名';
if (checkbox3.Checked)then
sgroupby:=sgroupby+' and a.学校=c.校名';
if (checkbox4.Checked)then
sgroupby:=sgroupby+' and a.年级=d.年级';
if (checkbox5.Checked)then
sgroupby:=sgroupby+' and a.班级=e.班级';
sgroupby:=copy(sgroupby,5,(strlen(pchar(sgroupby))));
if sgroupby<>'' then
adoquery2.SQL.Add(' where '+sgroupby);
sgroupby:='';
if (checkbox2.Checked) then
sgroupby:=sgroupby+'a.区名,b.区码,';
if (checkbox3.Checked) then
sgroupby:=sgroupby+'a.学校,c.校码,';
if (checkbox4.Checked) then
sgroupby:=sgroupby+'a.年级,d.级码,';
if (checkbox5.Checked) then
sgroupby:=sgroupby+'a.班级,e.班码,';
sgroupby:=copy(sgroupby,1,(strlen(pchar(sgroupby))-1));
if sgroupby<>'' then
adoquery2.sql.add('group by '+sgroupby);
sgroupby:='';
if (checkbox2.Checked) then
sgroupby:=sgroupby+'b.区码,';
if (checkbox3.Checked)then
sgroupby:=sgroupby+'c.校码,';
if (checkbox4.Checked) then
sgroupby:=sgroupby+'d.级码,';
if (checkbox5.Checked) then
sgroupby:=sgroupby+'e.班码,';
sgroupby:=copy(sgroupby,1,(strlen(pchar(sgroupby))-1));
if sgroupby<>'' then
adoquery2.sql.Add('order by '+sgroupby) ;
adoquery2.open;
adoquery4.Close;
adoquery4.SQL.Clear ;
adoquery4.SQL.Text :=adoquery2.SQL.GetText ;
adoquery4.Open ;
i:=adoquery4.Fields.Count;
ileft:=10;
if i>0 then
begin
qrlabel1.Caption :=adoquery4.Fields[0].FieldName ;
qrdbtext1.DataField:=adoquery4.Fields[0].FieldName;
qrlabel1.width :=adoquery4.Fields[0].dataSize;
qrdbtext1.width :=adoquery4.fields[0].datasize;
qrlabel1.Left:=ileft;
qrdbtext1.Left:=ileft;
end;
i:=i-1;
if i>0 then
begin
qrlabel2.Caption :=adoquery4.Fields[1].FieldName ;
qrdbtext2.DataField:=adoquery4.Fields[1].FieldName;
qrlabel2.width :=adoquery4.Fields[1].dataSize;
qrdbtext2.width :=adoquery4.fields[1].datasize;
ileft:=ileft+qrlabel1.Width +80;
qrlabel2.Left:=ileft ;
qrdbtext2.Left:=ileft;
end;
i:=i-1;
if i>0 then
begin
qrlabel3.Caption :=adoquery4.Fields[2].FieldName ;
qrdbtext3.DataField:=adoquery4.Fields[2].FieldName;
qrlabel3.width :=adoquery4.Fields[2].dataSize;
qrdbtext3.width :=adoquery4.fields[2].datasize;
ileft:=ileft+qrlabel2.Width +80;
qrlabel3.Left:=ileft ;
qrdbtext3.Left:=ileft;
end;
i:=i-1;
if i>0 then
begin
qrlabel4.Caption :=adoquery4.Fields[3].FieldName ;
qrdbtext4.DataField:=adoquery4.Fields[3].FieldName;
qrlabel4.width :=adoquery4.Fields[3].dataSize;
qrdbtext4.width :=adoquery4.fields[3].datasize;
ileft:=ileft+qrlabel3.Width +80;
qrlabel4.Left:=ileft ;
qrdbtext4.Left:=ileft;
end;
i:=i-1;
if i>0 then
begin
qrlabel5.Caption :=adoquery4.Fields[4].FieldName ;
qrdbtext5.DataField:=adoquery4.Fields[4].FieldName;
qrlabel5.width :=adoquery4.Fields[4].dataSize;
qrdbtext5.width :=adoquery4.fields[4].datasize;
ileft:=ileft+adoquery4.fields[4].datasize +80;
qrlabel5.Left:=ileft ;
qrdbtext5.Left:=ileft;
end;
i:=i-1;
if i>0 then
begin
qrlabel6.Caption :=adoquery4.Fields[5].FieldName ;
qrdbtext6.DataField:=adoquery4.Fields[5].FieldName;
qrlabel6.width :=adoquery4.Fields[5].dataSize;
qrdbtext6.width :=adoquery4.fields[5].datasize;
ileft:=ileft+qrlabel5.Width +80;
qrlabel6.Left:=ileft ;
qrdbtext6.Left:=ileft;
end;
i:=i-1;
if i>0 then
begin
qrlabel7.Caption :=adoquery4.Fields[6].FieldName ;
qrdbtext7.DataField:=adoquery4.Fields[6].FieldName;
qrlabel7.width :=adoquery4.Fields[6].datasize;
qrdbtext7.width :=adoquery4.fields[6].DataSize;
ileft:=ileft+qrlabel6.Width +80;
qrlabel7.Left:=ileft ;
qrdbtext7.Left:=ileft;
end;

quickrep1.Preview ;
 
哇,好长,不过我刚才试验了动态创建报表没有问题,
还没有用临时表
 
看不到你动态创建qrdbtext的句子???
这样吧,首先用一个固定的表,select * from a,b
建立报表,看是否有问题?
因为,你的表是固定的跟我刚才作的没有区别,而且没有动态创建qrdbtext,所以,
不存在其他的问题,你可以只应用班级一项做实验,就会找到错误的原因的
var QT: TQRDBText;
begin
qt:=TQRDBText.Create(self);
qt.Parent:=QRSubDetail1;
with qtdo
begin

Left := 156;
Top := 8;
Width := 8;
Height := 17;
Frame.Color := clBlack;
Frame.DrawTop := False;
Frame.DrawBottom := False;
Frame.DrawLeft := False ;
Frame.DrawRight := False ;
// Size.Values := ( 44.9791666666667 148.166666666667 21.1666666666667 21.1666666666667);
Alignment := taLeftJustify;
AlignToBand := False;
AutoSize := True;
AutoStretch := False;
Color := clWhite;
DataSet := ADOQuery1;
DataField := 'c';
Transparent := False;
WordWrap := True;
end;
QuickRep1.Preview;
我刚才的例子结果没有问题
 
to 陈晨
你说得没错,我是在一张固定的quickrep上做的。我先试试你说的办法。
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部