Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 16.02.2013, 13:43
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию Поиск по БД access тип поля "Memo"

Всем привет друзья, такой вопрос. Как организовать поиск по Бд access с типом поля "Memo"?
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ADOQuery1.Close; 
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * From sinema where' +Edit1.Text);
ADOQuery1.Open;
DataSource1.DataSet:=ADOQuery1; 
end; 
Пробовал вот так но видимо данный метод сработает лишь в текстовом поле.
Ответить с цитированием
  #2  
Старый 17.02.2013, 00:15
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

необязательно перезапрашивать каждый раз при смене поиска =)

есть свойство Filter

ADOQuery1.Filter:='name LIKE '+QuotedStr('%'+Trim(Memo1.Text)+'%');

насчёт Мемо? какая конкретно проблема? мой пример,данные беруться из Memo (точно также как из Edit'a )
Ответить с цитированием
  #3  
Старый 17.02.2013, 00:52
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

В вопросе с Memo имеется ввиду что тип данных поля "Memo" . Стоит база на access, в которой поле которому мне надо сделать поиск имеет тип "Мемо".
Ответить с цитированием
  #4  
Старый 17.02.2013, 01:08
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Код:
If not DBGrid1.DataSource.DataSet.Locate('Информация о прототипе', Edit1.Text, [])
then ShowMessage('Что то не нахожу');
Поиск по базе у меня простенький, другой вопрос в том что данный вид поиска не умеет искать в поле типа "Memo".
Ответить с цитированием
  #5  
Старый 17.02.2013, 13:53
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Немного порывшись в сети нашел инфу что в поле типа "Memo" не работает Locate.
Код:
ADOquery1.SQL.Text:=('SELECT  * from Патент where Информация о прототипе like "%"edit1.text"%"');
ADOquery1.Open;
Попробовал такой вид запроса, но вылетает ошибка "Ошибка синтаксиса (пропущен оператор) в выражений запроса like "%"edit1.text"%"' Понимаю что как то не так отправляю запрос, но в чем конкретно причина не могу понять.
Ответить с цитированием
  #6  
Старый 17.02.2013, 15:06
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Вопрос с Поиском решен
Код:
ADOquery1.SQL.Text:=('SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"');
Таким образом, но есть ещё 1 вопрос после того как выполняется запрос БД фильтруется и остается только запись с "Искомым", как сделать так что бы БД не фильтровалась, а просто выделялась запись с "Искомым"?
Ответить с цитированием
  #7  
Старый 17.02.2013, 15:55
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

ну так как Locate не работает с мемо то можно поизвращаться,например, добавить второй adoquery и в нём делать запрос where like..., и посмотреть, если данный запрос возвращает значение,то взять первый id из отфильтрованного списка, и потом через locate подставить этот id в первый dataSet
DBGrid1.DataSource.DataSet.Locate('id', наш_полученный_ид, [])
Ответить с цитированием
  #8  
Старый 17.02.2013, 15:59
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Цитата:
Сообщение от Snake22
ну так как Locate не работает с мемо то можно поизвращаться,например, добавить второй adoquery и в нём делать запрос where like..., и посмотреть, если данный запрос возвращает значение,то взять первый id из отфильтрованного списка, и потом через locate подставить этот id в первый dataSet
DBGrid1.DataSource.DataSet.Locate('id', наш_полученный_ид, [])

Спасибо! Вопрос с поиском решил таким образом:
Код:
ADOquery1.SQL.Text:=('SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"');

Но проблема в том что после того как выполняется запрос, БД фильтруется и остается только запись с "Искомым", как сделать так что бы БД не фильтровалась, а просто выделялась запись с "Искомым"?
Ответить с цитированием
  #9  
Старый 17.02.2013, 16:52
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Цитата:
Но проблема в том что после того как выполняется запрос, БД фильтруется и остается только запись с "Искомым"
это потому что у тебя всё происходит в одном адоквери,

я же написал как сделай.
1) Добавь на форму второй AdoQuery2
2) Дальше твой код будет примерно таким,
Код:
var tmp_id:Integer;
ADOquery2.SQL.Text:='SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"';
Adoquery2.Open;
Adoquery2.RecordSet.MoveFirst;
if (not Adoquery2.BOF)or(not Adoquery2.EOF)
then
   begin
   tmp_id:=Integer(AdoQuery2,Recordset.Fields[0].Value); //Здесь подразумевается что у тебя в первой колонке таблицы Патент стоит уникальный код.
   DBGrid1.DataSource.DataSet.Locate('ИД', tmp_id, []);
   end 
else ShowMessage('Что то не нахожу');
Adoquery2.Close;
зы кто вообще учил русские таблицы и идентификаторы задавать)

Последний раз редактировалось Snake22, 17.02.2013 в 17:05.
Ответить с цитированием
  #10  
Старый 17.02.2013, 17:04
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Аааа блин, спасибо! Не догнал с первого раза!=))) щас посмотрю
Ответить с цитированием
  #11  
Старый 17.02.2013, 17:11
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Все компилируется и работает нормально, но проблема таки осталась, БД все равно фильтруется

Последний раз редактировалось borockov, 17.02.2013 в 17:14.
Ответить с цитированием
  #12  
Старый 17.02.2013, 17:14
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Код:
procedure TForm2.Button2Click(Sender: TObject);
var
tmp_id:Integer;
begin
ADOquery1.SQL.Text:=('SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"');
ADOquery1.Open;
ADOquery2.SQL.Text:='SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"';
Adoquery2.Open;
Adoquery2.RecordSet.MoveFirst;
if (not Adoquery2.BOF)or(not Adoquery2.EOF)
then
   begin
   tmp_id:=Integer(AdoQuery2.Recordset.Fields[0].Value); //Здесь подразумевается что у тебя в первой колонке таблицы Патент стоит уникальный код.
   DBGrid1.DataSource.DataSet.Locate('id', tmp_id, []);
   end
else ShowMessage('Что то не нахожу');
Adoquery2.Close;

end;
Ответить с цитированием
  #13  
Старый 17.02.2013, 17:16
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

Цитата:
Сообщение от borockov
но проблема таки осталась, БД все равно фильтруется
если твой DBgrid подключен к другому ADoQuery и DataSource то такого быть не может. так как запросы друг на друга не влияют.
проверяй внимательно что и куда у тебя присоеденино,и проверь,куда условие фильтрации прописал,может в первый адоквери

Добавдлено:
а нафига ты эти строчки делаешь? они не нужны
Код:
ADOquery1.SQL.Text:=('SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"');
ADOquery1.Open;
Ответить с цитированием
  #14  
Старый 17.02.2013, 17:17
Snake22 Snake22 вне форума
Активный
 
Регистрация: 20.02.2011
Сообщения: 374
Репутация: 744
По умолчанию

<дубль сообщения>
Ответить с цитированием
  #15  
Старый 17.02.2013, 17:29
Аватар для borockov
borockov borockov вне форума
Начинающий
 
Регистрация: 18.08.2012
Сообщения: 125
Репутация: 10
По умолчанию =)

Огромное тебе спасибо!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:39.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter