![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск по контексту с помощью SQL запроса
Jioniro © (2005-09-22 11:47:00)Привет всем!!!
Имеется таблица Paradox с наименованиями товаров(String[254]).
Выполняю поиск по контексту с помощью запроса
SELECT Name FROM "Art.db" Art where
(UPPER(Name) LIKE ''%'+AnsiUpperCase(Edit1.Text)+'%'')
и результат вывожу в DbGrid. Запрос выполняется при каждом изменении
значения Edit1.Text.
Таблица имеет порядка 20000 записей. Как можно догадаться поиск выполняется с задержками
1-2 сек (при выполнении запроса).
Подскажите плз можно ли ускорить выполнение запроса или предложите другой
способ поиска по контексту.
msguns (2005-09-22 13:53:00) [21]>sniknik © (22.09.05 13:46) [11]
SELECT Name FROM "Art.db" Art where
(UPPER(Name) LIKE ''%'+AnsiUpperCase(Edit1.Text)+'%'')
и результат вывожу в DbGrid. Запрос выполняется
Найденные записи отображаются в другом гриде. Исходный не трогается.
>Курдль © (22.09.05 13:46) [12]
>А вот здесь ты не прав! Особенно насчет "попробуй"! :)
>Код взят из базового класса списочных форм
"Базовый" класс работает с парадоксом на сети ? И исходный (фильтруемый) НД получен через TXXTable ?
Jioniro (2005-09-22 13:52:00) [22]>Val
Подробнее задача выглядит след образом:
Ассортимент магазина порядка 20000 наименований товара,
когда приходит накладная на товар ее необходимо быстро ввести и
передать продавцам цены, ценники и т.д.
Наименование товара выглядит примерно так -
"Масло Долина Сканди 400 гр 80% Легкое Щвеция"
Сам понимаешь поиск в 20000 таких записей должен быть удобным и с минимальным кол-вом операций. При этом он должен быть по нескольким контекстам потому что глупый юзер может назвать запись -
"Долина Сканди Масло 400 гр 80% Легкое Щвеция" или ещё как-нить,
кстати задержку попробовал - к сожалению не подходит.
Курдль (2005-09-22 13:46:00) [23]2 msguns ©
А вот здесь ты не прав! Особенно насчет "попробуй"! :)
Код взят из базового класса списочных форм, успешно работающих во многих приложениях. Ты еще кнопку не успеешь отпустить, как фильтр уже отработает!
sniknik (2005-09-22 13:46:00) [24]> Такие проблемы (при небольшом количестве записей) решаются по OnFilterRecords в DataSet-е.
не. это проблема менталитета... и решается или приказом, заставить делать как нужно, или долгими уговорами (не помогут) и последующим печальным опытом, когда нарвется на особо вредного пользователя (который в сердцах не по монитору стукнет а по стяшему рядом разработчику... ;)
допустим я пользователь этой системы... (не дай бог ;) вижу в данных какую то ахинею, вот она рядом. подозреваю не одна запись с подобным "мусором" есть. пытаюсь отфильтровать по этой ахинее (например псевдографика или др. "нестандартные" символы, или просто трудно запоминаемый набор символов), вроде решение очевидно "срисовать" весь набор, и нажать поиск... но ваша система очевидного не даст сделать, любое ошибочное нажатие клавиши просто "сбросит" данные с экрана, и не факт, что удаление этого лишнего символа вернет прошлые значения на экран... и т.д.
в общем предвижу много "ласковых" слов от юзеров в адресраз работчика. ;о))
p.s. если уж делать подобное то хотябы не на каждое нажатие кнопки, а по таймауту, когда активный ввод значения предположительно прекратился.
msguns (2005-09-22 13:43:00) [25]>Курдль © (22.09.05 13:32) [9]
>Подработайте под свою задачу рабочий код:
А ты уверен, что включение фильтра, сканирование исх. НД с переносом данных в некий грид (очевидно, не TDBGrid), затем его выключение и позиционирование НД к исходной точке будет выполняться быстрее, чем простой запрос ? Да еще по каждому тыку по клаве юзера.
Прежде чем советовать, попробуй сам - увидишь, что получится ;)
>Jioniro (22.09.05 12:26) [5]
>Дело в том что операции поиска юзер должен делать постоянно, а нажатие на клавишу "искать" - это лишняя операция, что делает программу неудобной...
"Лишним" будет дерганье картинки на мониторе с тормозами, когда я, как пользователь, захочу найти все записи с "Jioniro". Прежде чем мне удасться ввести все 7 букв, комп 6 раз задумается и моргнет экраном, хотя я четко знаю, что мне нужно.
Курдль (2005-09-22 13:32:00) [26]Подработайте под свою задачу рабочий код:
procedure TfrmSubjects.dxFilterCurChange(Sender: TObject);
begin
inherited;
FFilterValue := AnsiUpperCase((Sender As TdxBarEdit).CurText);
(Sender As TdxBarEdit).Text := (Sender As TdxBarEdit).CurText;
FilterDataSet;
end;
procedure TfrmSubjects.FilterDataSet;
begin
sdqSubjects.DisableControls;
try
sdqSubjects.Filtered := false;
FField := dxDBGrid1.FocusedField;
sdqSubjects.Filtered := (FFilterValue <> '') and (FField <> nil);
finally
sdqSubjects.EnableControls;
end;
end;
evvcom (2005-09-22 13:31:00) [27]+ используй параметры. На парсинг тоже время тратится.
Курдль (2005-09-22 13:25:00) [28]Такие проблемы (при небольшом количестве записей) решаются по OnFilterRecords в DataSet-е.
Val (2005-09-22 13:02:00) [29]>Jioniro (22.09.05 12:26)
что попало...до чего же народ любит себе на задницу искать..
нажатие ввода-проблема? вам поисковики неудобны? или раскройте задачу полнее, вместо того, чтоб все записи тянуть в память, а там искать..хотя - хозяин - барин - таки сам поиск будет быстрее :)
Jioniro (2005-09-22 12:26:00) [30]Дело в том что операции поиска юзер должен делать постоянно, а нажатие на клавишу "искать" - это лишняя операция, что делает программу неудобной...
>Ха! Засунуть столбец Name в безразмерный массив и поиск осуществлять уже в памяти.
не совсем понял... если можно кусочек кода плз.
sniknik (2005-09-22 11:53:00) [31]> или предложите другой способ поиска по контексту
сделай кнопочку "искать" рядом с Edit1. пусть юзер сам решает когда ему его(поиск/выборку) делать.
Sergey13 (2005-09-22 11:52:00) [32]>Запрос выполняется при каждом изменении значения Edit1.Text.
Т.е. при вводе следующей буквы пошел запрос? А нафига. Ввел то что хотел полностью - "нажми на кнопку получишь результат".
Запросы с LIKE '%.....' по определению тормозные.
Chris (2005-09-22 11:51:00) [33]Ха! Засунуть столбец Name в безразмерный массив и поиск осуществлять уже в памяти.
Val (2005-09-22 11:51:00) [34]Задержку небольшую на выполнение запроса при изменении текста выставить, чтоб не на каждый вводимый символ сразу запрос шел.