因为数据集查询慢的原因,常常会使用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的数据集做法...

解决方案 »

  1.   

    有Filter,且Filtered为true时,这个循环还包括全部的数据,相当于未Filter筛选前 ?怎么会呢?Filter筛选了多少条数据,剩下返回的数据集有多少条,循环就多少条,Locate也一样正常使用...
      

  2.   

    kaikai_kk:使用的ADOQuery,且做过数次测试了..
      

  3.   

    示例:
    前题:
    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;