Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.08.2009, 12:22   #1
NikSestrin
Новичок
Джуниор
 
Регистрация: 10.08.2009
Сообщений: 2
По умолчанию Быстрый поиск в TADODataSet в run-time

Здравствуйте! Помогите пожалуйста начинающему организовать быстрый поиск, уважаемые!
База данных Access MDB. Есть таблица с 5 полями и такой структурой:
---------------------------------------------------------------------
Код|Улица | НомерДома | БукваДома | НомерКвартиры | БукваКвартиры
---------------------------------------------------------------------
1 КАГАНОВИЧА 12 А 123 Б
2 КАГАНОВИЧА 13 12 А
3 КАГАНОВИЧА 14 Б 3
4 УШИНСКОГО 1 1
... и т.д.
Всего в базе пока 12000 записей. Планируется в дальнейшем около 20000.
Идея такова. Пользователь вводит в TextEdit полный адрес, например:

КАГАНОВИЧА 12 А 123 Б

По мере ввода каждого нового символа, в ListBox отображаются пять записей,
с полным адресом, начинающийся с текста введенного в TextEdit.
Короче нужно организовать быстрый поиск искомого адреса
и в дальнейшем использовать значение поля [Код] найденной записи.
Делаю так. Создаю из представленной таблицы сохраненный запрос с именем [АдресПолный]. В нем два поляЖ
[Код] и строковый [Адрес]. Значения в поле [Адрес] получаю путем конкатенации полей [Улица], [НомерДома] и т.д.
Все отлично. Я понимаю, что для быстрого поиска нужно проиндексировать поле [Адрес].
Сохраненный запрос не позволяет это сделать или я об этом не знаю.
Поэтому решил использовать TADODataSet, созданный в run-time, загрузить в него данные из запроса,
проиндексировать поле [Адрес] и производить поиск уже в DataSet. Вот так это выглядит:

Var
DS: TADODataSet;
...
На событие OnCreate формы такой код:

1. DS:= TADODataSet.Create(Self);
2. DS.Connection:= DataModule.Connect;
3. DS.CommandType:= cmdTable;
4. DS.CommandText:= 'АдресПолный';
5. DS.IndexFieldNames:= 'Адрес';

6. DS.Active:= True;

Все пока работает нормально. DataSet заполняется примерно за 100 мс.

Организовываю поиск с помощью Locate с частичным совпадением [loPartialKey]
На событии TextBox.OnChange такой код:

if DS.Locate('Адрес', TextBox.Text,[loPartialKey]) = True then
begin
... код заполнения списка ListBox

ан, не тут то было. Поиск работает, но очень медленно. Ищет примерно в течение 1.5-2 сек.
Если отключить строку 5 (определение индекса), то чуть быстрее (странно). Однако при быстром вводе символов
в TextBox - тормоза ужасные. Что-то не так я делаю. Или индексирование делаю неправильно.
Поможите, кто знает, пожалуйста.
NikSestrin вне форума Ответить с цитированием
Старый 10.08.2009, 13:59   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, особо быстро это и не должно работать!..

а что, если попробовать не LOCATE
а через OnFilterRecord возращать true / false в зависимости от попадания подстроки в нужную строку...
(ну и .Filtered := true; разумеется)

дальше, ещё можно попытаться реализовать такую логику, если текст набирают быстро - не фильтровать, начинать фильтрацию только когда пауза между нажатиями клавиш превысила какой-то тайм-аут (маленький.. например, треть секунды)...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.08.2009, 14:36   #3
NikSestrin
Новичок
Джуниор
 
Регистрация: 10.08.2009
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
ну, особо быстро это и не должно работать!..

...
Я пробовал это дело реализовать с помощью датасета положеного на форму. В него загружаю данные из временной таблицы, заполняемой тем же запросом - АдресПолный. И в результате получаем в этом датасете просто мгновенный поиск. Чем отличается датасет в дизайнере от датасета run-time проиндексированного по определенному полю?
NikSestrin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Run-time загрузка таблиц MS SQL Server в DBGrid Delphi 7 Ketra БД в Delphi 3 21.08.2009 16:31
Эффективная утилитка для обнаружения утечек памяти и run-time ошибок Zen2007 Общие вопросы C/C++ 2 19.07.2009 22:54
Run-time error '1004'. Недопустимый параметр! nikolai_P Microsoft Office Excel 2 20.04.2009 18:06
Ошибка Run-Time error 13 DEZuv Microsoft Office Access 0 03.04.2009 12:25
Подскажите! Run-time error '7' Out of memory evgenjp Свободное общение 3 01.10.2008 09:16