Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
1

Фильтрация в Delphi по двум условиям

08.01.2015, 17:42. Показов 2708. Ответов 15
Метки нет (Все метки)

Здравствуйте. Как мне отфильтровать записи в DBGRID по 2 условиям. К примеру у меня имеется таблица с объектами недвижимости DBGRID1. ComboBox1 содержит Тип недвижимости (Квартира, Дом, Коттедж и т.д), а ComboBox 2 - Тип сделки(купля, продажа, аренда). Нужно осуществить фильтрацию в таблице по этим параметрам. Скажите пожалуйста как это реализовать? Приведите пожалуйста пример
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2015, 17:42
Ответы с готовыми решениями:

Фильтрация по двум условиям
у меня есть таблица Ttabel и в ней поле год мне надо отфильтровать данные по двум значениям из...

Архивация по двум условиям
Доброго времени суток, подскажите пожалуйста как архивировать либо раз в 1ч либо по изменению,...

Поиск по двум условиям
Здравствуйте! Сделал поиск по двум условиям. При вводе названия улицы в одно из условий ничего не...

Удалить строку по двум условиям
Добрый день. Нужна помощь. Сам я с vba почти никак. Перерыл весь инет но не нашел как сделать....

15
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 632
08.01.2015, 20:47 2
SQL
1
SELECT * FROM TABLE WHERE Недвижимость = '''+ComboBox1.Text+''' AND Сделка = '''+ComboBox2.Text+'''
?
0
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
09.01.2015, 10:56  [ТС] 3
virtual[ity], Да, спасибо. Но в этом случае эти поля друг от друга зависят. Т.е если я укажу "Недвижимость", но при этом не укажу "Сделку" то запрос не сработает. Если применять OR, то тогда каждый будет работать сам по себе. А мне нужно выводить результаты уже по отфильтрованному запросу. К примеру если в ComboBox "Недвижимость" я укажу "Квартира", выведутся все записи в которых присутствует Квартира. А затем уже на основе отфильтрованных записей, применить фильтрацию по "Тип Сделки".
0
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 632
09.01.2015, 12:12 4
А так если:
на OnChange первого комбобокса
SQL
1
SELECT * FROM TABLE WHERE Недвижимость = '''+ComboBox1.Text+'''
на -//- второго комбобокса
SQL
1
SELECT * FROM TABLE WHERE Недвижимость = '''+ComboBox1.Text+''' AND Сделка = '''+ComboBox2.Text+'''
0
2508 / 1129 / 582
Регистрация: 07.06.2014
Сообщений: 3,281
09.01.2015, 12:12 5
Цитата Сообщение от Aleoo Посмотреть сообщение
Т.е если я укажу "Недвижимость", но при этом не укажу "Сделку" то запрос не сработает.
так в запросе проверяйте - что выбрано и формруйте условие запроса where ... в зависимости от того, что выбрано (если оба выбрано, условия объединяйте через AND )


Цитата Сообщение от Aleoo Посмотреть сообщение
но при этом не укажу "Сделку"
Кстати, а как можно не указать Сделку, если
Цитата Сообщение от Aleoo Посмотреть сообщение
а ComboBox 2 - Тип сделки(купля, продажа, аренда).
?! Значит, либо есть где-то переключатель (чекбокс, например), либо нужно в комбокс2 добавить значение "Все виды сделок" и проверять, что выбрали его...
0
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
09.01.2015, 13:05  [ТС] 6
virtual[ity]

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
procedure Tbaseobject.ComboBox1Change(Sender: TObject);
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM TABLE WHERE ТипНедвижимости ='''+ComboBox1.text+'''');
Connect.T_base_object.Open;
end;
 
procedure Tbaseobject.ComboBox2Change(Sender: TObject);
begin
Connect.T_base_object.SQL.Add('SELECT * FROM TABLE WHERE ТипНедвижимости = '''+ComboBox1.text+''' AND ТипСделки = '''+ComboBox2.text+'''');
Connect.T_base_object.Open;
end;
Возникает окно с предупреждением

Фильтрация в Delphi по двум условиям


Добавлено через 7 минут
Цитата Сообщение от Sergio Leone Посмотреть сообщение
либо нужно в комбокс2 добавить значение "Все виды сделок" и проверять, что выбрали его...
Действительно...
0
2508 / 1129 / 582
Регистрация: 07.06.2014
Сообщений: 3,281
09.01.2015, 13:27 7
в каком случае возникает ошибка - при выборе из ComboBox1 или при выборе из Combox2
Какого типа поле ТипНедвижимости ?
Почему Вы публикуете один текст программы:
Цитата Сообщение от Aleoo Посмотреть сообщение
Delphi
1
Connect.T_base_object.SQL.Add('SELECT * FROM TABLE WHERE ТипНедвижимости ='''+ComboBox1.text+'''');
а на скриншоте явно видно, что выборка идёт из таблицы Объекты_Недвижимости.
Вы партизаните?!

Поймите, чем больше Вы скроете от нас, тем меньше у Вас шансов получить корректный ответ!

А в идеале вообще выложите исходный код проекта в архиве!
0
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 632
09.01.2015, 13:37 8
Ну раз пишет, что ошибка синтаксиса значит точно дело в нем. Если бы он выбирал не из той таблицы, где нет указанных в запросе столбцов, то ошибка и была бы в духе "Столбец1 не найден". Дело в том, что ни чего не говориться о том какая БД используется, что может привести к небольшим нюансам в синтаксисе запроса. Ну а так есть вариант через параметры работать.
0
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
09.01.2015, 14:07  [ТС] 9
virtual[ity], Sergio Leone, Извиняюсь, прилагаю архив с программой и БД.
СкачатьПрог.rar
0
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 632
09.01.2015, 14:48 10
Лучший ответ Сообщение было отмечено Aleoo как решение

Решение

Вообщем как и думал, но стоило убедиться! А кто будет очищать ADOSQL от предыдущего запроса?
Цитата Сообщение от Aleoo Посмотреть сообщение
procedure Tbaseobject.ComboBox1Change(Sender: TObject);
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM TABLE WHERE ТипНедвижимости ='''+ComboBox1.text+'''');
Connect.T_base_object.Open;
end;
procedure Tbaseobject.ComboBox2Change(Sender: TObject);
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM TABLE WHERE ТипНедвижимости = '''+ComboBox1.text+''' AND ТипСделки = '''+ComboBox2.text+'''');
Connect.T_base_object.Open;
end;
1
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
09.01.2015, 14:57  [ТС] 11
virtual[ity], Действительно получилось. Странно я действовал таким методом прежде чем Вам написать, но у меня ничего не получилось. Выводился пустой GRID. Но сейчас заработало!
А скажите пожалуйста тогда, если задействовать еще один ComboBox, то действовать по такому же принципу?
0
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 632
09.01.2015, 15:12 12
Скажу честно это какой то костыль, но рабочий
Можно установить Grid из EhLib и настроить локальную сортировку по принципу фильтра в Excel или же Access.
Либо поработать со структурой базы, не хранить все в одной таблице, а разбить на подчиненные таблицы и давать информацию пользователю частично по мере его заинтересованности предложением.
1
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
09.01.2015, 18:35  [ТС] 13
virtual[ity], Действительно костыль... Причем не совсем корректно работает. Если начать фильтрацию с ComboBox2, к примеру и вывести все записи с полем "Аренда", то ничего не выводится. Единственное можно добавить
Delphi
1
Connect.T_base_object.SQL.Add('SELECT * FROM TABLE WHERE ТипСделки ='''+ComboBox2.text+'''');
но в этом случае каждый ComboBox будет работать сам по себе. Тогда я не остановился и решил сделать проверку как мне посоветовал Sergio Leone,

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
procedure Tbaseobject.ComboBox1Change(Sender: TObject);
begin
//Проверяем если оба ComboBox содержат какое то значение то выводим их в запросе 
if (ComboBox1.ItemIndex > 0) AND (ComboBox2.ItemIndex > 0) then
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM Объекты_недвижимости WHERE ТипНедвижимости ='''+ComboBox1.text+''' AND ТипСделки ='''+ComboBox2.text+'''');
Connect.T_base_object.Open;
end;
//Если выбрано значение "Без фильтра" то выводим все записи как обычно
if ComboBox1.ItemIndex = 0 then
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM Объекты_недвижимости WHERE ТипНедвижимости');
Connect.T_base_object.Open;
end else
//Иначе если выбрано любое значение из ComboBox1, то выводим его в запросе
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM Объекты_недвижимости WHERE ТипНедвижимости ='''+ComboBox1.text+'''');
Connect.T_base_object.Open;
end;
end;
// Тут анологично
procedure Tbaseobject.ComboBox2Change(Sender: TObject);
begin
if ComboBox2.ItemIndex = 0 then
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM Объекты_недвижимости WHERE ТипСделки');
Connect.T_base_object.Open;
end 
else
begin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM Объекты_недвижимости WHERE ТипСделки ='''+ComboBox2.text+'''');
Connect.T_base_object.Open;
end;
Но все равно мои старания не увенчались успехом и каждый ComboBox по-прежнему работает сам по себе.
0
165 / 143 / 66
Регистрация: 05.06.2010
Сообщений: 632
09.01.2015, 19:06 14
Я считаю что ComboBox2 не должен быть активен пока не выбран тип недвижимости.
Цитата Сообщение от Aleoo Посмотреть сообщение
Действительно костыль... Причем не совсем корректно работает. Если начать фильтрацию с ComboBox2, к примеру и вывести все записи с полем "Аренда", то ничего не выводится.
Ну это логично, так как в запрос из ComboBox1 передаётся пустая строка и условия не выполняются, следовательно результат = 0.
0
1 / 1 / 0
Регистрация: 18.05.2014
Сообщений: 62
09.01.2015, 19:10  [ТС] 15
virtual[ity], Перекинул
Delphi
1
2
3
4
5
if (ComboBox1.ItemIndex > 0) AND (ComboBox2.ItemIndex > 0) thenbegin
Connect.T_base_object.SQL.Clear;
Connect.T_base_object.SQL.Add('SELECT * FROM Объекты_недвижимости WHERE ТипНедвижимости ='''+ComboBox1.text+''' AND ТипСделки ='''+ComboBox2.text+'''');
Connect.T_base_object.Open;
end;
в конец процедуры ComboBox2. А знаете все оказывается срабатывает, но для этого нужно щелкнуть по ComboBox2 еще один раз, т.е обновить. Думаю сделать так, что б при выборе одного ComboBox, обновлялся другой. Нашел такие функции как RePaint и ReFresh. Думаю как их применить..
0
229 / 161 / 54
Регистрация: 26.10.2014
Сообщений: 919
10.01.2015, 12:32 16
Решал подобную задачу объединив запрос:
SQL
1
SELECT * FROM TABLE WHERE Недвижимость = '''+ComboBox1.Text+''' UNION SELECT * FROM TABLE WHERE Сделка = '''+ComboBox2.Text+'''
.

Repaint и refresh это по моему не то, правильнее на событие onchange первого combobox повесить ComboBox2.Update
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2015, 12:32

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Подсчет значений по двум условиям
Здравствуйте. Помогите пожалуйста с формулой. Вот условие: есть данные где напротив определенного...

Заполнение ячеек по двум условиям
Добрый вечер, как по двум условиям (оплачено и дата) из одного листа (журнал )перенести данные(фио...

Поиск в базе по двум условиям
Добрый день! Буду благодарен если кто либо подскажет можно ли как нибудь цивильно поменять...

Выбрать ID соответствующие двум условиям
| ID | meta_name | meta_value ------------------------------------- |1| name1 | 48 | |1| name2 |...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.