Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/76: Рейтинг темы: голосов - 76, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
1

Фильтр по форме по нескольким полям

21.11.2017, 07:25. Показов 13674. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Помогите,пожалуйста, с вопросом фильтра по форме. При фильтре по одному полю все работает, при фильтре по 2 полям поставил фильтр с объединением двух фильтров. Как сделать фильтр не нескольким полям так, чтобы при нажатии на кнопку фильтр ставился только на заполненные поля со списком, а в пустых полях со списком показывал бы все значения по этому полю. Или ставился бы фильтр по мере выбора значений.

И еще один вопрос, как в одном поле выбрать больше одного значения (например по числу комнат в квартире). При фильтре можно было выбрать сразу и 2 комнатные и 3 комнатные или по типу здания кирпичные и монолитно-кирпичные.

Спасибо за помощь. В Access работаю несколько месяцев только, не судите строго)

База во вложении.
Вложения
Тип файла: zip База квартир г.Чебоксары.zip (2.79 Мб, 59 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.11.2017, 07:25
Ответы с готовыми решениями:

Фильтр по форме по нескольким логическим полям с использованием кнопки Общий фильтр
Здравствуйте! Есть простая таблица и созданная форма. Идея в том, чтобы ставя галки осуществлять...

Фильтр в форме по нескольким полям. Ошибка
Здравствуйте, форумчане. Без Вашей помощи не разобраться. Создана Форма.Поиск (фильтрация по...

Фильтр по форме по нескольким полям используя кнопку
Доброй день. Помогите,пожалуйста, с вопросом фильтра по форме. При фильтре по одному полю все...

Фильтр по форме по нескольким полям используя кнопку № 3
Привет всем снова. У меня возникла новая проблема с поиском. Я переделал таблицу Категории,...

36
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 15:12 2
Цитата Сообщение от ДинарШ Посмотреть сообщение
Помогите,пожалуйста, с вопросом фильтра по форме.
Макросами тут видимо никак.
Только кодом.
Объединяем условия фильтра через "AND"

Цитата Сообщение от ДинарШ Посмотреть сообщение
И еще один вопрос, как в одном поле выбрать больше одного значения (например по числу комнат в квартире).
Это через In() в условии и поле СПИСОК.
1
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 15:12 3
Цитата Сообщение от ДинарШ Посмотреть сообщение
Помогите,пожалуйста, с вопросом фильтра по форме.
Макросами тут видимо никак.
Только кодом.
Объединяем условия фильтра через "AND"

Цитата Сообщение от ДинарШ Посмотреть сообщение
И еще один вопрос, как в одном поле выбрать больше одного значения (например по числу комнат в квартире).
Это через In() в условии и поле СПИСОК.
1
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
21.11.2017, 15:19  [ТС] 4
А примерно хотя бы по моей базе можете написать?
0
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 15:34 5
Цитата Сообщение от ДинарШ Посмотреть сообщение
А примерно хотя бы по моей базе можете написать?
Могу - но позднее.
Сейчас занят "по самые нехочу" ...
Добрые формучане помогите пожалуйста!
1
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 17:01 6
Вот .... - только по верхним полям - дальше, надеюсь, самостоятельно разберётесь.

Код:
Visual Basic
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
Private Sub cbГод_постройки_по_Click()
    Form_Refilter
End Sub
 
Private Sub cbГод_постройки_с_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub cmdClearFilter_Click()
 
    Me!Выборулиц = Null
    Me!Выбордома = Null
    Me!cbГод_постройки_с = Null
    Me!cbГод_постройки_по = Null
    Me!Выбортипадома = Null
    Me!Выборотопления = Null
    
    Form_Refilter
    
End Sub
 
Private Sub Выбордома_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выборотопления_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выбортипадома_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выборулиц_AfterUpdate()
    Form_Refilter
End Sub
 
 
Private Sub Form_Refilter()
Dim sFilter As String
    If Me!Выборулиц.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = " AND Улица='" & Me!Выборулиц & "'"
    End If
 
    If Me!Выбордома.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND НомерДома='" & Me!Выбордома & "'"
    End If
 
'Датапостройки (года)
    If Me!cbГод_постройки_с.ListIndex <> -1 And Me!cbГод_постройки_по.ListIndex <> -1 Then
        sFilter = sFilter & "Датапостройки Between " & Me!cbГод_постройки_с & " And " & Me!cbГод_постройки_по
    Else
        If Me!cbГод_постройки_с.ListIndex <> -1 Then
            sFilter = sFilter & "Датапостройки >=" & Me!cbГод_постройки_с
        End If
        If Me!cbГод_постройки_по.ListIndex <> -1 Then
            sFilter = sFilter & "Датапостройки <=" & Me!cbГод_постройки_по
        End If
    End If
 
 
'Выбортипадома
    If Me!Выбортипадома.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND ТипДома='" & Me!Выбортипадома & "'"
    End If
 
 
'Выбортипадома
    If Me!Выборотопления.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Отопление='" & Me!Выборотопления & "'"
    End If
 
'Применяем филтер!
    If Len(sFilter) > 6 Then
        Me.Filter = Mid(sFilter, 6)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
    
    
    
End Sub
Вложения
Тип файла: zip База квартир г.Чебоксары_v02.zip (1.12 Мб, 62 просмотров)
4
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
21.11.2017, 17:17  [ТС] 7
Спасибо, попробую разобраться.

Добавлено через 3 минуты
Ругается при выборе даты постройки "run time error 3464 несоответствие типов данных в выражении условия отбора" ((
0
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 17:20 8
Цитата Сообщение от ДинарШ Посмотреть сообщение
попробую разобраться.
Как сказать "СПАСИБО!" ...
Миниатюры
Фильтр по форме по нескольким полям  
3
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 17:21 9
Цитата Сообщение от ДинарШ Посмотреть сообщение
Ругается при выборе даты постройки "run time error 3464 несоответствие типов данных в выражении условия отбора"
Шас гляну ...
1
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
21.11.2017, 17:25  [ТС] 10
Если по дате постройке сложно сделать, попробуйте пожалуйста сделать по комнате (выбор комнатности ) район ,микрорайон, планировке, тип дома, отопление)) в VBA ничего не соображаю
0
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 17:32 11
Лучший ответ Сообщение было отмечено ДинарШ как решение

Решение

Цитата Сообщение от ДинарШ Посмотреть сообщение
Ругается при выборе даты постройки "run time error 3464 несоответствие типов данных в выражении условия отбора"
Исправил.
В спешке "AND" в паре аргументов фильтра забыл поставить.
Вложения
Тип файла: zip База квартир г.Чебоксары_v03.zip (1.12 Мб, 158 просмотров)
2
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
21.11.2017, 18:34  [ТС] 12
какой код нужен для снятия фильтра только по одному полю? спасибо.

Добавлено через 17 секунд
Eugene-LS, какой код нужен для снятия фильтра только по одному полю? спасибо.
0
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 18:43 13
Лучший ответ Сообщение было отмечено ДинарШ как решение

Решение

Цитата Сообщение от ДинарШ Посмотреть сообщение
какой код нужен для снятия фильтра только по одному полю?
Обычно это делается зачисткой значения поля.
1
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
21.11.2017, 18:50  [ТС] 14
Евгений, еще раз побеспокою, по выборкомнатности числовое значение выдает ошибку. там какие собки лишние

Visual Basic
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Option Compare Database
Option Explicit
 
Private Sub cbГод_постройки_по_Click()
    Form_Refilter
End Sub
 
Private Sub cbГод_постройки_с_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub cmdClearFilter_Click()
 
    Me!Выборулиц = Null
    Me!Выбордома = Null
    Me!cbГод_постройки_с = Null
    Me!cbГод_постройки_по = Null
    Me!Выбортипадома = Null
    Me!Выборотопления = Null
    Me!Выборпланировки = Null
    Me!списокрнов = Null
    Me!списокмикр = Null
    Me!выборкомнатности = Null
    
    Form_Refilter
    
End Sub
 
Private Sub Выбордома_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выборотопления_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выбортипадома_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выборулиц_AfterUpdate()
    Form_Refilter
End Sub
 
Private Sub Выборпланировки_AfterUpdate()
    Form_Refilter
End Sub
Private Sub Списокрнов_AfterUpdate()
    Form_Refilter
End Sub
Private Sub Списокмикр_AfterUpdate()
    Form_Refilter
End Sub
Private Sub выборкомнатности_AfterUpdate()
    Form_Refilter
End Sub
Private Sub Form_Refilter()
Dim sFilter As String
    If Me!Выборулиц.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = " AND Улица='" & Me!Выборулиц & "'"
    End If
 
    If Me!Выбордома.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND НомерДома='" & Me!Выбордома & "'"
    End If
 
'Датапостройки (года)
    If Me!cbГод_постройки_с.ListIndex <> -1 And Me!cbГод_постройки_по.ListIndex <> -1 Then
        sFilter = sFilter & " AND Датапостройки Between " & Me!cbГод_постройки_с & " And " & Me!cbГод_постройки_по
    Else
        If Me!cbГод_постройки_с.ListIndex <> -1 Then
            sFilter = sFilter & " AND Датапостройки >=" & Me!cbГод_постройки_с
        End If
        If Me!cbГод_постройки_по.ListIndex <> -1 Then
            sFilter = sFilter & " AND Датапостройки <=" & Me!cbГод_постройки_по
        End If
    End If
 
 
'Выбортипадома
    If Me!Выбортипадома.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND ТипДома='" & Me!Выбортипадома & "'"
    End If
 
 
'Выбортипадома
    If Me!Выборотопления.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Отопление='" & Me!Выборотопления & "'"
    End If
 
 
'Выборпланировки
    If Me!Выборпланировки.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Планировка='" & Me!Выборпланировки & "'"
    End If
    
    
'Списокрнов
    If Me!списокрнов.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Район='" & Me!списокрнов & "'"
    End If
   ' Debug.Print sFilter
    
    
 'Списокмикр
    If Me!списокмикр.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Микрорайон='" & Me!списокмикр & "'"
    End If
    
    
 'выборкомнатности
    If Me!выборкомнатности.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Комнатность='" & Me!выборкомнатности & "'"
    End If
    
'Применяем филтер!
    If Len(sFilter) > 6 Then
        Me.Filter = Mid(sFilter, 6)
        Me.FilterOn = True
    Else
        Me.Filter = ""
        Me.FilterOn = False
    End If
    
    
    
End Sub
0
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
21.11.2017, 19:03 15
Лучший ответ Сообщение было отмечено ДинарШ как решение

Решение

Цитата Сообщение от ДинарШ Посмотреть сообщение
по выборкомнатности числовое значение выдает ошибку. там какие собки лишние
Это поле числовое - кавычки не нужны!
Внимательнее!
Visual Basic
1
2
3
4
 'выборкомнатности
    If Me!выборкомнатности.ListIndex <> -1 Then 'Значение выбрано!
        sFilter = sFilter & " AND Комнатность=" & Me!выборкомнатности
    End If
2
0 / 0 / 0
Регистрация: 19.11.2017
Сообщений: 16
22.11.2017, 08:39  [ТС] 16
Eugene-LS, Спасибо, все работает. Как еще поставить фильтр на поле с типом Дата (от и до)
0
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
22.11.2017, 09:16 17
Цитата Сообщение от ДинарШ Посмотреть сообщение
Как еще поставить фильтр на поле с типом Дата (от и до)
Примерно так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
'Фильтр по датам
    If IsDate(Me!txtDateFrom) = True And IsDate(Me!txtDateTo) = True Then 'Указаны даты начала и конца
        sFilter = sFilter & " AND Дата_Рождения Between " & _
                Format$(Me!txtDateFrom, "\#mm\/dd\/yy\#") & _
                " And " & _
                Format$(Me!txtDateTo, "\#mm\/dd\/yy\#")
    Else 'Указана только одна из дат - больше - меньше
        If IsDate(Me!txtDateFrom) = True Then 'Указана только дата начала периода
            sFilter = sFilter & " AND Дата_Рождения >=" & Format$(Me!txtDateFrom, "\#mm\/dd\/yy\#")
        End If
        If IsDate(Me!txtDateTo) = True Then   'Указана только дата окончания периода
            sFilter = sFilter & " AND Дата_Рождения <=" & Format$(Me!txtDateTo, "\#mm\/dd\/yy\#")
        End If
    End If
1
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
22.11.2017, 09:26 18
Используя Nz, можно проще применять открытые, полуоткрытые и замкнутые интервалы
Visual Basic
1
2
sFilter = "Дата_Рождения Between " & Format$(Nz(Me!txtDateFrom, 0), "\#mm\/dd\/yyyy\#") _
& " And " & Format$(Nz(Me!txtDateTo, 100000), "\#mm\/dd\/yyyy\#")
1
10472 / 5458 / 1375
Регистрация: 05.10.2016
Сообщений: 15,468
22.11.2017, 09:53 19
Цитата Сообщение от mobile Посмотреть сообщение
Используя Nz, можно проще применять открытые, полуоткрытые и замкнутые интервалы
Лихо!
Спасибо!

Но следует помнить что:
CDate(100000) = 14.10.2173 (всего через 150 лет с прицепом)
Лучше уж сразу (с запасом):
CDate(1999999) = 22.10.7375
Visual Basic
1
Format$(Nz(Me!txtDateTo, 1999999)


Добавлено через 17 минут
ДинарШ, согласно совету уважаемого mobile, - получаем более изящный вариант:
Visual Basic
1
2
3
4
5
6
7
'Фильтр по датам
    If IsDate(Me!txtDateFrom) = True Or IsDate(Me!txtDateTo) = True Then 'Указаны даты начала и конца
        sFilter = sFilter & " AND Дата_Рождения Between " & _
                Format$(Nz(Me!txtDateFrom, 0), "\#mm\/dd\/yyyy\#") & _
                " And " & _
                Format$(Nz(Me!txtDateTo, 999999), "\#mm\/dd\/yyyy\#") ' На Null = #11/25/4637#
    End If
Но помним что функция Nz() только в последних версиях:
Применяется к: Access 2016 Access 2013 Access 2010 Access 2007
1
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
22.11.2017, 10:55 20
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Но помним что функция Nz() только в последних версиях:
Применяется к: Access 2016 Access 2013 Access 2010 Access 2007
Не помню насчет Access 2000, но в 2002 точно была. Ну и разумеется в 2003.
0
22.11.2017, 10:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2017, 10:55
Помогаю со студенческими работами здесь

Фильтр данных в подчиненной форме по нескольким полям
Друзья, такой вопрос: Есть форма, в ней подчиненная в табличном виде. Хочу организовать ее фильтр...

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

Отбор по нескольким полям в форме
Добрый вечер, форумчане! Очень нуждаюсь в вашей помощи! Знаю, что вопрос, с которым я хочу...

Фильтр в форме по двум полям
Здравствуйте! Форма основана на одной таблице. Группой переключателей фильтрую записи по одному...


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

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