现在我做一个统计查询的部分,需要遍历几个表,然后根据不同的条件进行统计最终结果,这样需要很长时间。请问用什么方法可以不用花费这么长时间???我的做法如下,觉得很笨。望指点一二,十分谢!
//先删除统计数据表中的所有数据以便保证统计的正常进行
with dm.candidateRect do
begin
close;
sql.clear;
sql.add('delete from EachCandidate');
execsql;
end;
//开始统计结果
with dm.ResultADO do
begin
close;
sql.clear;
sql.add('select * from candidateRect where image is null');
open;
end;
if dm.ResultADO.RecordCount>0 then
begin
ProgressBar1.Max:=dm.ResultADO.RecordCount;
dm.ResultADO.First;
i:=0;
while not dm.ResultADO.Eof do
begin
//取出模板中的相关信息
CandidateGroupId:=dm.ResultADO.fieldbyname('CandidateGroupId').Value;//候选人组
PaperId:=dm.ResultADO.fieldbyname('Paperid').value; //选票号
halfId:=dm.ResultADO.fieldbyname('halfId').value; //半票号
AgreeRectId:=dm.ResultADO.fieldbyname('AgreeRectId').value; //赞成意见框
RejectRectId:=dm.ResultADO.fieldbyname('RejectRectid').value; //反对意见框
//根据模板中的相关信息去EachPaper表中寻找其每张选票中的选举意见框是否被选中
//首先选择赞成意见框.
with dm.Resultado1 do
begin
close;
sql.clear;
sql.add('select * from EachPaper where (paperid='+inttostr(paperid)+') and (halfid='+inttostr(halfid)+') and (Rectid='+inttostr(AgreeRectId)+')'); //and (firstorsecond='+inttostr(firstorsecond)+')
open;
end;
if dm.ResultADO1.RecordCount>0 then
begin
dm.ResultADO1.First;
while not dm.ResultADO1.Eof do
begin
//根据前面的信息寻找反对意见框的信息
BoxId:=dm.ResultADO1.fieldbyname('BoxId').value;
SerialNum:=dm.ResultADO1.fieldbyname('PaperSerialnumber').value;
with dm.ResultADO3 do
begin
close;
sql.clear;
sql.add('select Marked from EachPaper where RectId='+inttostr(RejectRectId)+' and BoxId='+inttostr(BoxId)+' and PaperId='+inttostr(PaperId)+' and HalfId='+inttostr(halfId)+' and PaperSerialnumber='+inttostr(Serialnum)+'');//and firstOrSecond='+inttostr(firstorsecond)+'
open;
end;
//将查询的结果插入表eachcandidate表中
with dm.ResultADO2 do
begin
dm.ResultADO2.Insert;
dm.ResultADO2.fieldbyname('CandidateId').Value :=dm.ResultADO.fieldbyname('candidateId').value;
dm.ResultADO2.FieldByName('CandidateGroupId').Value :=CandidateGroupID;
dm.ResultADO2.fieldbyname('SerialNum').Value :=dm.ResultADO1.fieldbyname('paperserialnumber').value;
dm.ResultADO2.fieldbyname('PaperId').Value :=PaperId;
dm.ResultADO2.fieldbyname('Boxid').value:=Boxid;
if (dm.ResultADO1.FieldByName('Marked').Value =1) and (dm.ResultADO3.fieldbyname('Marked').value=0) then
dm.ResultADO2.fieldbyname('AgreeIsed').Value :=1
else
dm.ResultADO2.fieldbyname('AgreeIsed').Value :=0;
if (dm.ResultADO3.FieldByName('Marked').Value =1) and (dm.ResultADO1.Fieldbyname('Marked').value=0) then
dm.ResultADO2.fieldbyname('RejectIsed').Value :=1
else
dm.ResultADO2.fieldbyname('RejectIsed').Value :=0;
if ((dm.ResultADO1.FieldByName('Marked').value=1) and (dm.ResultADO3.FieldByName('ed').value=1)) or ((dm.ResultADO1.FieldByName('Marked').value=0) and (dm.ResultADO3.FieldByName('ed').value=0)) then
dm.ResultADO2.FieldByName('AbortIsed').value:=1
else
dm.ResultADO2.Fieldbyname('AbortIsed').value:=0;
dm.ResultADO2.Post;
end;
dm.ResultADO1.Next;
end;
end;
dm.ResultADO.Next;
i:=i+1;
ProgressBar1.Position :=i; //进度条进度显示
end;
end;
showmessage('候选人与另选人选票信息统计完毕!');
//先删除统计数据表中的所有数据以便保证统计的正常进行
with dm.candidateRect do
begin
close;
sql.clear;
sql.add('delete from EachCandidate');
execsql;
end;
//开始统计结果
with dm.ResultADO do
begin
close;
sql.clear;
sql.add('select * from candidateRect where image is null');
open;
end;
if dm.ResultADO.RecordCount>0 then
begin
ProgressBar1.Max:=dm.ResultADO.RecordCount;
dm.ResultADO.First;
i:=0;
while not dm.ResultADO.Eof do
begin
//取出模板中的相关信息
CandidateGroupId:=dm.ResultADO.fieldbyname('CandidateGroupId').Value;//候选人组
PaperId:=dm.ResultADO.fieldbyname('Paperid').value; //选票号
halfId:=dm.ResultADO.fieldbyname('halfId').value; //半票号
AgreeRectId:=dm.ResultADO.fieldbyname('AgreeRectId').value; //赞成意见框
RejectRectId:=dm.ResultADO.fieldbyname('RejectRectid').value; //反对意见框
//根据模板中的相关信息去EachPaper表中寻找其每张选票中的选举意见框是否被选中
//首先选择赞成意见框.
with dm.Resultado1 do
begin
close;
sql.clear;
sql.add('select * from EachPaper where (paperid='+inttostr(paperid)+') and (halfid='+inttostr(halfid)+') and (Rectid='+inttostr(AgreeRectId)+')'); //and (firstorsecond='+inttostr(firstorsecond)+')
open;
end;
if dm.ResultADO1.RecordCount>0 then
begin
dm.ResultADO1.First;
while not dm.ResultADO1.Eof do
begin
//根据前面的信息寻找反对意见框的信息
BoxId:=dm.ResultADO1.fieldbyname('BoxId').value;
SerialNum:=dm.ResultADO1.fieldbyname('PaperSerialnumber').value;
with dm.ResultADO3 do
begin
close;
sql.clear;
sql.add('select Marked from EachPaper where RectId='+inttostr(RejectRectId)+' and BoxId='+inttostr(BoxId)+' and PaperId='+inttostr(PaperId)+' and HalfId='+inttostr(halfId)+' and PaperSerialnumber='+inttostr(Serialnum)+'');//and firstOrSecond='+inttostr(firstorsecond)+'
open;
end;
//将查询的结果插入表eachcandidate表中
with dm.ResultADO2 do
begin
dm.ResultADO2.Insert;
dm.ResultADO2.fieldbyname('CandidateId').Value :=dm.ResultADO.fieldbyname('candidateId').value;
dm.ResultADO2.FieldByName('CandidateGroupId').Value :=CandidateGroupID;
dm.ResultADO2.fieldbyname('SerialNum').Value :=dm.ResultADO1.fieldbyname('paperserialnumber').value;
dm.ResultADO2.fieldbyname('PaperId').Value :=PaperId;
dm.ResultADO2.fieldbyname('Boxid').value:=Boxid;
if (dm.ResultADO1.FieldByName('Marked').Value =1) and (dm.ResultADO3.fieldbyname('Marked').value=0) then
dm.ResultADO2.fieldbyname('AgreeIsed').Value :=1
else
dm.ResultADO2.fieldbyname('AgreeIsed').Value :=0;
if (dm.ResultADO3.FieldByName('Marked').Value =1) and (dm.ResultADO1.Fieldbyname('Marked').value=0) then
dm.ResultADO2.fieldbyname('RejectIsed').Value :=1
else
dm.ResultADO2.fieldbyname('RejectIsed').Value :=0;
if ((dm.ResultADO1.FieldByName('Marked').value=1) and (dm.ResultADO3.FieldByName('ed').value=1)) or ((dm.ResultADO1.FieldByName('Marked').value=0) and (dm.ResultADO3.FieldByName('ed').value=0)) then
dm.ResultADO2.FieldByName('AbortIsed').value:=1
else
dm.ResultADO2.Fieldbyname('AbortIsed').value:=0;
dm.ResultADO2.Post;
end;
dm.ResultADO1.Next;
end;
end;
dm.ResultADO.Next;
i:=i+1;
ProgressBar1.Position :=i; //进度条进度显示
end;
end;
showmessage('候选人与另选人选票信息统计完毕!');
利用视图吧