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

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

Поиск в БД [D7]


SarDoX ©   (2005-01-23 06:12:00) 

база аксесс. есть таблица из тысячи строк. 2 стобца: Nazvanie / Recept
названия короткие, но вот рецепты - бывают и по пол страницы..
мне нужно искать слово(edit1.text) в рецепте(Recept).
сделал так

var zapros:string;
----
form1.ADOQuery1.active:=false;
form1.ADOQuery1.close;
form1.ADOQuery1.SQL.Clear;
zapros:='SELECT nazvanie FROM MYNEWTABLE Where recept like  "%' + edit1.text + '%"';//в эдите храниться искомое слово
form1.ADOQuery1.SQL.text:=zapros  ;
form1.ADOQuery1.open;
но уж очень долго это. можно как нить побыстрее?


Sergey13   (2005-01-25 09:53:00) [1]

2[7] SarDoX   (25.01.05 07:42)
Если устал - отдохни. 8-)


SarDoX   (2005-01-25 07:42:00) [2]

Sergey13
Да, кулинарная книга. Перепроектировать надо бы, но у меня и так 1000 записей, т.е я 1000 раз нажимал копировать - всавить и уже так замучался, что повторять не хочу..


Sergey13   (2005-01-24 11:32:00) [3]

>но уж очень долго это.
А скока "долго"? Для кого "долго"?
>можно как нить побыстрее?
Наверное можно, но полей в БД должно быть больше, как и самих таблиц. Иными словами, перепроектировать все это надо, ИМХО (хотя для поваренной книги может и сойдет). Искать то наверное надо по конкретным критериям, типа по ингридиентам, по продолжительности готовки и т.д. Вот и надо эти критерии как то выделять, а не просто в текст совать. Тут кстати еще нарваться можно на разные формы слов.


Johnmen   (2005-01-24 11:24:00) [4]

>form1.ADOQuery1.active:=false;
>form1.ADOQuery1.close;

Масло масляное ?

>form1.ADOQuery1.SQL.Clear;
>form1.ADOQuery1.SQL.text:=zapros  ;

Масло масляное ?


Erik1   (2005-01-24 11:21:00) [5]

И недадо забывать, что значение надо не подстовлять в запрос, а задавать через параметр. Хотя в данном случае скорости это немного добавит. Больно уж запрос тяжелый.


Atomic   (2005-01-24 08:28:00) [6]

ADOQuery1.Filtered := False;
ADOQuery1.Filter := '[Recept]='''+edit1.text+'''';
ADOQuery1.Filtered := True;


sniknik   (2005-01-23 10:48:00) [7]

быстрее будет если использовать поиск по индексу (тот который индекс будет использовать) и соответственно этот иддекс по этому полю должен быть.

в данном случае индекс не используется, вот если убрать первый знак % то будет... но смысл запроса несколько поменяется.
ищеш вхождение в большом тексте, это не только полный скан таблици но и скан каждого "нехилого" текста, по твоим же словам, в каждой записи.

если не менять смысла, заменить форму всетаки придется, есть такой способ с дополнительной индексированной таблицей куда вносятся слова из текста и ссылка на запись в которой оно находится. это в общем, если подробности, найди описание как реаализован полнотекстовый поиск в MSSQL тебе придется тоже самому реализовывать.


aus   (2005-01-23 08:24:00) [8]

Попробуй использовать фильтр для клиентского НД.

ADOQuery1.Filtered := true; //1 раз
................
ADOQuery1.Filter := 'recept like ...


Но лучше всего в даном случае (мое личное мнение) использовать OnFilterRecord для DBGrid, т.к фильтр не всегда можно составить так, как тебе требуется (по текстовому полю), есть ограничения на маску, почитай в MSDN.


Наверх

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