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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.04.2009, 02:55
Vesnushka87 Vesnushka87 вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
По умолчанию Фильтрация в BDGrid

Всем приветик. Помогите плизззз....
На форме BDGrid и 2 ComboBox
ComboBox1 - специальность (spec)
ComboBox2 - год (year)
При компиляции в таблице полный список студентов. При необходимости пользователь может отфильтровать список либо по специальности, либо по году выпуска

по отдельности фильтрация у меня получается, но я не понимаю как сделать если будет необходимо отфильтровать по обоим полям.

Код для фильтра по специальности:
Код:
procedure TMainForm.ComboBox1Change(Sender: TObject);
begin
DataModule2.StudentQuery.Active:=false;
DataModule2.StudentQuery.SQL.Clear;
DataModule2.StudentQuery.SQL.Add('Select *');
DataModule2.StudentQuery.SQL.Add('From vipusk');
DataModule2.StudentQuery.SQL.Add('where spec LIKE '''+'%'+Combobox1.text+'%'+'''');
DataModule2.StudentQuery.Active:=true;
end;
Admin: Пользуемся тегами!

Может нужно было сделать по другому но я не знаю как. Может кто поможет ???

Последний раз редактировалось Admin, 05.04.2009 в 13:08.
Ответить с цитированием
  #2  
Старый 05.04.2009, 12:36
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если по одному из вариантов то так:
Код:
DataModule2.StudentQuery.SQL.Add(Format('where spec LIKE %s OR spec LIKE %s',[Combobox1.text,Combobox2.text]));
а если по обоим сразу то так:
Код:
DataModule2.StudentQuery.SQL.Add(Format('where spec LIKE %s AND spec LIKE %s',[Combobox1.text,Combobox2.text]));
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 05.04.2009, 15:54
Vesnushka87 Vesnushka87 вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

создала еще кнопку для фильтрации и прописала вышеуказанный код, но он ошибку выдает =(
Ответить с цитированием
  #4  
Старый 05.04.2009, 23:31
Vesnushka87 Vesnushka87 вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

написала код на кнопку:

Код:
procedure TMainForm.BitBtn2Click(Sender: TObject);

var filtr, // формируемая строка фильтра
add: string;
begin
DataModule2.StudentQuery.filtered:=true;
filtr:='';
if length(Combobox1.text) > 0 then
filtr:= 'spec LIKE '+ #39 + Combobox1.Text + '%' + #39;

if length(Combobox2.text) > 0 then
begin
if length(filtr) > 0 then add:= ' and ' else add:='';
filtr:=filtr + add + 'year LIKE '+ #39 + Combobox2.Text + '%' + #39;
end;


if length(filtr) > 0 then
begin
DataModule2.StudentQuery.Filter:= filtr;
DataModule2.StudentQuery.filtered:=true;
end
else Showmessage('Все поля пусты!');
end;

lmikle: Хде теги???

если combobox пусты то при нажатии на кнопку выходит сообщение, а если я выбираю что-либо из выпадающего списка и нажимаю на кнопку то таблица просто пустеет и не фильтрует. В чем м.б. ошибка ??
Ответить с цитированием
  #5  
Старый 06.04.2009, 00:14
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, формально, на первый взгляд все правильно.
Только вот интересный вопрос: А в свойстве Filter конструкция LIKE работает? Лично я думаю, что нет. Хотя чем черт не шутит.

На самом деле попробуй написать обработчик события OnFilterRecord у источника данных. По мне, так это более "железобетонный" вариант.

Ну и как вариант, дописывание условия в сам запрос и его переоткрытие.
Ответить с цитированием
  #6  
Старый 06.04.2009, 00:21
Vesnushka87 Vesnushka87 вне форума
Прохожий
 
Регистрация: 05.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Я не умею использовать FilterRecord. Может подскажешь на примере ??
Ответить с цитированием
  #7  
Старый 06.04.2009, 00:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну на вскидку я не помню, но там смысл такой - у этого обработчика есть var-параметр типа Boolean. Если не ошибаюсь, то для записи, которая удовлетворяет условию в этом параметре надо вернуть True (запись будет показана), иначе - False.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter