Страница 1 из 1

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

Добавлено: Пт 23 окт 2015 15:33
bex007
как сделать поиск по нескольким полям в базу? у меня на форме есть 2 edit-а имя и фамилия, хочу чтоб искал с обоями параметрами вместе и по отдельности тоже. как работать с фильтрами?

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

Добавлено: Пт 23 окт 2015 17:00
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;

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

Добавлено: Сб 24 окт 2015 07:58
bex007
как работает filter с index ?

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

Добавлено: Вт 27 окт 2015 15:52
ViktorV
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, чтобы использовать фильтрацию на стороне сервера. В этом случае, при открытии набора данных, условие фильтра будет добавлено к сгенерированному запросу и только необходимое количество записей будет возвращено.

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

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

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

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

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

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

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

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