Как сделать Reload БД?

 
0
 
Delphi, Kylix and Pascal
ava
borockov | 17.02.2013, 22:15
Здравствуйте. У меня такой вопрос. Есть бд access подключена к dbgrid через adoquery. В бд есть поле типа "Memo" мне надо реализовать поиск этому полю. Пробовал сделать через locate, не получилось попробовал через SQL все получается.

procedure TForm2.Button2Click(Sender: TObject);
begin
ADOquery1.SQL.Text:=('SELECT  * from Патент where [Информация о прототипе] LIKE "%' + Edit1.Text + '%"');
ADOquery1.Open;
end;

Но проблема в том что когда выполняется запрос и в БД находим "искомое" БД фильтруется и остаются только записи с искомым. А мне надо что бы БД не фильтровалась а записи в которых найдено "Искомое" как нибудь выделялась, например ячейка dbgrid  окрашивалась в желтый цвет. Помогите пожалуйста, заранее спасибо!
Ответы (13)
ava
Данкинг | 17.02.2013, 22:58 #
Ну вообще-то если к гриду подключён адоквери, то данные из него отображаться и будут. А что с locate не получилось?
ava
borockov | 17.02.2013, 23:11 #

If not DBGrid1.DataSource.DataSet.Locate('Информация о прототипе', Edit1.Text, [])
then ShowMessage('Что то не нахожу');


Вот как то так было с locate. С текстовыми полями все работало отлично, но вот именно с полей "Memo" никак не хотел работать.
ava
Данкинг | 17.02.2013, 23:34 #
А если

DBGrid1.DataSource.DataSet.Locate('Информация о прототипе', Edit1.Text, [locaseinsensitive,loPartialKey])

?
ava
northener | 17.02.2013, 23:38 #
Цитата (borockov @  17.2.2013,  21:15 findReferencedText)
А мне надо что бы БД не фильтровалась а записи в которых найдено "Искомое" как нибудь выделялась, например ячейка dbgrid  окрашивалась в желтый цвет.

Задействуй событие ТDBGrid.OnDrawDataCell., в котором проверяй содержимое этого поля на соответствие или несооветствие своему условию. И в зависимости от результата проверки окрашивай ячейку в нужный цвет.
ava
borockov | 18.02.2013, 00:08 #
Цитата (Данкинг @ 17.2.2013,  23:34)
А если 



DBGrid1.DataSource.DataSet.Locate('Информация о прототипе', Edit1.Text, [locaseinsensitive,loPartialKey])



?



Попробовал. Выскакивает ошибка "Не удается применить порядок сортировки". Где то в инете почитал что locate не может все таки работать с типом "Memo". 


Попробовал. Выскакивает ошибка "Не удается применить порядок сортировки". Где то в инете почитал что locate не может все таки работать с типом "Memo".

Добавлено позднее:
Цитата (northener @ 17.2.2013,  23:38)
Цитата (borockov @  17.2.2013,  21:15 \\"findReferencedText\\")
А мне надо что бы БД не фильтровалась а записи в которых найдено "Искомое" как нибудь выделялась, например ячейка dbgrid  окрашивалась в желтый цвет.


Задействуй событие ТDBGrid.OnDrawDataCell., в котором проверяй содержимое этого поля на соответствие или несооветствие своему условию. И в зависимости от результата проверки окрашивай ячейку в нужный цвет.

Спасибо! С раскрашиванием dbgrid я думаю проблем не будет, мне бы решить этот вопрос с фильтрацией БД.
ava
northener | 18.02.2013, 01:48 #
Цитата (borockov @  18.2.2013,  00:08 findReferencedText)
мне бы решить этот вопрос с фильтрацией БД. 

Какой именно вопрос?
ava
borockov | 18.02.2013, 09:42 #
Цитата (northener @ 18.2.2013,  01:48)
Цитата (borockov @  18.2.2013,  00:08 \\"findReferencedText\\")
мне бы решить этот вопрос с фильтрацией БД. 


Какой именно вопрос?

когда выполняется запрос и в БД находим "искомое" БД фильтруется и остаются только записи с искомым. А мне надо что бы БД не фильтровалась а записи в которых найдено "Искомое" как нибудь выделялась, например ячейка dbgrid  окрашивалась в желтый цвет.

C выделением разобрался, осталось разобраться с фильтрацией.
ava
Данкинг | 18.02.2013, 10:35 #
Мне пришло в голову только такое извращение: задать в таблице уникальной поле-ключ (впрочем, оно и так должно там быть). Найти значение с помощью Lookup, запомнить значение ключа для данной записи. А затем уже искать с помощью Locate, но в ключе.
ava
borockov | 18.02.2013, 11:56 #
Цитата (Данкинг @ 18.2.2013,  10:35)
Мне пришло в голову только такое извращение: задать в таблице уникальной поле-ключ (впрочем, оно и так должно там быть). Найти значение с помощью Lookup, запомнить значение ключа для данной записи. А затем уже искать с помощью Locate, но в ключе.

В бд ключ есть, т.е после того выполнился запрос запомнить ключ и ещё раз пробежаться уже с Locate?
ava
Данкинг | 18.02.2013, 15:56 #
Ну да, я о том же.
ava
borockov | 18.02.2013, 17:37 #
А как запоминать ключи? А если ключей будет несколько? 
ava
northener | 18.02.2013, 18:27 #
Не понимаю зачем нужен отдельный поиск нужных записей?
Чем не годится мой первый совет? http://forum.vingrad.ru/index.php?showtopi...t&p=2548505
ava
Beltar | 19.02.2013, 19:52 #
Можно просто отключить перерисовку контролов, и пройтись по базе, любым текстовым поиском проверяя соответствие поля memo условиям. А для запоминания текущей позиции есть bookmark'и.

Я поиск в поле произвольного типа так сделал:


procedure TClassifierForm.Find(Fwd: Boolean);
var F:TField;
    S,SubStr:String;
    Bookmark:TBookmark;
    Last:Integer;//Если ищем назад, то равно 1, иначе DataSet.RecordCount
    DataSet:TDataSet;
begin
DataSet:=Source.DataSet;
if ((edFind.Text='') or (DataSet=nil)) then Exit;
try
SBar.Panels[2].Text:='Поиск...';
SubStr:=ANSIUpperCase(edFind.Text);
F:=TField(cbFields.Items.Objects[cbFields.ItemIndex]);
DataSet.DisableControls;
Bookmark:=DataSet.GetBookmark;
if Fwd then Last:=DataSet.RecordCount
       else Last:=1;
repeat
if Fwd then DataSet.Next
       else DataSet.Prior;
{Тупые багландовцы более естественное FindNext жутко тормозит}
S:=ANSIUpperCase(F.AsString);
if AnsiPos(SubStr,S)>0 then
  begin
  DataSet.EnableControls;
  Grid.SetFocus;
  Exit;
  end;
if DataSet.RecNo=Last then Break;
until False;
DataSet.GotoBookmark(Bookmark);
ShowMessage('Ничего не найдено');
finally
DataSet.FreeBookmark(Bookmark);
SBar.Panels[2].Text:='';
if DataSet.ControlsDisabled then DataSet.EnableControls;
end;
end;


Если записей не слишком много, то скороть приемлемая.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить