Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.10.28;
Скачать: CL | DM;

Вниз

locate+настройка поиска   Найти похожие ветки 

 
em240 ©   (2007-10-05 11:19) [0]

Возможно ли, с помощью локейта локейт после нахождения записи, при следующем использовании локейт он не искал сначала, а искал начиная со следующей записи.


 
em240 ©   (2007-10-05 11:44) [1]

Возможно ли, после  Locate, при следующем Locate искать не сначала, а начиная со следующей записи.


 
Вася Правильный   (2007-10-05 12:01) [2]

нет


 
Pong   (2007-10-05 14:20) [3]

Вася Правильный   (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 16:22) [4]

и на кой нужен такой геморрой?
гораздо проще и полезнее просто делать Next от первой найденной (если по индексированному полю) или перебор записей


 
Ping   (2007-10-05 17:04) [5]

Вася Правильный   (05.10.07 16:22) [4]

Во-первых, вопрос так звучал.
Во-вторых, перебор через Next - медленный.


 
em240 ©   (2007-10-05 17:17) [6]

Благодарю за помощь


 
Ega23 ©   (2007-10-05 17:18) [7]


> Во-вторых, перебор через Next - медленный.


А через Locate, Ъ, быстрый!


 
Anatoly Podgoretsky ©   (2007-10-05 17:43) [8]

> Ping  (05.10.2007 17:04:05)  [5]

Смешно, не представляешь как работает Locate


 
Ping   (2007-10-05 17:45) [9]

А через Locate, Ъ, быстрый!

Автор не указал используемые компоненты.
Вот, к примеру, в TClientDataSet - Locate в разы быстрее перебора через Next.


 
Ping   (2007-10-05 17:46) [10]

Anatoly Podgoretsky ©   (05.10.07 17:43) [8]

Можно смеяться?


 
Anatoly Podgoretsky ©   (2007-10-05 17:48) [11]


> Locate в разы быстрее перебора через Next.

А здесь можно смеяться?


 
Ping   (2007-10-05 18:23) [12]

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


 
Вася Правильный   (2007-10-05 19:04) [13]


>  в TClientDataSet - Locate в разы быстрее перебора через Next.

1. что-то предложенной установки фильтра я там не наблюдаю
2. коряво написан проход по датасету
3. неизвестно, какой индекс построен в CDS, а Locate использует индексы по возможности


 
Ping   (2007-10-05 19:14) [14]

1. что-то предложенной установки фильтра я там не наблюдаю
2. коряво написан проход по датасету
3. неизвестно, какой индекс построен в CDS, а Locate использует индексы по возможности


Тебе надо - ты и делай. Я выдвинул утверждение и подтвердил его примером. Твои аргументы - просто треп. Напиши так, как ты считаешь нужным - и делай выводы. Для себя. Будут хорошие практические результаты - приводи тут. С радостью расширю кругозор.


 
Anatoly Podgoretsky ©   (2007-10-05 19:39) [15]


> Ping   (05.10.07 18:23) [12]

Здесь можно вообще кататься от смеха по полу, ты даже вопрос то не понял, а туда же со своим кодом.


 
Leonid Troyanovsky ©   (2007-10-05 19:49) [16]


> Ping   (05.10.07 19:14) [14]

> Я выдвинул утверждение и подтвердил его примером.

Пример не может подтвердить тезис о всеобщности.
И, сколько бы ни было таких примеров, они его не подтвердят.

Гораздо более содержательны высказывания о несуществовании.
Вот тогда пример явится подтверждением антитезиса.

--
Regards, LVT.


 
Вася Правильный   (2007-10-05 20:28) [17]


> Тебе надо - ты и делай

мне  - 100 лет не надо
ты же пытаешься что-то даказать, ставя заведомо кривые эксперименты
это как джип и болид F1 сравнивать по скорости на вспаханном поле



Страницы: 1 вся ветка

Текущий архив: 2007.10.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
11-1174493166
Vladimir Kladov
2007-03-21 19:06
2007.10.28
Версия 2.55


2-1191323650
Denis_
2007-10-02 15:14
2007.10.28
Смена даты открытия файла.


6-1172486494
Lucifer099
2007-02-26 13:41
2007.10.28
аналог PINGа


2-1191768817
Jimmy
2007-10-07 18:53
2007.10.28
Динамическая ошибка при CreateOleObject


2-1191784004
Альберт
2007-10-07 23:06
2007.10.28
потоки