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

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

Поиск по контексту с помощью SQL запроса


Страницы:   1 2

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]

Задержку небольшую на выполнение запроса при изменении текста выставить, чтоб не на каждый вводимый символ сразу запрос шел.


Страницы:   1 2

Наверх

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