Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 искать не сначала, а начиная со следующей записи.


Наверх

Титульная страница Поиск, карта сайта Написать письмо