![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте уважаемы кодеры!
Нужна ваша помощь, есть база данных созданная в Access и соединенная с программой через ADOConnection, соединение таблицы (название таблицы: студенты) происходит через ADOQuery, необходимо сделать фильтрацию через ComboBox по нескольким параметрам (учебная группа, специальность, отделение), Но я ума не приложу как это сделать и какой будет код. Я сначала хотел сделать через компонент DBLookupComboBox, но он мне начал редактировать записи. Подскажите как это сделать или в какую сторону копать. P.S. Проект не коммерческий, я еще студент так что не судите строго ![]() |
|
#2
|
|||
|
|||
|
Решение найдено, если кому то надо могу скинуть исходный код
|
|
#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 |
|
#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+''' |
|
#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+''' |
|
#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, но у меня запрос работает
Последний раз редактировалось 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 (в данном случае у меня забита туда таблица "группы") |
|
#12
|
|||
|
|||
|
То же самое можно сделать без перезапроса к Базе.
через свойства Filter и filered компонента ADOQUERY |