因为记录量很大,处理很慢,请问高手们好的解决方法! procedure TForm1.yss1Click(Sender: TObject);
var
i,j,pd: integer;
xs: array[1..8,0..8] of Integer;
a: array[0..1] of integer;
b: array[0..1] of integer;
begin
closeallbut();
for i:=0 to 1 do
begin
a[i]:=0;
b[i]:=i;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 信息 where 序号= '+no.Caption);
ADOQuery1.Open;
for i:=1 to 8 do
begin
xs[i,0]:=0;
xs[1,i]:=ADOQuery1.FieldByName( 'a '+IntToStr(i)).AsInteger;
xs[2,i]:=ADOQuery1.FieldByName( 'b '+IntToStr(i)).AsInteger;
xs[3,i]:=ADOQuery1.FieldByName( 'c '+IntToStr(i)).AsInteger;
xs[4,i]:=ADOQuery1.FieldByName( 'd '+IntToStr(i)).AsInteger;
xs[5,i]:=ADOQuery1.FieldByName( 'e '+IntToStr(i)).AsInteger;
xs[6,i]:=ADOQuery1.FieldByName( 'f '+IntToStr(i)).AsInteger;
xs[7,i]:=ADOQuery1.FieldByName( 'g '+IntToStr(i)).AsInteger;
xs[8,i]:=ADOQuery1.FieldByName( 'h '+IntToStr(i)).AsInteger;
end;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 公式1 ');
ADOQuery1.Open;
ADOQuery1.First;
Gauge1.MaxValue:=ADOQuery1.RecordCount;
While not ADOQuery1.Eof do //记录数100W左右
begin
Gauge1.Progress:=ADOQuery1.RecNo;
StatusBar1.Panels[2].Text:= ' 计算中...... ';
application.ProcessMessages;
pd:=xs[1,ADOQuery1.FieldByName( 'i1 ').AsInteger]+xs[2,ADOQuery1.FieldByName( 'i2 ').AsInteger]+xs[3,ADOQuery1.FieldByName( 'i3 ').AsInteger]+xs[4,ADOQuery1.FieldByName( 'i4 ').AsInteger] +xs[5,ADOQuery1.FieldByName( 'i5 ').AsInteger]+xs[6,ADOQuery1.FieldByName( 'i6 ').AsInteger]+xs[7,ADOQuery1.FieldByName( 'i7 ').AsInteger]+xs[8,ADOQuery1.FieldByName( 'i8 ').AsInteger];
pd:=pd mod 2;
a[pd]:=a[pd]+1;
ADOQuery1.Next;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
StatusBar1.Panels[2].Text:= ' 计算已完成. ';
application.ProcessMessages;
for i:=0 to 0 do
begin
for j:=i+1 to 1 do
begin
if a[i] <a[j] then
begin
pd:=a[j];
a[j]:=a[i];
a[i]:=pd;
pd:=b[j];
b[j]:=b[i];
b[i]:=pd;
end;
end;
end;
lla1.Caption:= ' ';
j:=0;
For i:=0 to 1 do
begin
if b[i]=0 then
begin
lla1.Caption:=lla1.Caption+ '- '+IntToStr(a[i])+ '次 ';
end
else
begin
lla1.Caption:=lla1.Caption+ '- '+IntToStr(a[i])+ '次 ';
end;
if i=0 then
begin
lla1.Caption:=lla1.Caption+ ' / ';
end;
j:=j+a[i];
end;
lla1.Caption:=lla1.Caption+ ' 共 '+IntToStr(j)+ '次 ';
for i:=0 to 0 do
begin
if a[i] < >0 then
begin
for j:=1 to 49 do
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 属性表 where 号码= '+IntToStr(j));
ADOQuery1.Open;
if b[i]=ADOQuery1.FieldByName( 'CA ').AsInteger then
begin
TCheckBox(FindComponent( 'CheckBox '+IntToStr(j))).Checked:=True;
end
else
begin
TCheckBox(FindComponent( 'CheckBox '+IntToStr(j))).Checked:=false;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
end;
end;
end;
application.ProcessMessages;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 结果 where 序号= '+no.Caption);
ADOQuery1.Open;
ADOQuery1.Edit;
For i:=1 to 49 do
begin
ADOQuery1.FieldByName( 'i '+IntToStr(i)).AsString:=BoolToStr(TCheckBox(FindComponent( 'CheckBox '+IntToStr(i))).Checked);
end;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
openallbut();
end;
var
i,j,pd: integer;
xs: array[1..8,0..8] of Integer;
a: array[0..1] of integer;
b: array[0..1] of integer;
begin
closeallbut();
for i:=0 to 1 do
begin
a[i]:=0;
b[i]:=i;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 信息 where 序号= '+no.Caption);
ADOQuery1.Open;
for i:=1 to 8 do
begin
xs[i,0]:=0;
xs[1,i]:=ADOQuery1.FieldByName( 'a '+IntToStr(i)).AsInteger;
xs[2,i]:=ADOQuery1.FieldByName( 'b '+IntToStr(i)).AsInteger;
xs[3,i]:=ADOQuery1.FieldByName( 'c '+IntToStr(i)).AsInteger;
xs[4,i]:=ADOQuery1.FieldByName( 'd '+IntToStr(i)).AsInteger;
xs[5,i]:=ADOQuery1.FieldByName( 'e '+IntToStr(i)).AsInteger;
xs[6,i]:=ADOQuery1.FieldByName( 'f '+IntToStr(i)).AsInteger;
xs[7,i]:=ADOQuery1.FieldByName( 'g '+IntToStr(i)).AsInteger;
xs[8,i]:=ADOQuery1.FieldByName( 'h '+IntToStr(i)).AsInteger;
end;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 公式1 ');
ADOQuery1.Open;
ADOQuery1.First;
Gauge1.MaxValue:=ADOQuery1.RecordCount;
While not ADOQuery1.Eof do //记录数100W左右
begin
Gauge1.Progress:=ADOQuery1.RecNo;
StatusBar1.Panels[2].Text:= ' 计算中...... ';
application.ProcessMessages;
pd:=xs[1,ADOQuery1.FieldByName( 'i1 ').AsInteger]+xs[2,ADOQuery1.FieldByName( 'i2 ').AsInteger]+xs[3,ADOQuery1.FieldByName( 'i3 ').AsInteger]+xs[4,ADOQuery1.FieldByName( 'i4 ').AsInteger] +xs[5,ADOQuery1.FieldByName( 'i5 ').AsInteger]+xs[6,ADOQuery1.FieldByName( 'i6 ').AsInteger]+xs[7,ADOQuery1.FieldByName( 'i7 ').AsInteger]+xs[8,ADOQuery1.FieldByName( 'i8 ').AsInteger];
pd:=pd mod 2;
a[pd]:=a[pd]+1;
ADOQuery1.Next;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
StatusBar1.Panels[2].Text:= ' 计算已完成. ';
application.ProcessMessages;
for i:=0 to 0 do
begin
for j:=i+1 to 1 do
begin
if a[i] <a[j] then
begin
pd:=a[j];
a[j]:=a[i];
a[i]:=pd;
pd:=b[j];
b[j]:=b[i];
b[i]:=pd;
end;
end;
end;
lla1.Caption:= ' ';
j:=0;
For i:=0 to 1 do
begin
if b[i]=0 then
begin
lla1.Caption:=lla1.Caption+ '- '+IntToStr(a[i])+ '次 ';
end
else
begin
lla1.Caption:=lla1.Caption+ '- '+IntToStr(a[i])+ '次 ';
end;
if i=0 then
begin
lla1.Caption:=lla1.Caption+ ' / ';
end;
j:=j+a[i];
end;
lla1.Caption:=lla1.Caption+ ' 共 '+IntToStr(j)+ '次 ';
for i:=0 to 0 do
begin
if a[i] < >0 then
begin
for j:=1 to 49 do
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 属性表 where 号码= '+IntToStr(j));
ADOQuery1.Open;
if b[i]=ADOQuery1.FieldByName( 'CA ').AsInteger then
begin
TCheckBox(FindComponent( 'CheckBox '+IntToStr(j))).Checked:=True;
end
else
begin
TCheckBox(FindComponent( 'CheckBox '+IntToStr(j))).Checked:=false;
end;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
end;
end;
end;
application.ProcessMessages;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add( 'SELECT * From 结果 where 序号= '+no.Caption);
ADOQuery1.Open;
ADOQuery1.Edit;
For i:=1 to 49 do
begin
ADOQuery1.FieldByName( 'i '+IntToStr(i)).AsString:=BoolToStr(TCheckBox(FindComponent( 'CheckBox '+IntToStr(i))).Checked);
end;
ADOQuery1.Post;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
openallbut();
end;
程序会在每次循环后检查是否到达记录末端,改用for循环
ADOQuery1.SQL.Add( 'SELECT * From 公式1 ');
ADOQuery1.Open;
ADOQuery1.First;
Gauge1.MaxValue:=ADOQuery1.RecordCount; 这样处理感觉不好,几万的数据库可以这样打开,100W应该使用分页方式打开这个数据库,这样内存占用少,处理速度快。