我使用ZEOS组件连接到(古老的)MDB数据库 我正在进行查询,该查询读入大量数据以桥接到不同的数据库。
有没有办法以百分比表示进度?
procedure TForm13.ActionReadInMemoryExecute(Sender: TObject);
var
QueryLine: string;
FullQuery: string;
Tablename: string;
i: integer;
begin
i:= 0;
TableMeter.DisableControls;
try
TableMeter.First;
FullQuery:= '';
while not TableMeter.eof do begin
Tablename:= TableMeter.FieldByName('tabelnaam').AsString;
QueryLine:= ReplaceStr(ImportQuerySjabloon, cTabelname, Tablename);
FullQuery:= FullQuery + QueryLine;
if (TableMeter.RecNo < (TableMeter.RecordCount -1)) then begin
FullQuery:= FullQuery + ' UNION ALL ';
end;
TableMeter.Next;
end; {while}
QueryImportMeterreadings.Close;
QueryImportMeterreadings.SQL.Text:= FullQuery;
QueryImportMeterreadings.Open; <<-- takes a long time
finally
TableMeter.EnableControls;
end;
end;
是否有方法可以指示查询的进度,或者只有在我拆分单个查询并消除UNION
时才能执行此操作。
运行大约需要1分钟,涉及8个工会。
我没有看到任何可以用于此目的的事件:
或者我应该在查询中的字段上伪造一个OnCalcField来执行此操作(不确定原则上是否会起作用)。
还是附上序列? nope,在Access DB上提供不受支持的操作
答案 0 :(得分:3)
我说分开单个查询并消除联合,围绕每个查询创建一个计时器,具体取决于所用的平均时间*剩余的查询数量,您应该估计/更新文本字段以说出y个查询中的x完成(剩余时间: - 时间 - )
答案 1 :(得分:3)
我会将大量查询拆分为单个查询;在代码中,您迭代每个查询的结果集并手动将值插入clientdataset(cds)。 cds可以连接到dbgrid。然后,您可以显示每个查询何时完成 - 您还可以在处理每个元组后显示进度,但您不会知道总共有多少元组,除非您执行返回元组计数的单独查询。使用这种未连接的cds的问题是你必须在代码中定义字段。这是我昨晚写的一个类似的例子 - 查询全部更新了cds中的一个字段。
const
field1 = 'id';
field2 = 'customer name';
field3 = 'total debt';
procedure TTotalCustDebt.FormCreate(Sender: TObject);
var
strings: tstrings;
begin
with qTotalDebt do // this is the clientdataset
begin
fielddefs.add (field1, ftInteger, 0, false);
fielddefs.add (field2, ftString, 32, false);
fielddefs.add (field3, ftInteger, 0, false);
createdataset;
fieldbyname (field1).visible:= false;
open;
addindex ('idx0', field2, [], '', '', 0);
addindex ('idx1', field2, [ixDescending], '', '', 0);
addindex ('idx2', field3, [], '', '', 0);
addindex ('idx3', field3, [ixDescending], '', '', 0);
strings:= tstringlist.create;
getindexnames (strings);
strings.free;
end;
end;
procedure TTotalCustDebt.PopulateCDS;
begin
dsTotalDebt.dataset:= nil;
with qTotalDebt do
begin
emptydataset;
indexfieldnames:= field1; // initially sort by customer.id
end;
with qDBills do
begin
params[0].asdate:= dt;
open;
while not eof do
begin
qTotalDebt.append;
qTotalDebt.fieldbyname (field1).asinteger:= qDBillsID.asinteger;
qTotalDebt.fieldbyname (field2).asstring:= qDBillsName.asstring;
qTotalDebt.fieldbyname (field3).asinteger:= qDBillsTot.asinteger;
qTotalDebt.post;
next
end;
close
end;
// show progress indicator
with qDReceipts do
begin
params[0].asdate:= dt;
open;
while not eof do
begin
if qTotalDebt.findkey ([qDReceiptsID.asinteger]) then
begin // customer already exists
qTotalDebt.edit;
qTotalDebt.fieldbyname (field3).asinteger:= - qDReceiptsTot.asinteger
+ qTotalDebt.fieldbyname (field3).asinteger;
end
else
begin // add new record
qTotalDebt.append;
qTotalDebt.fieldbyname (field1).asinteger:= qDReceiptsID.asinteger;
qTotalDebt.fieldbyname (field2).asstring:= qDReceiptsName.asstring;
qTotalDebt.fieldbyname (field3).asinteger:= - qDReceiptsTot.asinteger;
end;
qTotalDebt.post;
next
end;
close
end;
// show progress indicator
// more queries
// at end, attach the clientdataset to the TDataSource
dsTotalDebt.dataset:= qTotalDebt;
end;