![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Новичок
Джуниор
Регистрация: 10.08.2009
Сообщений: 2
|
![]()
Здравствуйте! Помогите пожалуйста начинающему организовать быстрый поиск, уважаемые!
База данных 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 - тормоза ужасные. Что-то не так я делаю. Или индексирование делаю неправильно. Поможите, кто знает, пожалуйста. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
![]()
ну, особо быстро это и не должно работать!..
а что, если попробовать не LOCATE а через OnFilterRecord возращать true / false в зависимости от попадания подстроки в нужную строку... (ну и .Filtered := true; разумеется) дальше, ещё можно попытаться реализовать такую логику, если текст набирают быстро - не фильтровать, начинать фильтрацию только когда пауза между нажатиями клавиш превысила какой-то тайм-аут (маленький.. например, треть секунды)... |
![]() |
![]() |
![]() |
#3 |
Новичок
Джуниор
Регистрация: 10.08.2009
Сообщений: 2
|
![]()
Я пробовал это дело реализовать с помощью датасета положеного на форму. В него загружаю данные из временной таблицы, заполняемой тем же запросом - АдресПолный. И в результате получаем в этом датасете просто мгновенный поиск. Чем отличается датасет в дизайнере от датасета run-time проиндексированного по определенному полю?
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |