Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фильтрация по нескольким полям 
:(
    Опции темы
Лиходей
Дата 11.10.2008, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Есть шесть полей вводда (Edit) для задания условия на фильтрацию, причем каждое из полей может быть пустым, лишь бы одно из полей было заполнено.
Применяю следующую конструкцию:

Код

ADOTable1.Filtered:=false;
ADOTable1.Filter:='Имя _поля1 LIKE '+  #39 + Edit1.Text + '%' + #39 +' AND '+'Имя _поля2 LIKE '+  #39 + Edit2.Text + '%' + #39  ......;
ADOTable1.filtered:=true;


которая работат корректно только если все поля заполнены, если одно из полей EDit пустое - вылетает ошибка "аргументы имеют не верный тип".

Как пользоваться OnFilterRecord знаю, но в таблице 300.000 тысяч записей и Filter намного шустрее работает.


PM MAIL   Вверх
vovk
Дата 11.10.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 28.2.2008

Репутация: 6
Всего: 6



Можно сделать набор фильтра типа

Код

var
fltr:string;
.
...
begin
ADOTable1.Filtered:=false;
fltr:='';
if  (Edit1.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'Имя _поля1 LIKE '+  #39 + Edit1.Text + '*' + #39;
if fltr=''   then fltr:='Имя _поля1 LIKE '+  #39 + Edit1.Text + '%' + #39;
      end;
if  (Edit2.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'Имя _поля2 LIKE '+  #39 + Edit2.Text + '%' + #39;
if fltr=''   then fltr:='Имя _поля2 LIKE '+  #39 + Edit2.Text + '%' + #39;
      end;
.....
...
..
.
ADOTable1.Filter:=fltr;
ADOTable1.filtered:=true;
end;


Неизящно но работать должно да и доработать можно

PM MAIL   Вверх
Лиходей
Дата 11.10.2008, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



vovk спасибо за идею. Немного переделал ваш пример. Все работает.
Код

var filtr, add: string;
begin
ADOTable1.filtered:=false;
filtr:='';
if length(edit1.text) > 0 then
  filtr:= 'Имя_поля1 LIKE '+  #39 + Edit1.Text + '%' + #39;

if length(edit2.text) > 0 then
begin
  if length(filtr) > 0 then add:= ' and ' else add:='';
  filtr:=filtr + add + 'Имя_поля2 LIKE '+  #39 + Edit2.Text + '%' + #39;
end;

.....................

  if length(filtr) > 0 then
  begin
    ADOTable1.Filter:= filtr;
    ADOTable1.filtered:=true;
  end
  else Showmessage('Все поля пусты!');

end;


Формируется строка фильтра неизящно, как вы говорите, зато фильтрует быстро. Без проверки полей на наличие\отсутствие данных все равно не обойтись. Еще раз спасибо.
PM MAIL   Вверх
MMihan
Дата 16.12.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



Тоже по благодарю за пример..  но есть пару вопросов.. что такое #39  и почему то ругается всегда на первый едит.. если стираем  его второй   :НЕ удается Открыть Фильтр..  не подскажите в чем причина может быть.. 
PM MAIL   Вверх
Данкинг
Дата 16.12.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(MMihan @  17.12.2011,  00:35 Найти цитируемый пост)
что такое #39

Код одинарной кавычки - ' 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
MMihan
Дата 16.12.2011, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



спасибо.. 

Это сообщение отредактировал(а) MMihan - 17.12.2011, 00:01
PM MAIL   Вверх
Данкинг
Дата 17.12.2011, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



А что должно куда вылетать? Я в примеры-то не вникал. Да и лучше запрос с условием использовать вместо фильтра. Кстати, СУБД какая?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
MMihan
Дата 17.12.2011, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



все разобрался Null не надо...

акцесс... 
 sql запросом делал все отлично работало... но столкнулся с проблемой  .. что   фильтровка и сортировка... сбивают друг друга.. .. результат отображается в Dbgrid.. 


например хота сделать по выбору Радио буттнон сортировка по ФИО или по Серийному номеру..  и тут  же делаем запрос на поиск.. то они сбивали друг друга.. Совместить такое у меня не получилось.. опыта очень мало и знаний

например был такое запрос 
Код

with ADOQuery1 do
     begin


Close;
SQL.Clear;
  SQL.Add('select *' ) ;
  SQL.Add('from Клиент');
  SQL.Add('where ((КЛ  LIKE '''+Edit1.Text+'%'') AND (ФИО  LIKE   '''+Edit2.Text+'%'' OR ФИО IS NULL )  
AND (Оборудование  LIKE   '''+Edit4.Text+'%'' OR Оборудование IS NULL) 
AND (Телефон  LIKE   '''+Edit3.Text+'%'' OR Телефон IS NULL)  AND (Дата > :dt1  AND Дата <:dt2 ) )');
Parameters.ParamByName('dt1').Value:=DateToStr(DateTimePicker1.DateTime);
Parameters.ParamByName('dt2').Value:=DateToStr(DateTimePicker2.DateTime);
   Active:=true;
 DSSearchDoc.DataSet:=ADOQuery1;
 DbGrid1.DataSource:=DSSearchDoc;
ADOQuery1.FieldByName('Внешний вид').Visible:=false;
 DbGrid1.Fields[0].DisplayLabel:='Номер';

   end;  



и вот такая процедура сортировки...


Код


procedure TMForm.RadioGroup1Click(Sender: TObject);


   Begin
 //ADOQuery1.Close;
ADOQuery2.SQL.Clear;
  case RadioGroup1.ItemIndex of
0: ADOQuery2.sql.add('select * from Клиент order by КЛ');
1: ADOQuery2.sql.add('select * from Клиент order by ФИО');
2: ADOQuery2.sql.add('select * from Клиент order by Оборудование');
3: ADOQuery2.sql.add('select * from Клиент order by Дата');
4:ADOQuery2.sql.add('select * from Клиент order by КЛ');

end;

begin

  ADOQuery2.Active:=true;
   DSSearchDoc.DataSet:=ADOQuery2;
   DbGrid1.DataSource:=DSSearchDoc;
end;


end;


Это сообщение отредактировал(а) MMihan - 17.12.2011, 00:13
PM MAIL   Вверх
Данкинг
Дата 17.12.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(MMihan @  17.12.2011,  01:09 Найти цитируемый пост)
что   фильтровка и сортировка... сбивают друг друга

Если их вместо использовать - то конечно.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
MMihan
Дата 17.12.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



а подскажите пожалуйста как  в эту процедуру фильтрования вставить Сортировку 
Код

procedure TMform.SearchDoc(Sender: TObject);


//  case RadioGroup1.ItemIndex of
//0: ADOTAble1.sort:='КЛ';
//1: ADOTAble1.sort:='ФИО';
var
fltr:string;

begin
ADOTable1.Filtered:=false;
fltr:='';
if  (Edit1.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'КЛ LIKE '+  #39 + Edit1.Text + '%' + #39; ;
if fltr=''   then fltr:='КЛ LIKE '+  #39 + Edit1.Text + '%' + #39;
      end;
if  (Edit2.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'ФИО LIKE '+  #39 + Edit2.Text + '%' + #39;
if fltr=''   then fltr:='ФИО LIKE '+  #39 + Edit2.Text + '%' + #39;
      end;

      if  (Edit3.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'Оборудование LIKE '+  #39 + Edit3.Text + '%' + #39;
if fltr=''   then fltr:='Оборудование LIKE '+  #39 + Edit3.Text + '%' + #39;
      end;
      if  (Edit4.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'Телефон LIKE '+  #39 + Edit4.Text + '%' + #39;
if fltr=''   then fltr:='Телефон LIKE '+  #39 + Edit4.Text + '%' + #39;
      end;
      if  (Edit5.Text<>'') then
      begin
if fltr<>'' then fltr:=fltr+' and '+'SN LIKE '+  #39 + Edit5.Text + '%' + #39;
if fltr=''   then fltr:='SN LIKE '+  #39 + Edit5.Text + '%' + #39;
      end;

ADOTable1.Filter:=fltr;
ADOTable1.filtered:=true;
end;



и что то не знаю как с ДАтой поступить..

Это сообщение отредактировал(а) MMihan - 17.12.2011, 00:18
PM MAIL   Вверх
Данкинг
Дата 17.12.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(MMihan @  17.12.2011,  01:16 Найти цитируемый пост)
а подскажите пожалуйста как  в эту процедуру фильтрования вставить Сортировку 

А кто сказал, что её можно вставить в фильтр?
Цитата(MMihan @  17.12.2011,  01:16 Найти цитируемый пост)
и что то не знаю как с ДАтой поступить..

Преобразовать в текст, видимо.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
MMihan
Дата 17.12.2011, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



Спасибо разобрался сделал.. 
осталось 2 пробемы .. почему вылетает ошибка если искать по первому полю КЛ..   Ключ, счетчик
и дата.. в в самом фильтре преобраловать DateToStr(DateTimePicker2.DateTime)? и DateToStr(DateTimePicker1.DateTime) или же сачало нужно 
в var 
DateToStr(DateTimePicker1.DateTime)=dt1 
DateToStr(DateTimePicker2.DateTime)=dt2 
PM MAIL   Вверх
Данкинг
Дата 17.12.2011, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(MMihan @  17.12.2011,  01:35 Найти цитируемый пост)
почему вылетает ошибка если искать по первому полю КЛ..

Какая ошибка?
Цитата(MMihan @  17.12.2011,  01:35 Найти цитируемый пост)
в самом фильтре преобраловать 

Ну, вероятно, в самом фильтре, в строке его формирования, а где ещё.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
MMihan
Дата 17.12.2011, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.12.2011

Репутация: нет
Всего: нет



Не удается открыть фильтр
 делал 
DateToStr(DateTimePicker2.DateTime) и DateToStr(DateTimePicker2.Date)

ошибка .. не соответсвие типов.. РРРРР ох уж эта дата))

Это сообщение отредактировал(а) MMihan - 17.12.2011, 00:57
PM MAIL   Вверх
Данкинг
Дата 17.12.2011, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



А, ну так если это счётчик => поле числовое. А ты его с кавычками берёшь в фильтре.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0872 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.