Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 158

Фильтрация данных ADOTable

13.12.2017, 07:26. Показов 6583. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как добавить ещё поля для фильтрации,кроме Фамилии,допустим Имя,Отчество.Есть только по одному полю:
Delphi
1
2
3
4
5
6
procedure TForm2.Edit1Change(Sender: TObject);
begin
ADOTable1.Filtered:=false;
ADOTable1.Filter:='Фамилия LIKE '+#39+Edit1.Text+'%'+#39;
if length(edit1.text)>0 then ADOTable1.Filtered:=true;
end
;
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.12.2017, 07:26
Ответы с готовыми решениями:

Фильтрация данных в adoTable
Нужно отфильтровать данные в adotable по 2 параметрам. выбрать пенсионеров женщин от 58 и до бесконечнасти и мужчин от 63 и до...

Фильтрация данных за указанный период в AdoTable
Помогите, пожалуйста. Имеется таблица ДОГОВОР с полями ДАТА, НОМЕР ДОГОВОРА, итд. 1. Базы данных - MS Access 2. Способа доступа - ADO...

Adotable фильтрация
Ребят не могу отфильтровать в адотейбл записи по фио Код: ADOTable10.Filter := 'fio_sotr='+sotr; ADOTable10.Filtered := True; ...

10
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,365
Записей в блоге: 3
13.12.2017, 09:10
kikaa, почему бы Вам не отказаться от прямой работы с таблицами в пользу запросов? Очеь уж конструкция громоздкая получается... И, кстати, давать имена полям на кириллице - это совсем не есть гуд...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function MakeFilter(s1, s2, s3: String): String;
begin
 result := '';
 if Length(Trim(s1)) <> 0 then result := Format('(Фамилия LIKE '#39'%s%%'#39')', [s1]);
 if Length(Trim(s2)) <> 0 then
  begin
   if Length(result) = 0 then
    result := Format('(Имя LIKE '#39'%s%%'#39')', [s2])
   else
    result := result + Format(' AND (Имя LIKE '#39'%s%%'#39')', [s2]);
  end;
 if Length(Trim(s3)) <> 0 then
  begin
   if Length(result) = 0 then
    result := Format('(Отчество LIKE '#39'%s%%'#39')', [s3])
   else
    result := result + Format(' AND (Отчество LIKE '#39'%s%%'#39')', [s3]);
  end;
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 ADOTable1.Filtered := false;
 if (Length(Trim(Edit1.Text)) = 0) and (Length(Trim(Edit2.Text)) = 0) and (Length(Trim(Edit3.Text)) = 0) then Exit;
 ADOTable1.Filter := MakeFilter(Edit1.Text, Edit2.Text, Edit3.Text);
 ADOTable1.Filtered := true;
end;
Естественно, что обработчик события Edit1Change надо назначит и для 2-х оставшихся Эдитов.

Добавлено через 18 минут
Вот так, пожалуй, покороче и более универсально будет, можно, при желании, количество полей в фильтре увеличить или уменьшить...
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function MakePart(Fld, s1, s2: String): String;
begin
 if Length(s1) = 0 
  then result := Format('(%s LIKE '#39'%s%%'#39')', [Fld, s2])
  else result := s1 + Format(' AND (%s LIKE '#39'%s%%'#39')', [Fld, s2]);
end;
 
procedure TForm1.Edit1Change(Sender: TObject);
begin
 ADOTable1.Filtered := false;
 if (Length(Trim(Edit1.Text)) = 0) and (Length(Trim(Edit2.Text)) = 0) and (Length(Trim(Edit3.Text)) = 0) then Exit;
 ADOTable1.Filter := '';
 if Length(Trim(Edit1.Text)) <> 0 then ADOTable1.Filter := MakePart('Фамилия', ADOTable1.Filter, Edit1.Text);
 if Length(Trim(Edit2.Text)) <> 0 then ADOTable1.Filter := MakePart('Имя', ADOTable1.Filter, Edit2.Text);
 if Length(Trim(Edit3.Text)) <> 0 then ADOTable1.Filter := MakePart('Oтчество', ADOTable1.Filter, Edit3.Text);
 ADOTable1.Filtered := true;
end;
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 158
13.12.2017, 09:54  [ТС]
А можно сделать чтобы все эти поля для фильтрации были в одном edit'e?
0
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,365
Записей в блоге: 3
13.12.2017, 10:22
Поясните...

Не по теме:

Что-то мне все больше и больше кажется, что Вы "хочите странного"... То принципиальный отказ от SQL, теперь все поля для фильтрации в одном Эдите (я даже слабо представляю, как это может выглядеть :scratch: ). Что дальше будет?

0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 158
13.12.2017, 12:53  [ТС]
У меня dbgrid подключен к datasource и мне нужно чтобы осуществлялась фильтрация через один edit не по одному полю,а по 3-м.Через sql это так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm3.sEdit2Change(Sender: TObject);
var help1, help2:string;
begin
help1:='%'+form3.sEdit2.Text+'%';
help2:=quotedStr(help1);
with DataModule2.ADOQuery1 do
begin
  close;
  sql.Clear;
  Sql.Add('select * from Sobaki where Klichka like'+help2+' or Nomer_Kleyma_Chipa like'+help2+' or Nomer_Rodoslovnoy like'+help2+' order by Klichka');
  open;
end;
end;
0
5961 / 4537 / 1094
Регистрация: 29.08.2013
Сообщений: 28,145
Записей в блоге: 3
13.12.2017, 13:54
Цитата Сообщение от kikaa Посмотреть сообщение
help1:='%'+form3.sEdit2.Text+'%';
help2:=quotedStr(help1);
кто вас такому то учит? уже не первый раз замечают этот код
зачем использовать лишние переменные? зачем писать Form3 в обработчике Form3?

Зачем использовать транслит в именах таблиц и полей?
Sobaki
Klichka
Nomer_Kleyma_Chipa
Nomer_Rodoslovnoy

глаза же вытекают на такое смотреть
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 158
13.12.2017, 14:06  [ТС]
Учат интернет уроки,а транслит - мне так удобней ориентироваться.Извините,я не особо шарю,что принципе понятно, раз я пишу сюда ...
0
W
 Аватар для kavasaka
115 / 115 / 33
Регистрация: 16.04.2013
Сообщений: 750
13.12.2017, 14:11
Цитата Сообщение от kikaa Посмотреть сообщение
чтобы осуществлялась фильтрация через один edit не по одному полю,а по 3-м
так же через or их и перечисли:
Delphi
1
2
3
ADOTable1.Filter := 'Фамилия LIKE '+#39+Edit1.Text+'%'+#39 + ' or ' +
                          'Имя LIKE '+#39+Edit1.Text+'%'+#39 + ' or ' +
                         'Отчество LIKE '+#39+Edit1.Text+'%'+#39;
0
 Аватар для kikaa
0 / 0 / 0
Регистрация: 24.04.2017
Сообщений: 158
14.12.2017, 04:13  [ТС]
Работает,но после удаления символов в edit выдает ошибку,вот что я пишу:
Delphi
1
2
3
4
5
6
7
8
procedure TForm3.sEdit2Change(Sender: TObject);
begin
datamodule2.Tsobaki.Filtered := false;
datamodule2.Tsobaki.Filter := 'Klichka LIKE '+#39+Edit2.Text+'%'+#39 + ' or ' +
                          'Nomer_Kleyma_Chipa LIKE '+#39+Edit2.Text+'%'+#39 + ' or ' +
                         'Nomer_Rodoslovnoy LIKE '+#39+Edit2.Text+'%'+#39;
                         datamodule2.Tsobaki.Filtered := true;
end;
Миниатюры
Фильтрация данных ADOTable  
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
14.12.2017, 05:13
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm3.sEdit2Change(Sender: TObject);
begin
if Edit2.Text = '' then exit;
datamodule2.Tsobaki.Filtered := false;
datamodule2.Tsobaki.Filter := 'Klichka LIKE '+#39+Edit2.Text+'%'+#39 + ' or ' +
                          'Nomer_Kleyma_Chipa LIKE '+#39+Edit2.Text+'%'+#39 + ' or ' +
                         'Nomer_Rodoslovnoy LIKE '+#39+Edit2.Text+'%'+#39;
                         datamodule2.Tsobaki.Filtered := true;
end;
0
Модератор
 Аватар для D1973
9910 / 6447 / 2455
Регистрация: 21.01.2014
Сообщений: 27,365
Записей в блоге: 3
14.12.2017, 05:19
Лучший ответ Сообщение было отмечено kikaa как решение

Решение

Ну, если абстрагироваться от логики, то можно этот фильтр представить вот так:
Delphi
1
2
3
4
ADOTable1.Filtered := false;
 if (Length(Trim(Edit2.Text)) = 0) then Exit;
 ADOTable1.Filter := Format('(Klichka LIKE '#39'%s%%'#39') OR (Nomer_Kleyma_Chipa LIKE '#39'%s%%'#39') OR (Nomer_Rodoslovnoy LIKE '#39'%s%%'#39')', [Edit2.Text, Edit2.Text, Edit2.Text]);
 ADOTable1.Filtered := true;
а если логику все таки подключить, то давайте посмотрим, как работает такой вот фильтр...
Сначала проверяется условие по первому полю Klichka для всех записей таблицы. Если условие не выполняется, начинается проверка второго поля, потом - третьего. Но если условие для первого поля выполняется - все, остальные поля рассматриваться не будут и в выборку не попадут... Вам этого надо? Если да - тогда в путь!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2017, 05:19
Помогаю со студенческими работами здесь

Фильтрация в ADOTable
Всем привет. У есть меня База Данных объектов с ценой, как осуществить фильтрацию &quot;От&quot; и &quot;До&quot;? т.е. в Edit1 я указываю...

Фильтрация в ADOTable
Добрый день. В программе не работает фильтрация, фильтрует все записи. procedure TForm1.BitBtn3Click(Sender: TObject); begin ...

Фильтрация в Adotable
Здравствуйте. У меня на форме много label-ов, и adotable, данные берутся из access. Я пытаюсь использовать фильтр по дате и станции,...

Фильтрация БД ADOtable
Уважаемые программисты, у меня проблемы с фильтрованием. В форме есть DBGrid и Combobox. В Combobox-е выбирая определенный месяц, в...

Фильтрация в ADOTable
Хочу сделать фильтрацию сразу по двум полям. Данные беру из access 2013. Возникает ошибка, но когда делаю по одному полю, то все...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru