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

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

Locate и поиск далее..


Alexandra ©   (2009-04-07 15:13:00) 

Подскажите, как далее заставить курсор перемещаться по БД, если метод Locate нашёл несколько одинаковых записей ?
Спасибо.


Alexandra   (2009-04-10 13:16:00) [1]

..нашла метод проще...используя .......кратенько
var
DSAfterScroll: TDataSetNotifyEvent;
DSDataChange: TDataChangeEvent;
begin
DSAfterScroll := DateSet.AfterScroll;
DSDataChange := DataSource.OnDataChange;

DateSet.AfterScroll := nil;
DataSource.OnDataChange := nil;
SearchNext;
DateSet.AfterScroll := DSAfterScroll;
DataSource.OnDataChange := DSDataChange;
end;
фукцию  SearchNext;
сделала путём перебирания записей по фильтру
DataSet.Filter

спасибо Всем!


MsGuns   (2009-04-09 17:24:00) [2]

Если исп-ся ADO, то создать клон датасета (один раз), а затем для каждого поиска фильтровать его (OnFilterRecord), и собственно поиск следующей (предыдущей, первой, последней) выполнять в нем. Из найденной записи считывать UID, по которому затием Locate в отображаемом НД

Создание клона и каждое изменение фильтра будет занимать некоторое время, но при "поточном" поиске работает быстрее обычного скана.

Радикальное решение - огрничить отображаемый датасет разумным количеством записей (до тысячи) - в этом случае сканирование выполняется вполне быстро.

Разумеется перед началом сканирования "вырубать" датасет DisableControl, а по завершению врубать EnableControl


Anatoly Podgoretsky   (2009-04-09 15:16:00) [3]

> Alexandra  (09.04.2009 15:04:10)  [10]

А ты проверь, ну и обрати на рекомендации, как ускорить перемещение.


Anatoly Podgoretsky   (2009-04-09 15:15:00) [4]

> Alexandra  (09.04.2009 14:32:07)  [7]

Не понимаю, и оно подтвержается справкой.

> Locate uses the fastest possible method to locate matching records. If the search fields in KeyFields are indexed and the index is compatible with the specified search options, Locate uses the index. Otherwise Locate creates a filter for the search.

Вариант с фильтром + Next вполне компромистный и плюс вариант фильтр и Locate по ID
Под фильтром понимается WHERE условие поиска.
Фильтр не требуется, если скорость устраивает и при перемещение по сортированому полю, там все записи подряд.

Так что все равно NEXT с различными вариантами.


Alexandra   (2009-04-09 15:04:00) [5]

clickmaker , ну понятно что с текущей, м-д Next перебирает все записи , а если в таблице их тысячи ? То времени очень много уходит за поиск.


clickmaker   (2009-04-09 14:53:00) [6]

> что методом Next это будет перебираться каждая запись

сначала Locate, а потом Next
Next начинает не с начала а с текущей позиции


Игорь Шевченко   (2009-04-09 14:43:00) [7]


> Есть другие варианты ?


Есть:

1 - искать только первую запись.
2 - написать SQL-запрос, выбирающий записи в соответствии с условием поиска

Целых два варианта, наверное еще можно предложить


Alexandra   (2009-04-09 14:32:00) [8]

Anatoly Podgoretsky < ну вы же сами понимаете что методом Next это будет перебираться каждая запись, а это очень долго.
Есть другие варианты ?


Anatoly Podgoretsky   (2009-04-07 15:53:00) [9]

.Next и проверка на условие, первое перемещение можно сделать с помощью Locate


Alexandra   (2009-04-07 15:51:00) [10]

это я уже поняла.
Подскажите метод, который бы перемещал!?


Anatoly Podgoretsky   (2009-04-07 15:44:00) [11]

> Alexandra  (07.04.2009 15:13:00)  [0]

Locate не перемещается по БД и в соотвествии с названием позиционируется на первую запись в наборе данных.


Anatoly Podgoretsky   (2009-04-07 15:44:00) [12]

Удалено модератором


Amoeba   (2009-04-07 15:19:00) [13]


> если метод Locate нашёл несколько одинаковых записей

И каким-таким образом Вам такое удалось? Locate ведь находит только одну - 1-ю запись, удовлетворяющую условию.


Игорь Шевченко   (2009-04-07 15:18:00) [14]

метод Locate не находит несколько записей, не обманывай


Наверх

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