![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
locate+настройка поиска [D7, XP]
em240 © (2007-10-05 11:19:00)Возможно ли, с помощью локейта локейт после нахождения записи, при следующем использовании локейт он не искал сначала, а искал начиная со следующей записи.
Вася Правильный (2007-10-05 20:28:00) [1]
> Тебе надо - ты и делай
мне - 100 лет не надо
ты же пытаешься что-то даказать, ставя заведомо кривые эксперименты
это как джип и болид F1 сравнивать по скорости на вспаханном поле
Leonid Troyanovsky (2007-10-05 19:49:00) [2]
> Ping (05.10.07 19:14) [14]
> Я выдвинул утверждение и подтвердил его примером.
Пример не может подтвердить тезис о всеобщности.
И, сколько бы ни было таких примеров, они его не подтвердят.
Гораздо более содержательны высказывания о несуществовании.
Вот тогда пример явится подтверждением антитезиса.
--
Regards, LVT.
Anatoly Podgoretsky (2007-10-05 19:39:00) [3]
> Ping (05.10.07 18:23) [12]
Здесь можно вообще кататься от смеха по полу, ты даже вопрос то не понял, а туда же со своим кодом.
Ping (2007-10-05 19:14:00) [4]1. что-то предложенной установки фильтра я там не наблюдаю
2. коряво написан проход по датасету
3. неизвестно, какой индекс построен в CDS, а Locate использует индексы по возможности
Тебе надо - ты и делай. Я выдвинул утверждение и подтвердил его примером. Твои аргументы - просто треп. Напиши так, как ты считаешь нужным - и делай выводы. Для себя. Будут хорошие практические результаты - приводи тут. С радостью расширю кругозор.
Вася Правильный (2007-10-05 19:04:00) [5]
> в TClientDataSet - Locate в разы быстрее перебора через Next.
1. что-то предложенной установки фильтра я там не наблюдаю
2. коряво написан проход по датасету
3. неизвестно, какой индекс построен в CDS, а Locate использует индексы по возможности
Ping (2007-10-05 18:23:00) [6]Anatoly Podgoretsky © (05.10.07 17:48) [11]
А здесь можно смеяться?
Смеяться здесь:
procedure TForm1.Button2Click(Sender: TObject);
var
Start: TDateTime;
i: integer;
begin
Start := Now;
ClientDataSet1.DisableControls;
try
WriteLog('Locate started ***');
for i := 0 to 999 do
begin
if ClientDataSet1.Locate('Name', 'hfkjsdhfjk', []) then
raise Exception.Create('Something found);
end;
WriteLog('Locate duration: ' + FormatDateTime('nn:ss.zzz', Now - Start));
finally
ClientDataSet1.EnableControls;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
Start: TDateTime;
i: integer;
begin
Start := Now;
ClientDataSet1.DisableControls;
try
WriteLog('Next started ***');
for i := 0 to 999 do
begin
ClientDataSet1.First;
while not ClientDataSet1.Eof do
begin
if (ClientDataSet1.FieldByName('Name').AsString = 'hfkjsdhfjk') then
raise Exception.Create('Something found');
ClientDataSet1.Next;
end;
end;
WriteLog('Next duration: ' + FormatDateTime('nn:ss.zzz', Now - Start));
finally
ClientDataSet1.EnableControls;
end;
end;
Лог:
Locate started ***
Locate duration: 00:04.657
Next started ***
Next duration: 00:16.281
Anatoly Podgoretsky (2007-10-05 17:48:00) [7]
> Locate в разы быстрее перебора через Next.
А здесь можно смеяться?
Ping (2007-10-05 17:46:00) [8]Anatoly Podgoretsky © (05.10.07 17:43) [8]
Можно смеяться?
Ping (2007-10-05 17:45:00) [9]А через Locate, Ъ, быстрый!
Автор не указал используемые компоненты.
Вот, к примеру, в TClientDataSet - Locate в разы быстрее перебора через Next.
Anatoly Podgoretsky (2007-10-05 17:43:00) [10]> Ping (05.10.2007 17:04:05) [5]
Смешно, не представляешь как работает Locate
Ega23 (2007-10-05 17:18:00) [11]
> Во-вторых, перебор через Next - медленный.
А через Locate, Ъ, быстрый!
em240 (2007-10-05 17:17:00) [12]Благодарю за помощь
Ping (2007-10-05 17:04:00) [13]Вася Правильный (05.10.07 16:22) [4]
Во-первых, вопрос так звучал.
Во-вторых, перебор через Next - медленный.
Вася Правильный (2007-10-05 16:22:00) [14]и на кой нужен такой геморрой?
гораздо проще и полезнее просто делать Next от первой найденной (если по индексированному полю) или перебор записей
Pong (2007-10-05 14:20:00) [15]Вася Правильный (05.10.07 12:01) [2]
нет
Ну зачем же так категорично. Раз надо, то:
var
sFilter: string;
sOldFilter: string;
sAddFilter: string;
bOldFiltered: boolean;
begin
if DS.Filtered then
sAddFilter := DS.Filter
else
sAddFilter := '';
bOldFiltered := DS.Filtered;
sOldFilter := DS.OldFilter;
try
DS.Filter := sAddFilter;
DS.Filtered := true;
sFilter := '';
while DS.Locate('Name', 'em240', []) do
begin
// Обработка найденной записи
{...}
// Скрываем найденную запись
sFilter := sFilter + ' AND (ID <> ' + DS.FieldByName('ID').AsStirng + ')'; //*
DS.Filter := '(' + sAddFilter + ')' + sFilter;
end;
finally
DS.Filter := sOldFilter;
DS.Filtered := bOldFiltered;
end;
end;
*Откорректировать в зависимости от типа данных первичного ключа
Вася Правильный (2007-10-05 12:01:00) [16]нет
em240 (2007-10-05 11:44:00) [17]Возможно ли, после Locate, при следующем Locate искать не сначала, а начиная со следующей записи.