我用下面这个程序欲实现学生排名次的功能:(当总分相同时,名次一样,但是总数要累加)即
xsbh 总分 县名次
001 500 1
003 500 1
004 499 3
002 499 3
005 496 5
这个功能!
k:=0;
for i:=1 to adoquery4.RecordCount do
begin
adoquery4.RecNo:=i;
if adoquery4.Fields[6].Value<>k then//如果下一条不等于上一条则用i
begin
l:=i;
xsbh:=adoquery4.Fields[0].Value;
adoquery5.Close;
adoquery5.SQL.Clear;
adoquery5.SQL.Add('update cy set 县名次= '+inttostr(i) +' where xsbh=:xsbh');
ADOQUERY5.Parameters[0].Value:=xsbh;
adoquery5.ExecSQL;
k:=adoquery4.Fields[6].Value;
end
else//如果下一条等于上一条则计数器不累加
begin
xsbh:=adoquery4.Fields[0].Value;
adoquery5.Close;
adoquery5.SQL.Clear;
adoquery5.SQL.Add('update cy set 县名次= '+inttostr(l)+' where xsbh=:xsbh');
ADOQUERY5.Parameters[0].Value:=xsbh;
adoquery5.ExecSQL;
k:=adoquery4.Fields[6].Value;
end;
end;
以上程序能够实现,但是效率极低(5000条记录要花4分钟了,PIII866下调试)
不知这个程序怎么修改,使效率提高,最好能在几秒钟内解决!
xsbh 总分 县名次
001 500 1
003 500 1
004 499 3
002 499 3
005 496 5
这个功能!
k:=0;
for i:=1 to adoquery4.RecordCount do
begin
adoquery4.RecNo:=i;
if adoquery4.Fields[6].Value<>k then//如果下一条不等于上一条则用i
begin
l:=i;
xsbh:=adoquery4.Fields[0].Value;
adoquery5.Close;
adoquery5.SQL.Clear;
adoquery5.SQL.Add('update cy set 县名次= '+inttostr(i) +' where xsbh=:xsbh');
ADOQUERY5.Parameters[0].Value:=xsbh;
adoquery5.ExecSQL;
k:=adoquery4.Fields[6].Value;
end
else//如果下一条等于上一条则计数器不累加
begin
xsbh:=adoquery4.Fields[0].Value;
adoquery5.Close;
adoquery5.SQL.Clear;
adoquery5.SQL.Add('update cy set 县名次= '+inttostr(l)+' where xsbh=:xsbh');
ADOQUERY5.Parameters[0].Value:=xsbh;
adoquery5.ExecSQL;
k:=adoquery4.Fields[6].Value;
end;
end;
以上程序能够实现,但是效率极低(5000条记录要花4分钟了,PIII866下调试)
不知这个程序怎么修改,使效率提高,最好能在几秒钟内解决!
这个我本来是在按总分排序后再填写的呀!
to : ruoqi2003(青春网星)
我是在ado+access2000做的,你说的存储过程怎么做呀!
k:=0;
zf:=-1;
adoquery4.sql.text :=select 总分,县名次 from cy order by 总分';
adoquery4.open;
while not adoquery4.eof do
begin
if zf<>adoquery4.fieldbyname('总分').asinteger then
begin
k:=k+1;
adoquery4.edit;
adoquery4.fieldbyname('县名次').asinteger:=k;
adoquery4.post;
i:=k;
zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
end
else
begin
k:=k+1;
adoquery4.edit;
adoquery4.fieldbyname('县名次').asinteger:=i;
adoquery4.post;
zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
end;
adoquery4.next;
end;
k:=0;
zf:=-1;
adoquery4.sql.text :='select 总分,县名次 from cy order by 总分';
adoquery4.open;
while not adoquery4.eof do
begin
if zf<>adoquery4.fieldbyname('总分').asinteger then
begin
k:=k+1;
adoquery4.edit;
adoquery4.fieldbyname('县名次').asinteger:=k;
adoquery4.post;
i:=k;
zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
end
else
begin
k:=k+1;
adoquery4.edit;
adoquery4.fieldbyname('县名次').asinteger:=i;
adoquery4.post;
zf:=adoquery4.adoquery4.fieldbyname('总分').asinteger;
end;
adoquery4.next;
end;
能不能具体一点呀?在线等你!
(select count(*)+1 from t as b where a.总分>b.总分 ) as 县名次
from t as a
order by 总分 descfor sql server.
你只是统计吧!对access用ado是比较慢的!你可以改用DiamondAccess控件连接!语句也不用改太多!
在www.51delphi.com有下载!DiamondAccess是dao的!比ado块狠多啊!其实连接access有好多选择:
DiamondAccess、kadao等.
kadao:http://www.delphi.pari.bg/
行的话怎么用?
在ACCESS中是可用的。给你的语句直接放在ADOQuery中Open即可。
我这样用要出错的么!
adoquery5.Close;
adoquery5.SQL.Clear;
adoquery5.SQL.Add('select xsbh,总分,(select count(*)+1 from t as b where a.总分>b.总分 ) as 县名次 from t as a order by 总分 desc');
adoquery5.ExecSQL;
你里面的a,b,t是什么意思?能不能将这个查询的中文意思讲一下?
出错提示如下:
"microsoft jet数据库引擎找来到找不到输入表或查询't'。确定它是否存在,以及它的名称的拼写是否正确"
你的意思是不是将数据库改为sql server?
最好不用sql server,学校里都是win98的系统呀!
能不能用access2000呀?
里面的a,b是表的别名,可以不用管他。
t是表的名称,改为你实际的表名。
adoquery5.SQL.Clear;
adoquery5.SQL.Add('select xsbh,总分,(select count(*)+1 from cy as b where a.总分>b.总分 ) as 县名次 from cy as a order by 总分 desc');
adoquery5.Open;