急,急,急,一个报表问题?(50分)

  • 主题发起人 主题发起人 gamblegod
  • 开始时间 开始时间
G

gamblegod

Unregistered / Unconfirmed
GUEST, unregistred user!
具体情况是这样的,我有一个表,其中有两个字段:UserID(用户ID)和BoxID(盒号)
涉及到打印操作,而一个盒子包含八个用户ID,也就是要打印成如下格式:
BoxNo UserID1 UserID2 UserID3 UserID4 UserID5 UserID6 UserID7 UserID8
而该表的中每一个记录仅包含一个UserID,也就是说,一个盒子要对应到表中的8条记录,
由于刚接触QuickReport不久,还请各位大俠出手相助。谢谢!
 
你可以用tquery执行查询,sql语句为select a.userid,a.boxid as id1,b.boxid as id2,
c.boxid as id3,d.boxid as id4,e.boxid as id5,f.boxid as id6,g.boxid as id7,
h.boxid as id8 from tablename a,tablename b,tablename c,tablename d,tablename e,
tablename f,tablename g,tablename h where a.userid=b.userid and a.userid=c.userid
a.userid=d.userid and a.userid=e.userid and a.userid=f.userid and a.userid=g.userid
and a.userid=h.userid order by a.uesrid
 
你这个表怎么设置成这样的。
你可以用9个query(很笨的法子!)
query1:select boxno,data from table where userid=1;
...
query8:select boxno,data from table where userid=8;
query9:select boxno from table group by boxno
然后在query9中增加8个lookup字段,分别以boxno为关键字段在1-8个query中查找,返回
字段为data字段,然后用quickreport对query9进行处理应该可以吧!
这种方法很蠢 :)
 
用zqmagic的方法是性能是较好的!
用hhzh426的方法虽然看上去聪明,但性能很低,后台服务器将会至少多执行17条查询语句!
 
我觉得好象大家对我的意思有些误会,zqmagic大侠的意思好象是从8个表中分别取出8个
UserID,而我所说的8个用户ID是同一个表中的8个记录,并且这8个记录的BoxNO(盒号)
相同,比如该表中可能有8个记录:
Rec.No BoxNO UserID
12 5 123
13 5 124
14 5 125
15 5 126
16 5 127
17 5 128
18 5 129
19 5 130
.........
而上面的记录在报表中打印时只占一行,报表格式如下:
BoxNo UserID1 UserID2 UserID3 UserID4 UserID5 UserID6 UserID7 UserID8
5 123 124 125 126 127 128 129 130
现在问题的关键在于如何使报表的一行对应表中的8个记录,不知道我的意思表达清楚没有?
 
建一个临时表,字段分别是:
BoxNo UserID1 UserID2 UserID3 UserID4 UserID5 UserID6 UserID7 UserID8
将数据导入,在用临时表来填报表。


 
用两个Query,用Master/Detail方式打开数据库, 即:
Query1 : select distinct(UserID) from uTable
Query2 : select UserID, BoxID from uTable Where UserID = :UserID
Query2的DataSource设为DataSource1
报表的DataSet=Query1,在Detail Band中放一个QRDBText指向Query1的UserID字段
然后并排放上8个QRLabel,分别为QRLabel1,QRLabel2... ...QRLabel8,在BeforPrint中赋值:
procedure TQuickReport1.DetailBandBeforePrint(Sender: TQRCustomBand;
var PrintBand: Boolean);
var
i: integer;
begin
Query2.First;
for i := 1 to 4do
begin
if not Query2.Eof then
begin
TQRLabel(FindComponent('QRLabel'+IntToStr(i))).Caption := Query2.FieldByName('BoxID').AsString;
Query2.Next;
end else
TQRLabel(FindComponent('QRLabel'+IntToStr(i))).Caption := ' ';
end;
end;

 
Query1:Select BoxNO,UserID From TableName Order By BoxNO;
在Detail Band中并排放上8个QRLabel。
然后在OnNeedData事件里编程。
procedure TPrint_report_form.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
if Query1.Eof then
MoreData:=FALSE
else
begin
MoreData:=TRUE;
for i:=1 to 8do
begin
TQRLabel(FindComponent('QRLabel'+IntToStr(i))).Caption := Query1.FieldByName('BoxID').AsString;
Query1.Next;
end;
end;
end;
如果不能确保每个BoxNO有8个UserId ,则可以用变量记录BoxNO在FOR循环中加入语句
判断BoxNO不同时就结束。
 
To seago:
我按照你的方法试了,报表能够正常显示,但是好象打印又出了问题。我是直接
调用QuickRep的print方法实现的打印,结果在Progress窗口一闪而过外,打印操作
根本就没有反应。这是什么原因??
To sdwflzg:
你的方法算是最简单的实现方法,但小弟不知道怎么建临时表,好象在程序中
不能同时打开两个PARAOX类型的单表。所以还请大侠明示。
To Liuly:
老兄的方法以后我会考虑的,但是目前可能还是不会这种途径。
To All:
由于小弟的全部家当就只有50分,并且机会仅此一次,所以我可能还多问几个问题,
但是最后我会给各位加分的,聊表我的感激之情。
 
同时打开几个表都可以,难道你的程序中同时就用一个表(数据库)?!
临时表手工建也可以,在程序中建也可以,打开两个表,导入数据就不用我叫了吧?
 
To sdwflzg:
其实我在程序中引入表的目的是为了打印方便,其实表也可以不要,所以就更谈不上
数据库的问题,而昨天我在调试的时候,另外新建了一个老兄所推荐的表,可是在我
初始化的时候,老是说我Acess violation错误,也不知道究竟是什么原因?
To seago:
谢谢老兄的鼎力相助,其实打印的问题我已解决了。主要原因是在preview里面调用
Print方法时query里面的指针在尾部,所以要将指针重新定位到文件首。具体的更改如下:
procedure TPrint_report_form.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
if Query1.Eof then
begin
query1.First;
MoreData:=FALSE;
end
else
begin
MoreData:=TRUE;
for i:=1 to 8do
begin
TQRLabel(FindComponent('QRLabel'+IntToStr(i))).Caption := Query1.FieldByName('BoxID').AsString;
Query1.Next;
end;
end;
end;
To All:
再次感谢大家的帮助,由于家底太薄,所以只能给大家聊表心意。

 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部