TQuery не имеет никаких функций поиска, подобно функциям TTable FindKey или GotoKey, поэтому мы часто находим процедуры в проектах Delphi, которые выглядят следующим образом:
function SeqSearch(AQuery: TQuery;
AField, AValue: String): Boolean;
begin
with AQuery do begin
First;
while (not Eof) and
(not (FieldByName(AField).AsString = AValue)) do
Next;
Result := not Eof;
end;
end;
Это последовательный поиск, эта функция перебирает набор данных шаг за шагом до его конца. Требуется максимум времени.
При помощи метода MoveBy возможно осуществить намного лучший алгоритм поиска - двоичный поиск.
function BinSearch(AQuery: TQuery;
AField, AValue: String): Boolean;
var
Hi, Lo: Integer;
begin
with AQuery do begin
First;
Hi := RecordCount;
Lo := 0;
MoveBy(RecordCount div 2);
while (Hi - Lo) > 1 do begin
if (FieldByName(AField).AsString > AValue) then begin
Hi := Hi - ((Hi - Lo) div 2);
MoveBy(((Hi - Lo) div 2) * -1);
end
else begin
Lo := Lo + ((Hi - Lo) div 2);
MoveBy((Hi - Lo) div 2);
end;
end;
if (FieldByName(AField).AsString > AValue) then Prior;
Result := (FieldByName(AField).AsString = AValue)
end;
end;
Единственное условие этой функции, что записи будут отсортированы. Это легко реализовать через инструкцию ORDER BY запроса SQL.
По материалам http://delphi.3000.com
|