Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
1

Сделать так, чтобы фильтрация была двух столбиков с двух разных edit и не одновременно

04.03.2018, 12:37. Показов 831. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть фильтрация, которая фильтрует определенный столбик в таблице, но только один. Нужно сделать так что бы фильтрация была двух столбиков с двух разных edit и не одновременно.
Вот так выглядит для одной фильтрации
Delphi
1
2
public
  ed: String;
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm5.Edit1Change(Sender: TObject);
begin
  if Edit1.Text <> '' then begin
    ADOTable1.Filtered := False;
    ed := Edit1.Text;
    ADOTable1.Filtered := True
  end
  else ADOTable1.Filtered := False
end;
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm5.ADOTable1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  h: String;
  s: String;
begin
  s:= Copy(DataSet['ФИО клиента'], 1, Length(ed));
  Accept := s = ed;
end;
А вот попробовал для двух но работает как то криво, фильтрует только edit2
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
28
29
30
31
32
33
34
35
36
public
  ed: String;
  eh: String;
 
procedure TForm5.Edit1Change(Sender: TObject);
begin
  if Edit1.Text <> '' then begin
    ADOTable1.Filtered := False;
    ed := Edit1.Text;
    ADOTable1.Filtered := True
  end
  else ADOTable1.Filtered := False
end;
 
procedure TForm5.Edit2Change(Sender: TObject);
begin
  if Edit2.Text <> '' then begin
    ADOTable1.Filtered := False;
    eh := Edit2.Text;
    ADOTable1.Filtered := True
  end
  else ADOTable1.Filtered := False
end;
 
 
procedure TForm5.ADOTable1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  h: String;
  s: String;
begin
  s:= Copy(DataSet['ФИО клиента'], 1, Length(ed));
  Accept := s = ed;
  h:= Copy(DataSet['ФИО риэлтора'], 1, Length(eh));
  Accept := h = eh;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.03.2018, 12:37
Ответы с готовыми решениями:

Расставить числа так, чтобы максимальная сумма двух соседних была наименьшей
написать прогу, которая расставляет числа так, чтобы максимальная сумма двух соседних чисел была...

Предствать число суммой двух неотрицательных так, чтобы сумма цифр их десятичных представлений была максимальна
Задано натуральное число А . Необходимо предствать его в виде суммы двух неотрицательных чисел в и...

Распределить камни в две кучи так, чтобы разность весов этих двух куч была минимальной
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней...

Образовать из двух упорядоченных последовательностей новую последовательность чисел так, чтобы она тоже была неубывающей
Даны две последовательности a1&lt;=a2&lt;=...&lt;=an и b1&lt;=b2&lt;=...&lt;=bm. Образовать из них новую...

15
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 12:58 2
1. на какое событие стоит фильтр?
2. почему фильтр, почему не SQL?
0
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
04.03.2018, 13:00  [ТС] 3
qwertehok, 1. не много не понял вопроса. Фильтрация происходит так. Есть DBgrid в который выведена таблица, в котором есть поле "ФИО клиента". в edit ввожу данные, показывает все подходящие записи по столбцу "ФИО клиента"
2. Не знаю sql (задание по курсовой)
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 13:12 4
во первых оба фильтра надо переписать

Delphi
1
2
3
4
5
6
7
8
procedure TForm5.Edit2Change(Sender: TObject);
begin
  ADOTable1.Filtered := False;
  if Edit2.Text <> '' then begin
    eh := Edit2.Text;
    ADOTable1.Filtered := True
  end;
end;
во вторых в ADOTable1FilterRecord нужно использовать 1 условие
Delphi
1
2
3
s:= Copy(DataSet['ФИО клиента'], 1, Length(ed));
h:= Copy(DataSet['ФИО риэлтора'], 1, Length(eh));
  Accept := (h = eh) and  (s = ed);
в третьих лучше все таки использовать Query и SQL так как Table тянет весь набор к себе, представьте что будет если данных много
0
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
04.03.2018, 13:15  [ТС] 5
qwertehok, все равно фильтрует только по последнему столбику "ФИО риэлтора". Оба edit фильтруют только по "ФИО риэлтора"
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 13:17 6
исправленный код показывай
0
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
04.03.2018, 13:18  [ТС] 7
qwertehok,
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
28
procedure TForm5.Edit1Change(Sender: TObject);
begin
  ADOTable1.Filtered := False;
  if Edit1.Text <> '' then begin
    eh := Edit1.Text;
    ADOTable1.Filtered := True
  end;
end;
 
procedure TForm5.Edit2Change(Sender: TObject);
begin
  ADOTable1.Filtered := False;
  if Edit2.Text <> '' then begin
    eh := Edit2.Text;
    ADOTable1.Filtered := True
  end;
end;
 
procedure TForm5.ADOTable1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  h: String;
  s: String;
begin
  s:= Copy(DataSet['ФИО клиента'], 1, Length(ed));
  h:= Copy(DataSet['ФИО риэлтора'], 1, Length(eh));
  Accept := (s = ed) And (h = eh);
end;
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 13:23 8
смотри, получается когда ты вводишь данные в Edit1, то тут
Цитата Сообщение от Crystaline Посмотреть сообщение
Accept := (s = ed) And (h = eh);
не выполнится условие (данных в Edit2 нет) и фильтр не отработает

когда ты ввел данные в оба эдита, только тогда будет TRUE и фильтр отработает

и если ты удалишь текст из Edit1, то из EH то он не удалится, потому что отработает условие
Delphi
1
 if Edit1.Text <> '' then begin
и в
Delphi
1
Accept := (s = ed) And (h = eh)
у тебя все равное что то останется

ИТОГ - меняй алгоритм фильтра
или используй SQL
0
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
04.03.2018, 13:33  [ТС] 9
qwertehok, А можно как на кнопку вывести очистку фильтра?
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 13:41 10
Цитата Сообщение от Crystaline Посмотреть сообщение
А можно как на кнопку вывести очистку фильтра?
не понял
ты спрашиваешь - можно или нет? или как это сделать?

просто перепиши фильтрафию

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm5.Edit1Change(Sender: TObject);
begin
  ADOTable1.Filtered := False;
  eh := Edit1.Text;
  if Edit1.Text <> '' then ADOTable1.Filtered := True
end;
 
procedure TForm5.ADOTable1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  h: String;
  s: String;
begin
  s:= Copy(DataSet['ФИО клиента'], 1, Length(ed));
  h:= Copy(DataSet['ФИО риэлтора'], 1, Length(eh));
  if (eh = '') and (es <> '' ) then Accept := (s = ed);
  if (es = '') and (eh <> '' ) then Accept := (h = eh);
  if (es <> '') and (eh <> '' ) then Accept := (s = ed) And (h = eh);
end;
это конечно с коленки, думаю можно упростить
0
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
04.03.2018, 13:44  [ТС] 11
qwertehok, а es откуда? Тоже прописать его в publick?
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 13:46 12
да нет, это твоя вторая переменная - я ошибся
0
0 / 0 / 0
Регистрация: 10.02.2018
Сообщений: 43
04.03.2018, 14:09  [ТС] 13
qwertehok, Все заработало. Спасибо

Добавлено через 14 минут
qwertehok, а если для 3 фильтраций все тоже самое только + edit и переменная eg. Вот только так оно не фильтрует
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm6.ADOTable1FilterRecord(DataSet: TDataSet;
  var Accept: Boolean);
var
  h: String;
  s: String;
  g: String;
begin
  s:= Copy(DataSet['ФИО клиента'], 1, Length(ed));
  h:= Copy(DataSet['ФИО риэлтора'], 1, Length(eh));
  g:= Copy(DataSet['Тип аренды'], 1, Length(eh));
  if (eh = '') and (ed <> '' ) and (eg <> '' ) then Accept := (s = ed);
  if (ed = '') and (eh <> '' ) and (eg <> '' ) then Accept := (h = eh);
  if (eg = '') and (ed <> '' ) and (eh <> '' ) then Accept := (g = eg);
  if (ed <> '') and (eh <> '' ) then Accept := (s = ed) And (h = eh) and (g = eg);
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
04.03.2018, 14:27 14
Цитата Сообщение от Crystaline Посмотреть сообщение
а если для 3 фильтраций все тоже самое только + edit и переменная eg.
нет нет и еще раз нет

Цитата Сообщение от Crystaline Посмотреть сообщение
Вот только так оно не фильтрует
потому что ты не думаешь

используй SQL
0
0 / 0 / 0
Регистрация: 11.12.2017
Сообщений: 8
18.03.2018, 18:10 15
qwertehok, Вы не могли бы мне помочь, я создаю приложениедля использования БД в Delphi и возникли некоторые вопросы)
0
5487 / 4402 / 1076
Регистрация: 29.08.2013
Сообщений: 27,585
Записей в блоге: 3
18.03.2018, 21:28 16
Задавайте вопросы
0
18.03.2018, 21:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2018, 21:28
Помогаю со студенческими работами здесь

Распределить камни в две кучи так, чтобы разность весов этих двух куч была минимальной
Ограничение времени: 1.0 секунды Ограничение памяти: 64 МБ У вас есть несколько камней...

Определить, можно ли в первых двух числах переставить цифры так, чтобы сумма конечных чисел была равна с
Даны 3 числа: a, b, c. Определить, можно ли в первых двух числах переставить цифры так, чтобы сумма...

Сделать так, что бы на двух мониторах одновременно визуализировался сценарий определённого приложения
Дорогие друзья, столкнулся с очень нетривиальным вопросом, на который надеюсь найти здесь ответ!...

Нужно сделать так чтоб с одной программы работать одновременно с двух компьютеров
всем привет помогите! мне нужно сделать так чтоб с одной программы работать одновременно с двух...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru