现有一数库结构如下,如何实现另一结构的查询和报表。(100分)

  • 主题发起人 主题发起人 zhang_qg
  • 开始时间 开始时间
Z

zhang_qg

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一数库结构如下,如何实现另一结构的查询和报表。
姓名|分数类型|项目类型 |学分
小王|一类学分|A型 |10
小王|一类学分|B型 |9  
小李|一类学分|B型 |7  
小李|二类学分|A型 |11  
小李|二类学分|B型 |17  
小张|三类学分|C型 |25  
结构基本如此,人数无限,分数类型无限,项目类型无限,实现如此结构查询和
报表:
————————————————————————————
姓名|总分 |一类学分|二类学分|三类学分|..........
————————————————————————————
小王|
——————————————————————————
|一类学分|二类学分|三类学分|..........
A型
B型
.
.
.
————————————————————————————————
|总分 |一类学分|二类学分|三类学分|..........
小李|
——————————————————————————
|一类学分|二类学分|三类学分|..........
A型
B型
.
.
.
————————————————————————————————
|总分 |一类学分|二类学分|三类学分|..........
小张|
——————————————————————————
|一类学分|二类学分|三类学分|..........
A型
B型
.
.
.
————————————————————————————————
小X
.
.
.
 
>结构基本如此,人数无限,分数类型无限,项目类型无限,
每一个表的字段数是有限的,再大的数据库亦如此,分数类型无限,如何实现?
 
SQLstr:="select 姓名, 分数类型, 项目类型 from 表 "
+"group by 姓名, 分数类型, 项目类型";
query1.sql.add(sqlstr);
//略去一些必要的语句了
query1.open;
query1.first;
while not(query1.eof)do
begin
query2.sql.clear;
query2.sql.add("select 学分 from 表 where 姓名='+''''
+query1.fields[0].asstring+''''+'分数类型='
+query1.fields[1].asstring+''''+'项目类型='
+query1.fields[2].asstring+'''');
query2.open;
......
end;
 
看看以前的问题
 
Master Iknow,
Thanks for your so many codes.
I know that you know,but I can't end this question and distribute you
any points.If you also complete the problem of report as query, I will
contribute 200 pionts to you.How to create QRLabels and QRDBTexts
dynamicly in QRReport as creating fields in Query.
bethouvnlue,
你能为我指明应看那几篇吗?指明具体位置.谢谢!

 
<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=159438" target="_blank">Here</a>
 
找了半天只找到一个,看看这个有没有帮助
<a href=http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=105099>
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=105099
</a>
 
理論上說(不管怎么說),分數類型為無限是不可能的,因為報表列數有限,So,
你可以:
1.用Tquery控件
select 姓名,項目類型,case when 分數類型='一類學分'
then
分數 else
0 end,
case when 分數類型='二類學分'
then
分數 else
0 end,
.......
from tablename
2.填入報表............
至于總分,加多一個BAND就可以了.
當然,若能在分數類型為無限的情況下產生報表,請轉告我(kwa2000@sohu.com),
先謝了.
 
如果只是为了报表,可以使用Excel中的数据透视表.
通过 ODBC Excel 可直接读数据库,不需要写代码即可完成此报表,
然后可通过 OlE 或其它方式在Delphi中调用它.
 
我觉得QUICK REPORT使用起来很不爽,而且此类问题它根本解决不了。
这不是老外的表格,这是我们中国人用自己的“聪明才智”想出来的一大创举,
根本不可能用一个SQL语句解决的。
所以,只能用下面的办法解决:
首先要用多个SQL语句加多个变量将数据取出,然后一个一个数据输出,
输出方法有两种:
1、直接调用TPRINTER的函数输出,
即textout(x,y,str),在X,Y坐标输出STR字符串。
这种方法看是麻烦,实际使用起来还可以。
2、通过OLE将内容输出到一个EXCEL文件中,通过EXCEL的打印来实现。
 
当然分数类型无限是不可能的,最多有个四五十个就行了,我说的无限是没限制,
因为它从分数类型库中取,分数类型库中每种分数类型作为一个记录存在。我想
实现的只不过把各人的分数类型由数据库中的竖排实现报表中的横排,如果用各位
大侠的方法能实现的话,立刻给各位大侠加分.
 
在crystalreport中有种类型:cross type report 好象
符合你的要求。
 
这个问题可以这样解决,用三个数据表对应同一个数据库
如MAIN, SUB
这三个数据库都是同结构 姓名 分数类型 项目类型 学分
但SUB 建立了姓名+项目类型的索引,并同MAIN关联
MAIN 放在报表的GROUP BAND上,
类似这样三个表的情形(具体处理当然要具体调整):
MAIN :小李 A型 一类学分 9 (GROUP BY 姓名 + 项目类型)
小李 B型 一类学分 10
小李 C型。。。
SUB: 小李 A型 一类学分 9
小李 A型 二类学分 8
小李 A型 。。。
小李 A型 N类学分
SUB,的字段值通过程序放到GROUP BAND 中的报表字段中
GoupBand的BeforPrint事件
DeleteAllTmpLabelsFromGroupBand;
Sub.First;
n := 0;
while not Eofdo
begin
with QRLabel1.CreatePrintable(GroupBand1)do
begin
Left := n * StartLeft;
Top := FixTop;
Text := Sub.FieldByName('分数类型').AsString;
Name := 'TmpName' + IntToStr(n);
end;
Inc(n);
Sub.Next;
end;



 
请用Quick report 的 Group (以人为分组)
 
土法如下:
动态建立临时表存汇总记录,表字段数量取决于你的分数类型表记录数.
临时表字段名可定为连续的数字0、1、2、3、4.......
//姓名|总分/项目类型 |一类学分|二类学分|三类学分|..........
for 1 to 人员表记录数
begin
for 1 to 项目类型记录数
begin
//临时表插入记录;
更新字段1(姓名)、2(项目类型);
for i=1 to 分数类型记录数
begin
sql.text:='Insert Into '+IntToStr(i+1)+'Select sum(分数)'+
'from yourtable where 姓名= and 项目类型= and 分数类型= ';
end;
end;
临时表插入一行合计(sql不难写吧),字段1附值为‘合计’;
end;
工作完成删除临时表;
(人员、类型较多时系统开销会不会较大?谁能优化次方法或贴出该方法实现原码
我再加100分,现在此题值400分)
TO zhang_qg:我有分吗?:-)
问题解决请Email我一份。Email to: 5617@soho.com
 
zhang_qg:
对不起我的Email是: 5617@sohu.com
 
多人接受答案了。
 

Similar threads

回复
0
查看
988
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部