|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Фильтрация с помощью ComboBox
Здравствуйте уважаемы кодеры!
Нужна ваша помощь, есть база данных созданная в Access и соединенная с программой через ADOConnection, соединение таблицы (название таблицы: студенты) происходит через ADOQuery, необходимо сделать фильтрацию через ComboBox по нескольким параметрам (учебная группа, специальность, отделение), Но я ума не приложу как это сделать и какой будет код. Я сначала хотел сделать через компонент DBLookupComboBox, но он мне начал редактировать записи. Подскажите как это сделать или в какую сторону копать. P.S. Проект не коммерческий, я еще студент так что не судите строго Windows 7 + Embarcadero RAD Studio 2010 |
#2
|
|||
|
|||
Решение найдено, если кому то надо могу скинуть исходный код
Windows 7 + Embarcadero RAD Studio 2010 |
#3
|
|||
|
|||
кинь мне, выложи где нибуть и кинь ссылку
|
#4
|
|||
|
|||
Вид формы
Код процедуры Код:
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
|
||||
|
||||
Хотите сказать, что у вас правильно ограничение собирается по этому примеру? А где " AND " между элементами?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#6
|
|||
|
|||
Да правильно собирается, изначально код был такой
Код:
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+''' Windows 7 + Embarcadero RAD Studio 2010 |
#7
|
|||
|
|||
Цитата:
Код:
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+''' Windows 7 + Embarcadero RAD Studio 2010 |
#8
|
||||
|
||||
Быть того не может, что-бы это в том виде как вы дали, правильно работало.
Вот у вас формируется запрос: Цитата:
Код:
s:=s+'name_group like '''+ComboBox1.Text+''''; s будет равна примерно такому 'name_group like "Физики"' Идем далее, допустим у вас так-же CheckBox2.checked = True выполняется строка кода: Код:
s:=s+'data_year_income LIKE '''+ComboBox2.Text+''''; Код:
'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"' Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. Последний раз редактировалось Страдалецъ, 28.05.2010 в 14:03. |
#9
|
|||
|
|||
Ну я тогда прям не знаю что даже ответить, я ище мало времени программирую в Delphi, но у меня запрос работает
Windows 7 + Embarcadero RAD Studio 2010 Последний раз редактировалось Lord, 28.05.2010 в 16:16. |
#10
|
||||
|
||||
В чудеса я не верю, а компилятор сам вряд-ли за вас дополнит код, так-что скорее всего вы выложили на форум искаженный вариант работающего кода.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
Страдалецъ вы были правы, я крайне извиняюсь я выложил не правильный код
вот правильный Код:
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
|
|||
|
|||
То же самое можно сделать без перезапроса к Базе.
через свойства Filter и filered компонента ADOQUERY |