因为数据集查询慢的原因,常常会使用Filter去筛选数据,这时候去取某个字段的汇总值时,是用循环数据集的做法来算的:adods.First;
while not adods.Eof do
begin
sumResult := sumResult + StrToFloatDef(grd.Columns[i].Field.AsString, 0);
adods.Next;
end;
end;
Result := sumResult;但遇到这个问题,如果当前有Filter,且Filtered为true的时候,如此循环会包含被Filter掉的数据,有没有办法能判断数据集当前定位的行会被Filter掉Locate不行,Filtered为true的时候,如果当前数据集中包含locate条件的记录,但不含在Filter中的话,
Locate会返回true,但实际定位的行却是错误的行..对Filter的内容进行分析的话太麻烦了,还不如开始加个专门sum的数据集做法...
while not adods.Eof do
begin
sumResult := sumResult + StrToFloatDef(grd.Columns[i].Field.AsString, 0);
adods.Next;
end;
end;
Result := sumResult;但遇到这个问题,如果当前有Filter,且Filtered为true的时候,如此循环会包含被Filter掉的数据,有没有办法能判断数据集当前定位的行会被Filter掉Locate不行,Filtered为true的时候,如果当前数据集中包含locate条件的记录,但不含在Filter中的话,
Locate会返回true,但实际定位的行却是错误的行..对Filter的内容进行分析的话太麻烦了,还不如开始加个专门sum的数据集做法...
前题:
1.窗体中用两个ADOQUERY控件(ADOQUERY1,ADOQUERY2),并且两者的SQL.TEXT是相同的.
(select * from [人事表])2.在ADOQUERY2中定好Filter条件. str:='王小明';
Filter:='name like ' +quotedstr('%'+ str+'%');
3.写一判断函数:function TForm1.linname(s: string): Boolean;
begin
if not ADOQuery2.Filtered then
ADOQuery2.Filtered:=true;
Result:=ADOQuery2.Locate('name',s,[]);
end;
4.操作:procedure TForm1.Button1Click(Sender: TObject);
var
vstr:string;
begin
with adoquery1 do begin
if not Active then open;
while not eof do begin
vstr:=FieldValues['name'];
if linname(vstr) then begin
{--如果包含在过滤中的操作--}
end else begin
{--不包含在过滤中的操作--}
end;
next;
end;
end;
end;