поиск по нескольким полям

Обсуждение возникших проблем, предложений и ошибок MyDAC компонентов
Ответить
bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

поиск по нескольким полям

Сообщение bex007 » Пт 23 окт 2015 15:33

как сделать поиск по нескольким полям в базу? у меня на форме есть 2 edit-а имя и фамилия, хочу чтоб искал с обоями параметрами вместе и по отдельности тоже. как работать с фильтрами?

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: поиск по нескольким полям

Сообщение bex007 » Пт 23 окт 2015 17:00

Это правилная решения?

Код: Выделить всё

try
myquery1.Filtered:=true;
myquery1.Filter:='';

if edit1.Text<>'' then  begin
myquery1.Filter:=' id='''+edit1.text+''' ';
end;

if edit2.Text<>'' then  begin
if myquery1.Filter='' then  myquery1.Filter:=' username='''+edit2.Text+''' ';
if myquery1.Filter<>'' then  myquery1.Filter:=myquery1.Filter+ ' and username='''+edit2.Text+''' ';
end;

myquery1.close;
myquery1.SQL.Clear;
myquery1.SQL.Text:='SELECT * FROM users';
myquery1.Open;
except
on E: exception do
showmessage(E.Message);
end;

myquery1.Refresh;
MyDataSource1.DataSet.Refresh;
DBGrid1.Refresh;

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: поиск по нескольким полям

Сообщение bex007 » Сб 24 окт 2015 07:58

как работает filter с index ?

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: поиск по нескольким полям

Сообщение ViktorV » Вт 27 окт 2015 15:52

bex007 писал(а):Это правилная решения?

Код: Выделить всё

try
myquery1.Filtered:=true;
myquery1.Filter:='';

if edit1.Text<>'' then  begin
myquery1.Filter:=' id='''+edit1.text+''' ';
end;

if edit2.Text<>'' then  begin
if myquery1.Filter='' then  myquery1.Filter:=' username='''+edit2.Text+''' ';
if myquery1.Filter<>'' then  myquery1.Filter:=myquery1.Filter+ ' and username='''+edit2.Text+''' ';
end;

myquery1.close;
myquery1.SQL.Clear;
myquery1.SQL.Text:='SELECT * FROM users';
myquery1.Open;
except
on E: exception do
showmessage(E.Message);
end;

myquery1.Refresh;
MyDataSource1.DataSet.Refresh;
DBGrid1.Refresh;
Вы привели работоспособное применение локальной фильтрации на клиенте. Обратите внимание, при использовании локального фильтра с сервера вычитываются все данные и только после этого происходит локальная фильтрация на клиенте. Вы можете использовать свойство TMyQuery.FilterSQL, чтобы использовать фильтрацию на стороне сервера. В этом случае, при открытии набора данных, условие фильтра будет добавлено к сгенерированному запросу и только необходимое количество записей будет возвращено.

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: поиск по нескольким полям

Сообщение ViktorV » Вт 27 окт 2015 16:48

bex007 писал(а):как работает filter с index ?
Индексы сервера используются для сортировки и поиска данных на стороне сервера автоматически, например, при выполнении запроса с конструкциями WHERE, ORDER BY, и т.д. Поэтому при использовании свойство TMyQuery.FilterSQL индексы будут использоваться на стороне сервера. Клиент же не может использовать индексы сервера. Таким образом, при использовании локальной фильтрации мы не используем индексы сервера.

bex007
Сообщения: 14
Зарегистрирован: Сб 13 июн 2015 14:19

Re: поиск по нескольким полям

Сообщение bex007 » Вт 27 окт 2015 21:58

Спасибо за ответ :) Как я понял во время использование myquery1.Filter клиент читает все базу и потом фильтрует локально? а TMyQuery.FilterSQL фильтрует прямо на сервере? Когда применяется TMyQuery.FilterSQL как индексы можно использовать? надо прописать в запросе или он сам создает индексирование запроси к базе? просто у меня Большая база данных. простите за мой русски :)

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: поиск по нескольким полям

Сообщение ViktorV » Ср 28 окт 2015 10:21

Да, вы правы: при использовании свойства TMyQuery.Filter клиент вычитывает все данные, удовлетворяющие запросу, и фильтрация происходит локально, а при использовании свойства TMyQuery.FilterSQL фильтрация происходит на стороне сервера. Вопрос по использованию индексов не относится к функциональности MyDAC. Для его решения, пожалуйста, обратитесь к документации MySQL сервера: http://www.mysql.ru/docs/man/MySQL_indexes.html

ViktorV
Devart Team
Сообщения: 202
Зарегистрирован: Чт 31 июл 2014 09:52

Re: поиск по нескольким полям

Сообщение ViktorV » Ср 28 окт 2015 11:16

Вы можете задавать вопросы на английском языке на нашем англоязычном форуме: http://forums.devart.com/

Ответить