Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
ВнизLocate и поиск далее.. Найти похожие ветки
← →
Alexandra (2009-04-07 15:13) [0]Подскажите, как далее заставить курсор перемещаться по БД, если метод Locate нашёл несколько одинаковых записей ?
Спасибо.
← →
Игорь Шевченко © (2009-04-07 15:18) [1]метод Locate не находит несколько записей, не обманывай
← →
Amoeba © (2009-04-07 15:19) [2]
> если метод Locate нашёл несколько одинаковых записей
И каким-таким образом Вам такое удалось? Locate ведь находит только одну - 1-ю запись, удовлетворяющую условию.
← →
Anatoly Podgoretsky © (2009-04-07 15:44) [3]> Alexandra (07.04.2009 15:13:00) [0]
Locate не перемещается по БД и в соотвествии с названием позиционируется на первую запись в наборе данных.
← →
Anatoly Podgoretsky © (2009-04-07 15:44) [4]Удалено модератором
← →
Alexandra (2009-04-07 15:51) [5]это я уже поняла.
Подскажите метод, который бы перемещал!?
← →
Anatoly Podgoretsky © (2009-04-07 15:53) [6].Next и проверка на условие, первое перемещение можно сделать с помощью Locate
← →
Alexandra (2009-04-09 14:32) [7]Anatoly Podgoretsky < ну вы же сами понимаете что методом Next это будет перебираться каждая запись, а это очень долго.
Есть другие варианты ?
← →
Игорь Шевченко © (2009-04-09 14:43) [8]
> Есть другие варианты ?
Есть:
1 - искать только первую запись.
2 - написать SQL-запрос, выбирающий записи в соответствии с условием поиска
Целых два варианта, наверное еще можно предложить
← →
clickmaker © (2009-04-09 14:53) [9]> что методом Next это будет перебираться каждая запись
сначала Locate, а потом Next
Next начинает не с начала а с текущей позиции
← →
Alexandra (2009-04-09 15:04) [10]clickmaker , ну понятно что с текущей, м-д Next перебирает все записи , а если в таблице их тысячи ? То времени очень много уходит за поиск.
← →
Anatoly Podgoretsky © (2009-04-09 15:15) [11]> 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 с различными вариантами.
← →
Anatoly Podgoretsky © (2009-04-09 15:16) [12]> Alexandra (09.04.2009 15:04:10) [10]
А ты проверь, ну и обрати на рекомендации, как ускорить перемещение.
← →
MsGuns © (2009-04-09 17:24) [13]Если исп-ся ADO, то создать клон датасета (один раз), а затем для каждого поиска фильтровать его (OnFilterRecord), и собственно поиск следующей (предыдущей, первой, последней) выполнять в нем. Из найденной записи считывать UID, по которому затием Locate в отображаемом НД
Создание клона и каждое изменение фильтра будет занимать некоторое время, но при "поточном" поиске работает быстрее обычного скана.
Радикальное решение - огрничить отображаемый датасет разумным количеством записей (до тысячи) - в этом случае сканирование выполняется вполне быстро.
Разумеется перед началом сканирования "вырубать" датасет DisableControl, а по завершению врубать EnableControl
← →
Alexandra (2009-04-10 13:16) [14]..нашла метод проще...используя .......кратенько
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
спасибо Всем!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.05.24;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c