Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2010, 13:23
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию Фильтрация с помощью ComboBox

Здравствуйте уважаемы кодеры!
Нужна ваша помощь, есть база данных созданная в Access и соединенная с программой через ADOConnection, соединение таблицы (название таблицы: студенты) происходит через ADOQuery, необходимо сделать фильтрацию через ComboBox по нескольким параметрам (учебная группа, специальность, отделение), Но я ума не приложу как это сделать и какой будет код. Я сначала хотел сделать через компонент DBLookupComboBox, но он мне начал редактировать записи. Подскажите как это сделать или в какую сторону копать.
P.S. Проект не коммерческий, я еще студент так что не судите строго
__________________
Windows 7 + Embarcadero RAD Studio 2010
Ответить с цитированием
  #2  
Старый 27.05.2010, 14:33
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию

Решение найдено, если кому то надо могу скинуть исходный код
__________________
Windows 7 + Embarcadero RAD Studio 2010
Ответить с цитированием
  #3  
Старый 27.05.2010, 21:50
MiXa777 MiXa777 вне форума
Прохожий
 
Регистрация: 10.11.2009
Сообщения: 15
Репутация: 10
По умолчанию

кинь мне, выложи где нибуть и кинь ссылку
Ответить с цитированием
  #4  
Старый 28.05.2010, 00:54
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию

Вид формы


Код процедуры
Код:
procedure TForm_filtr.Button1Click(Sender: TObject);
var s: string;
begin
begin
DataModule4.ADOQuery_student.Active:=False;
DataModule4.ADOQuery_student.SQL.Clear;
DataModule4.ADOQuery_student.SQL.Add('SELECT *');
DataModule4.ADOQuery_student.SQL.Add('FROM student');
if CheckBox1.checked then
s:=s+'name_group like '''+ComboBox1.Text+'''';
if CheckBox2.checked then
s:=s+'data_year_income LIKE '''+ComboBox2.Text+'''';
if CheckBox4.checked then
s:=s+'data_status LIKE '''+ComboBox4.Text+'''';
if CheckBox6.checked then
s:=s+'data_payment_method LIKE '''+ComboBox6.Text+'''';
if CheckBox7.checked then
s:=s+'private_country like '''+ComboBox7.Text+'''';
if CheckBox8.checked then
s:=s+'private_region LIKE '''+ComboBox8.Text+'''';
if CheckBox9.checked then
s:=s+'private_nationality LIKE '''+ComboBox9.Text+'''';
if CheckBox10.checked then
s:=s+'private_sex LIKE '''+ComboBox10.Text+'''';
if CheckBox11.checked then
s:=s+'educ_language LIKE '''+ComboBox11.Text+'''';
if CheckBox12.checked then
s:=s+'educ_level '''+ComboBox12.Text+'''';
if CheckBox13.checked then
s:=s+'data_admission LIKE '''+ComboBox13.Text+'''';
if CheckBox14.checked then
s:=s+'data_enrolled LIKE '''+ComboBox14.Text+'''';
if CheckBox15.checked then
s:=s+'data_certified LIKE '''+ComboBox15.Text+'''';
if CheckBox16.checked then
s:=s+'private_dorm LIKE '''+ComboBox16.Text+'''';
if CheckBox17.checked then
s:=s+'data_scholarship LIKE '''+ComboBox17.Text+'''';
if length(s)>0 then
DataModule4.ADOQuery_student.SQL.Add('WHERE '+s);
DataModule4.ADOQuery_student.Active:=True;
end;

Пояснение
Суть этой фильтрации в том что она может фильтровать не по 15 параметрам сразу, а допустим по 3, 4 (сколько вам нужно). Что бы фильтрация работала по нужному параметру нужно поставить галочку(значение True) на CheckBox
__________________
Windows 7 + Embarcadero RAD Studio 2010
Ответить с цитированием
  #5  
Старый 28.05.2010, 09:14
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Хотите сказать, что у вас правильно ограничение собирается по этому примеру? А где " AND " между элементами?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 28.05.2010, 12:00
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию

Да правильно собирается, изначально код был такой
Код:
begin
DataModule4.ADOQuery_student.Active:=False;
DataModule4.ADOQuery_student.SQL.Clear;
DataModule4.ADOQuery_student.SQL.Add('SELECT *');
DataModule4.ADOQuery_student.SQL.Add('FROM student');
DataModule4.ADOQuery_student.SQL.Add(WHERE name_group LIKE '''+ComboBox1.Text+''' and data_year_income LIKE '''+ComboBox1.Text+'''
и т.д но тогда фильтрация проходила если установить ВСЕ 15 параметров, если были установлены 3 параметра из 15 то фильтрация НЕ проходила. Мне подсказали такой выход из ситуации и он прекрасно работает
__________________
Windows 7 + Embarcadero RAD Studio 2010
Ответить с цитированием
  #7  
Старый 28.05.2010, 12:00
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Хотите сказать, что у вас правильно ограничение собирается по этому примеру? А где " AND " между элементами?
Да правильно собирается, изначально код был такой
Код:
begin
DataModule4.ADOQuery_student.Active:=False;
DataModule4.ADOQuery_student.SQL.Clear;
DataModule4.ADOQuery_student.SQL.Add('SELECT *');
DataModule4.ADOQuery_student.SQL.Add('FROM student');
DataModule4.ADOQuery_student.SQL.Add(WHERE name_group LIKE '''+ComboBox1.Text+''' and data_year_income LIKE '''+ComboBox1.Text+'''
и т.д но тогда фильтрация проходила если установить ВСЕ 15 параметров, если были установлены 3 параметра из 15 то фильтрация НЕ проходила. Мне подсказали такой выход из ситуации и он прекрасно работает
__________________
Windows 7 + Embarcadero RAD Studio 2010
Ответить с цитированием
  #8  
Старый 28.05.2010, 13:59
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Быть того не может, что-бы это в том виде как вы дали, правильно работало.
Вот у вас формируется запрос:
Цитата:
select * from student
далее вы начинаете собирать ограничение, допустим CheckBox1.checked = True, тогда уже на этом этапе должны возникать проблемы т.к. s у вас не инициализируется и что в итоге получится в результате выполнения этой строки кода вам никто не скажет:
Код:
s:=s+'name_group like '''+ComboBox1.Text+'''';
Ну допустим, вам повезло и в s изначально ничего не было тогда
s будет равна примерно такому 'name_group like "Физики"'
Идем далее, допустим у вас так-же CheckBox2.checked = True
выполняется строка кода:
Код:
s:=s+'data_year_income LIKE '''+ComboBox2.Text+'''';
Тогда с учетом прошлого значения s мы получим, что-то вроде:
Код:
'name_group like "Физики" data_year_income LIKE "01.01.2010"'

Наконец, после добавления значения в s вы в итоге получите запрос вида:
Код:
'select * from student where name_group like "Физики" data_year_income LIKE "01.01.2010"'
Попытка выполнить такой запрос вызовет 100% ошибку т.к. между условиями отбора отсутствует AND или OR
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 28.05.2010 в 14:03.
Ответить с цитированием
  #9  
Старый 28.05.2010, 16:09
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию

Ну я тогда прям не знаю что даже ответить, я ище мало времени программирую в Delphi, но у меня запрос работает
__________________
Windows 7 + Embarcadero RAD Studio 2010

Последний раз редактировалось Lord, 28.05.2010 в 16:16.
Ответить с цитированием
  #10  
Старый 28.05.2010, 16:41
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

В чудеса я не верю, а компилятор сам вряд-ли за вас дополнит код, так-что скорее всего вы выложили на форум искаженный вариант работающего кода.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 30.05.2010, 01:27
Lord Lord вне форума
Прохожий
 
Регистрация: 20.05.2010
Адрес: TLT City
Сообщения: 7
Репутация: 10
По умолчанию

Страдалецъ вы были правы, я крайне извиняюсь я выложил не правильный код

вот правильный
Код:
DataModule4.ADOQuery_student.Active:=False;
DataModule4.ADOQuery_student.SQL.Clear;
DataModule4.ADOQuery_student.SQL.Add('SELECT *');
DataModule4.ADOQuery_student.SQL.Add('FROM student');
if CheckBox2.checked then
s:=s+'AND data_year_income LIKE '''+ComboBox2.Text+'''';
if CheckBox4.checked then
s:=s+'AND data_status LIKE '''+ComboBox4.Text+'''';
if CheckBox6.checked then
s:=s+'AND data_payment_method LIKE '''+ComboBox6.Text+'''';
if length(s)>0 then
DataModule4.ADOQuery_student.SQL.Add('WHERE name_group like '''+ComboBox1.Text+'''' +s);
DataModule4.ADOQuery_student.Active:=True;

Если заметите исправлена ошибка с AND
Код:
if CheckBox2.checked then
s:=s+'AND data_year_income LIKE '''+ComboBox2.Text+'''';

Чтобы запрос работал правильно нужно обязательно указать выбор в ComboBox1 (в данном случае у меня забита туда таблица "группы")
__________________
Windows 7 + Embarcadero RAD Studio 2010
Ответить с цитированием
  #12  
Старый 31.05.2010, 11:00
Black Raider Black Raider вне форума
Местный
 
Регистрация: 31.05.2010
Адрес: Москва
Сообщения: 466
Версия Delphi: 7
Репутация: 40
Сообщение

То же самое можно сделать без перезапроса к Базе.
через свойства Filter и filered компонента ADOQUERY
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:26.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter