Консультация № 142422
27.08.2008, 18:49
0.00 руб.
0 15 2
Пипл! Можете показать на пальцах как реализовать следующий вопрос. Есть база db.mdb, в ней есть поля "Наименование", "Цена", "Размер" и т.д., как можно организовать поиск подстроки в поле "Наименование"? Вариант с Locate хорошо и быстро работает, но ищет только от начала слова, а мне надо чтоб фраза была найдена в любой позиции поля.

Обсуждение

Неизвестный
27.08.2008, 18:56
общий
а вариант с обычным селектом не подходит ?
select * from table where Наименование like '%подстрока%'
Неизвестный
27.08.2008, 19:04
общий
Наверное подходит. А можно поподробнее и с примером кода? Я в самом начале пути программерства на Дельфи. Такой запрос мне нужен динамически в программе. Т.е. ввод в Edit'е текста и затем поиск этого текста в поле "Наименование" по всей базе. Я пока только догадываюсь что на форме должен быть компонент ADOQuery, а вот как им пользоваться х/з.
Неизвестный
27.08.2008, 19:17
общий
это ответ
Здравствуйте, Maximus777!


вы правильно догадываетесь
Adoquery
datasource
и если в будущем будете использовать несколько соединений то еще и adoconnection
по поводу как соединить все эти компоненты

Первым делом нужно на форму бросить компонент ADOConnection1, в свойстве ConnectionString выбрать ваше соединение, для этого нажать Build выбрать поставщика Microsoft Jet 4.0 нажать далее потом выбрать ваш Access файл и проверить подключение, если все хорошо то жмете ОК (все строка подключения задана)

далее бросаете на форму
DataSource из DataAccess
DBgrid из DataControls
ADOQuery из ADO

и связываете их друг с другом

буду писать как код, но это на самом деле нужно будет просто выставить в свойствах компонентов

DBgrid1.DataSourse:=DataSourse1


DataSourse1.DataSet:=ADOQuery1

все настройка компонентов произведена далее к запросам


при нажатии на кнопку например "поиск" выполняется следующий код


with ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from table where Наименование like ''%подстрока%''');
open;
end


и в принципе все

если будут вопросы в минифорум
Неизвестный
27.08.2008, 20:17
общий
Во блин! Строчку скопировал, но в комменте она не полностью. Вот весь запрос:
begin
Close;
SQL.Clear;
SQL.Add('select * from База where Наименование like '%NameClient.text%'');
open;
end
Неизвестный
27.08.2008, 20:27
общий
перед %NameClient.text%
2 кавычки после 3
Неизвестный
27.08.2008, 21:21
общий
Вот так:
SQL.Add('select * from База where Наименование like '''+NameClient.Text+'''');
и компилится и ошибок при работе нет. А как результат поиска лицезреть?
Я до этого делал так:
if not MainForm.BookName.Locate('Наименование', NameClient.text, [loPartialKey]) then ShowMessage(NameClient.text + ' не найден.')
Найденная строка подсвечивалась в гриде. Но поиск работал только от начала фразы. Как можно запрос так же привязать к гриду?
Неизвестный
27.08.2008, 21:25
общий
результат... ну если вы все правильно сделали то все что в запросе должно отображатся в гриде то есть это нечто в виде фильтра.... кстати а где символ % в запросе?
Неизвестный
27.08.2008, 21:46
общий
Да, вот это DataSourse1.DataSet:=ADOQuery1 упустил. Теперь вроде работает, но отфильтровывает всё, грид в итоге чистый. Вот вся конструкция:
procedure TEditRecForm.NameClientKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if Key=39 then
with MainForm.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('select * from База where Наименование like ''%NameClient.Text%''');
open;
end
end;
Очищает грид напрочь.
Неизвестный
27.08.2008, 22:16
общий
В справке нашёл вариант, который меня бы устроил полностью. SQL.Add('select * from База where Наименование containing NameClient.text');
Но при выполнении запроса вылетает ошибка Ошибка синтаксиса (пропущен оператор) в выражении запроса 'Наименование containing NameClient.text' Что ему не хватает?
Неизвестный
28.08.2008, 08:48
общий
это ответ
Здравствуйте, Maximus777!
Поиск подстроки в базе данных осуществляется при помощи SQL типа:
SELECT Наименование FROM db.mdb WHERE Наименование LIKE '%строка%'
Описание LIKE:
'abc%' - Любые строки, которые начинаются с букв "abc".
'abc_' - Строки длиной строго 4 символа, причем первыми символами строки должны быть "abc".
'%z' - Любая последовательность символов, которая обязательно заканчивается символом "z".
'%Rostov%' - Любая последовательность символов, содержащая слово "Rostov" в любом месте строки.
Неизвестный
28.08.2008, 12:36
общий
попробуйте вместо % в моем варианте написать #
Неизвестный
28.08.2008, 12:53
общий
Спасибо. Выяснил в чём дело. Срабатывает с %. НО! Если я прописываю прям в запросе текст. Типа like ''%Иван%''' . Находит и Иванова и Ивановича. Похоже что он не подставляет текст из Edit'а в запрос. И ещё оказывается такой запрос чувствителен к регистру букв. Это не есть гуд. Мне бы по всякому надо. А containing можно вообще как-то заюзать? Вроде в описании сказано что ему без разницы какие буквы искать, большие или маленькие.
Неизвестный
28.08.2008, 13:26
общий
ваш NameClient.Text это Edit тогда нужно писать так

SQL.Add('select * from База where Наименование like ''%'+NameClient.Text+'%''');

Неизвестный
28.08.2008, 13:32
общий
Иииииййяяххууууу!!! Работает!!! Да ещё и не смотря на регистр букв. Спасибо огромное за помощь.
Неизвестный
28.08.2008, 13:38
общий
Пожалуйста..
Форма ответа