![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск в БД [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.