Комбинированная фильтрация данных

Всем привет. Нужная помощь. Как сделать фильтрацию данных по нескольким параметрам. Допустим ввожу даные по возрасту от 6 лет до 7 лет он мне фильтрует всех от возраста 6 до 7 лет. После ввожу данные по весу от 10 кг до 15 кг и уже отфильтрованых данных должен сделать фильтрацию по весу от 10 кг до 15 кг. Но ни чего не работает, он мне просто вырубает фильтр. вот образец кода
procedure TForm1.Button4Click(Sender: TObject);
begin
 
if tag = 0 then begin
ADOQuery1.Filtered:=true;
ADOQuery1.Filter:='Возраст>='+#39+edit1.text+#39 +'and Возраст <=' + #39+edit2.text+#39;
tag:=1; end else  begin
ADOQuery1.Filtered:=false; tag:=0; end;
if ADOQuery1.RecordCount = 0 then ShowMessage('Записей за данный период нет!!!');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if tag = 0 then begin
ADOQuery1.Filtered:=true;
 ADOQuery1.Filter:='Вес>='+#39+edit3.text+#39 +'and Вес <=' + #39+edit4.text+#39;
tag:=1; end else  begin
ADOQuery1.Filtered:=false; tag:=0; end;
if ADOQuery1.RecordCount = 0 then ShowMessage('Записей за данный период нет!!!');
end;
5 ответов

а SQL запросом никак?


Так фильтр у тебя затирает предыдущий. Попробуй так
 16  ADOQuery1.Filter := ADOQuery1.Filter + ' and Вес>='+#39+edit3.text+#39 +'and Вес <=' + #39+edit4.text+#39;


Спасибо помогло. Но есть маленькая проблема когда нажимаю на фильтрацию Веса у меня получается при первон нажатии отключается фильтр а при втором включается но выдается все правильно.


когда нажимаю на фильтрацию Веса у меня получается при первон нажатии отключается фильтр а при втором включается но выдается все правильно.
Скорее с этими if связано, надо вашу логику курить.. Если б мне реально попался такой кусок кода, то я бы его выкинул и сделал бы 3 кнопки: фильтр 1, фильтр 2, убрать фильтр. Так навскидку.. 1:
 ADOQuery1.Filtered:=false;
    if ADOQuery1.Filter = '' then ADOQuery1.Filter := 'Возраст>='+#39+edit1.text+#39 +'and Возраст <=' + #39+edit2.text+#39
else ADOQuery1.Filter := ADOQuery1.Filter + ' and Возраст>='+#39+edit1.text+#39 +'and Возраст <=' + #39+edit2.text+#39; 
 ADOQuery1.Filtered:=true;
2 - то же только с весом 3:
ADOQuery1.Filtered:=false;
ADOQuery1.Filter :='';
Чтобы проще и фильтры были независимые и еще в качестве усложнения можно отключать Enabled кнопки 1 или 2 соответственно, чтобы дважды нельзя было нажать, а при удалении фильтра - Enabled кнопок 1,2 включать.


Я тут поддержу qwertehok. SQL запросами. Можно сделать несколько чекбоксов. Динамический SQL-запрос и собирать его в зависимости от выбранных чекбоксов. Тогда фильтр точно будет работать.Не успел до конца ответить утром. Пришлось раньше ретироваться на работу.
по возрасту от 6 лет до 7 лет он мне фильтрует всех от возраста 6 до 7 лет. После ввожу данные по весу от 10 кг до 15 кг и уже отфильтрованых данных должен сделать фильтрацию по весу от 10 кг до 15 кг.
Я так понял Вам необходимо сделать дополнительный фильтр уже отфильтрованных данных? Тут два варианта: 1. Если таблица одна, тогда примерно так:
Query.SQL.Text:='Select [Возраст], [Вес] from TableAge where [Возраст] between ' +quotedSTR(Edit1.text)+' and '+QuotedSTR(Edit2.text) + ' and [Вес] between ' +quotedSTR(Edit3.text)+' and '+QuotedSTR(Edit4.text)
2. Если таблицы две, тогда их нужно объединить Join'ом. Или вложенным селектом воспользоваться. В любом случае правильно составленный SQL-запрос будет работать быстрее, надежнее и правильнее. И не надо городить кучу условий, циклов и т.д.