Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2019, 10:40   #1
BlaacK
Новичок
Джуниор
 
Регистрация: 02.06.2019
Сообщений: 1
По умолчанию Фильтрация по нескольким столбцам

Доброго времени суток!
Прошу не кидаться в меня ничем и не ругаться скверными словами, в программировании новичок, изучаю все самостоятельно.

Работаю над БД, появилась необходимость сделать фильтрацию сразу по нескольким столбцам, алгоритм вроде понятен, но не в какую не получается реализовать. Знаю, что это элементарно, но вот пока никак не удается, код предоставляю:
Код:
procedure TForm1.CheckBox1Click(Sender: TObject);
var
  Filter: string;
begin
  Filter := '';
  if Form1.CheckBox1.Checked  then
  begin
    if Filter <> '' then
      Filter := Filter + ' and ';
    Filter := Filter + '[Дата обнаружения] >= ' + QuotedStr(DateToStr(Form1.DateTimePicker1.DateTime));
  end;
 if Form1.CheckBox2.Checked then
  begin
    if Filter <> '' then
      Filter := Filter + ' and ';
    Filter := Filter + '[Дата обнаружения] <= ' + QuotedStr(DateToStr(Form1.DateTimePicker2.DateTime));
  end;          
    if Filter <> '' then
  begin
    Form1.ADOQuery1.Filtered:=False;
    Form1.ADOQuery1.Filter := Filter;
    Form1.ADOQuery1.Filtered := True;
  end
  else
    Form1.ADOQuery1.Filtered := False;
end;



procedure TForm1.Edit1Change(Sender: TObject); //Поиск по БД
var help1, help2:string;
begin
help1:='%'+Form1.Edit1.Text+'%';   //Забрасываем данные в переменную help1 из Edit1
help2:=QuotedStr(help1);           //ХЗ для чего, но без этого не работает
with Form1.ADOQuery1 do
begin
  close;      //закрываем предыдющий запрос
  SQL.Clear;  //Ощищаем
  SQL.Add('select * from freq where [Частота (МГц)] like'+help2+' or [Дата обнаружения] like'+help2+' or [Дата подтверждения] like'+help2+' or [Координаты] like'+help2+' or [Примечание] like'+help2+' or [Вид передачи] like'+help2+' order by [Частота (МГц)]');
  Open;   //Открываем новый запрос
end;

if Form1.ADOQuery1.RecordCount <>0 then Form1.StatusBar1.SimpleText := 'Записей: '+IntToStr(Form1.ADOQuery1.RecordCount) else Form1.StatusBar1.SimpleText := 'Записей нет';
end;

procedure TForm1.Edit2Change(Sender: TObject); //Фильтрация по частоте
var search, search2: string;
begin
search:='%'+Form1.Edit2.Text+'%';   //Забрасываем данные в переменную search из Edit2
search2:=QuotedStr(search);           //ХЗ для чего, но без этого не работает

with Form1.ADOQuery1 do
begin
  close;      //закрываем предыдющий запрос
  SQL.Clear;  //Ощищаем
  SQL.Add('select * from freq where [Частота (МГц)] like'+search2+'');  
  Open;   //Открываем новый запрос
end; 
end;
   

procedure TForm1.Edit3Change(Sender: TObject);  //Поиск по виду передачи
var  search3, search4: string;
begin
search3:='%'+Form1.Edit3.Text+'%';   //Забрасываем данные в переменную search из Edit2
search4:=QuotedStr(search3);           //ХЗ для чего, но без этого не работает
with Form1.ADOQuery1 do
  begin
  close;      //закрываем предыдющий запрос
  SQL.Clear;  //Ощищаем
  SQL.Add('select * from freq where [Вид передачи] like'+search4+'');  
  Open;   //Открываем новый запрос
    
  end;
end;
Алгоритм который я вижу:
1. При всех пустых строках, соответственно отображаются все данные с таблицы;
2. При вводе только в строку Частота, фильтрация происходит по столбцу "Частота";
3. При вводе только в строку Вид передачи, фильтрация происходит по столбцу "Вид передачи";
!4. При вводе в обе строки, проверяет на соответствие оба столбца;
5. Дополнительно, есть фильтрация по дате, при установке чекбокса1, должен фильтровать по дате с, при установке чекбокса2 по дате по, при установке двух чекбоксов в заданном диапазоне... собственно он почти работает, но только сначала необходимо выбрать дать, а затем нажать на чек бокс, дальнейшее изменение даты не на что не влияет и необходимо снять чекбокс и повторно установить.
Так же там есть поиск по всей базе, ищет по любым параметрам похожее слово, хотелось бы что бы и этот поиск зависит от пунктов 1,2,3,4,5.

Код уже без 4! пункта, потому что не работает, кучу вариантов перепробовал, нервы начинают сдавать(
BlaacK вне форума Ответить с цитированием
Старый 02.06.2019, 21:45   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А like для чего, неужто и частота, и дата, и прочее все символьного типа в таблице?
Неужели в запросе OR нужен? Скорее AND для одновременного выполнения всех условий. Ну это не более чем предположение )
Фильтр по дате, да еще c AND-ом в Filter может и не заработать. Лучше в OnFilterRecord, а еще лучше в запросе
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка по нескольким столбцам datagridview zakaev C# (си шарп) 0 18.10.2011 22:03
Сортировка по нескольким столбцам таблицы. S_Yevgeniy Помощь студентам 3 27.07.2011 19:03
SQL поиск по нескольким столбцам в Delphi vladtiko Помощь студентам 2 30.06.2011 22:21
Сортировка таблицы по нескольким столбцам KobolD Помощь студентам 0 21.06.2010 17:21
Суммирование по нескольким столбцам MaxxVer Microsoft Office Excel 5 08.02.2010 12:27