powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Работа с фильтром
25 сообщений из 28, страница 1 из 2
Работа с фильтром
    #39912448
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На ленточной форме1 имеются 2 выключателя,выкл1 и выкл2 (над каждым из полей1 и 2)
При нажатии на выкл1 происходит фильтрация записей по полю1 (критерий-содержимое поля)
Код для фильтрации следующий:
.......
.......
str1 = Me.полеформы1
If (Me.vklFiltrerTipVS = 0) Then
Me.FilterOn = False
Else
Me.Filter = "полетаблицы1='" & str1 & "'"
Me.FilterOn = True
End If
.......
.......
При нажатии на выкл2 происходит фильтрация записей по полю2,
код фильтрации аналогичен указанному выше (только вместо 1 "стоит" 2).
Короче если я нажимаю ТОЛЬКО на выкл1 или выкл2,тогда происходит фильтрация
так как требуется,а когда я нажимаю ПООЧЕРЕДНО на выкл1 а потом на выкл2 -
фильтрация по полю1 "снимается",и в форму попадают записи независимо
от положения выкл1.Т.е. фильтрация осуществляется ИЗ ТОГО, ЧТО ЕСТЬ ВООБЩЕ
Как сделать так,чтобы при нажатии выкл2 происходил отбор записей из ТОГО,
ЧТО ОСТАЛОСЬ (т.е. из того что осталось после нажатия выкл1),соответственно
чтобы и при отжатии выкл2 снимался фильтр по полю2 и в поле зрения попадали
записи соответствующие критерию выкл1 (т.е. фильтра по полю1) ?
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912570
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty,

В цикле собирать строку фильтра
forEach, For, Do..While
перебрали свои поля по имени, проверили значения и
MyFilter = MyFilter & " AND ИмяСтолбца = " & str1
в конце применили собранную строку для фильтра

если фильтров действительно только 2, то проще прописать их руками.
If...ElseIf...Else...EndIf вы уже знаете...
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912587
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912616
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игортан
drafty,

В цикле собирать строку фильтра
forEach, For, Do..While
перебрали свои поля по имени, проверили значения и
MyFilter = MyFilter & " AND ИмяСтолбца = " & str1
в конце применили собранную строку для фильтра

если фильтров действительно только 2, то проще прописать их руками.
If...ElseIf...Else...EndIf вы уже знаете...

Принцип действия первого абзаца размыто, но примерно понятен.А второй-совсем непонятно...Вопрос тогда другой-можно ли применять фильтр в фильтре(т.е. без метода переборов полей)
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912619
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Да,это похоже на то,что надо в моем случае...Thnk! ✋
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912717
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

В хэлпе говорится следующее:
Тем не менее, если вы хотите создать строку условий, ссылающуюся на несколько полей, необходимо создать строки и объединить их самостоятельно. Например, если вы хотите создать критерии для фильтра, чтобы отображать записи для заказов, помещенных после 1-1-95 и для которых значение фрахта меньше $50, необходимо дважды использовать метод буилдкритериа и сцепить полученные строки.
но не указан синтаксис для данного случае,везде примеры приведены для применения фильтра только по одному полю.Можно пример для случая с двумя полями (чтобы понять синтаксис)?
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912725
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty,
а = в AND c = d
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912729
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
drafty,
а = в AND c = d

strCriteria = BuildCriteria("OrderDate", dbDate, ">1-1-95")
strMoreCriteria=BuildCriteria("Name", dbText, "Олег")
strFullCriteria=strCriteria AND strMoreCriteria
frm.filter=strFullCriteria 'Так?
Или:
frm.filter=BuildCriteria("OrderDate", dbDate, ">1-1-95") AND BuildCriteria("Name", dbText, "Олег") 'Или так?
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912731
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
ИВП
drafty,
а = в AND c = d

strCriteria = BuildCriteria("OrderDate", dbDate, ">1-1-95")
strMoreCriteria=BuildCriteria("Name", dbText, "Олег")
strFullCriteria=strCriteria AND strMoreCriteria
frm.filter=strFullCriteria 'Так?
Или:
frm.filter=BuildCriteria("OrderDate", dbDate, ">1-1-95") AND BuildCriteria("Name", dbText, "Олег") 'Или так?

Похоже на то,что правильнее будет:
frm.filter=BuildCriteria("OrderDate", dbDate, ">1-1-95") AND BuildCriteria("Name", dbText, "Олег")
(Иначе в первом случае компилятор ругнется...
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912760
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty,
имелось ввиду безо всяких Build....
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912762
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
drafty,
имелось ввиду безо всяких Build....

Т.е. frm.filter =strCriteria AND strMoreCriteria или frm.filtet=strCriteria AND frm.filter=strMoreCriteria ?
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912764
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда попутно такой вопрос-Как-бы написать универсальный запрос,чтобы по применению фильтра по любому из полей (каждое поле имеет свой фильтр) запрос работал корректно и в случае когда значение поля1 например содержит какое либо значение,и в случае,когда значение поля1 пустое.Это нужно,чтобы не загромождать код ветвления и типа IF-ELSE...
T.e. допустим по полю2 на форме применяется фильтр.Результирующая строка в SQL выглядит примерно так Where поле2таблицы like 'поле2'
Как сделать так,чтобы при применении фильтра по полю2 срабатывала и фильтрация по полю1 ?
Т.е. если написать так:
Where поле2таблицы like 'поле2' AND поле1таблицы like 'поле1' то в этом случае, фильтрация будет корректна,НО...если поле1 формы будет пустое - выскочит ошибка.Может есть какой спецзнак,или функция которую можно вставить в часть LIKE,чтобы в любом случае (при пустом поле1 и не пустом поле1) запрос срабатывал корректно.Сразу оговорюсь,функция NZ не пойдет,т.к. если поле1 пустое,то результатом применения этой функции будет ="",а это не одно и тоже что Null (для текстовой строки)
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912803
DarkMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty, А почему бы Вам вместо фильтров не изменять RecordSource формы? И не нужно городить If .
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912812
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty, может что-то понравится.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Option Compare Database
Option Explicit
Implements ITextBoxEvents

Public filtrmk$, filtrsother$ ' хз почему паблик - выдернул из рабочей формы

Private Sub ITextBoxEvents_LChange(sender As Textbox)
'...
filtrsother = "" & sender.Tag & " Like ""*" & sr & "*"""' поиск обычный текстовый, одинаковый по всем полям, иначе здесь нужно разделять по датам, тексту, числам и пр.
If filtrmk = "" Then Me.Filter = filtrsother Else Me.Filter = filtrsother & " AND " & filtrmk
Me.FilterOn = True
Command26.Visible = True' кнопка очистки фильтра
End Sub

Private Sub Command26_Click()' это действие кнопки очистки фильтров
Dim i&
For i = 1 To 2
Me.Controls("fldP" & i).Value = Null' это поисковые поля так называются
Next i
filtrsother = vbNullString: filtrmk = vbNullString
Me.Filter = ""
Me.FilterOn = False
Command26.Visible =false
End Sub


' для использования имплементс понадобятся ещё 2 модуля (ниже)-и там - 3 события
Код: vbnet
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.
' модуль clstextbox
Option Compare Database
Option Explicit
Private TextBoxEvents As ITextBoxEvents
Private WithEvents tbx As Textbox

Private Sub Class_Terminate()
    Set tbx = Nothing
End Sub
Public Sub Initialize(tb As Textbox)
    Set tbx = tb
    With tbx
     .OnGotFocus = DoProg
      .OnChange = DoProg
      .OnDblClick = DoProg
    End With
End Sub

Property Set ustsvz(tmp As Object)
Set TextBoxEvents = tmp
End Property
Public Property Get instance() As clsTextBox
    Set instance = Me
End Property
Private Sub tbx_change()
    TextBoxEvents.LChange tbx
End Sub

Private Sub tbx_DblClick(Cancel As Integer)
TextBoxEvents.LDblClick tbx, Cancel
End Sub
Private Sub tbx_GotFocus()
    TextBoxEvents.Lgotfocus tbx
End Sub
Property Let txtboxtag(tmp$)
tbx.Tag = tmp
End Property

' модуль TextBoxEvents
Option Compare Database
Option Explicit
Public Sub Lgotfocus(sender As Textbox)

End Sub
Public Sub LChange(sender As Textbox)

End Sub

Public Sub LDblClick(sender As Textbox, Cancel As Integer)

End Sub

...
Рейтинг: 0 / 0
Работа с фильтром
    #39912836
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMan
drafty, А почему бы Вам вместо фильтров не изменять RecordSource формы? И не нужно городить If .

Дело в том,что у меня изменяется Recordsource формы по одному определенному (главному) критерию,но я хочу,чтобы ещё после изменения Recordsource формы по главному критерию,можно было бы "внутри" этого Recordsource осуществлять ещё и фильтрацию по второстепенным критериям.
Можно для этих целей конечно понавесить combobox для каждого из второстепенных критериев и определить события After_Update для каждого из них и на их основе опять же изменять Recordset формы,ну ту сами прикиньте-это сколько возможных вариантов надо будет прописать,если одно из combo содержит значение null или не содержит значение null (если например таких combo 5 штук)... Поэтому я думаю может применение фильтров поможет избежать такого "декартового" произведения возможных вариантов...🤔🤔🤔
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912837
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko
drafty, может что-то понравится.
Код: vbnet
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.
Option Compare Database
Option Explicit
Implements ITextBoxEvents

Public filtrmk$, filtrsother$ ' хз почему паблик - выдернул из рабочей формы

Private Sub ITextBoxEvents_LChange(sender As Textbox)
'...
filtrsother = "" & sender.Tag & " Like ""*" & sr & "*"""' поиск обычный текстовый, одинаковый по всем полям, иначе здесь нужно разделять по датам, тексту, числам и пр.
If filtrmk = "" Then Me.Filter = filtrsother Else Me.Filter = filtrsother & " AND " & filtrmk
Me.FilterOn = True
Command26.Visible = True' кнопка очистки фильтра
End Sub


Private Sub Command26_Click()' это действие кнопки очистки фильтров
Dim i&
For i = 1 To 2
Me.Controls("fldP" & i).Value = Null' это поисковые поля так называются
Next i
filtrsother = vbNullString: filtrmk = vbNullString
Me.Filter = ""
Me.FilterOn = False
Command26.Visible =false
End Sub


' для использования имплементс понадобятся ещё 2 модуля (ниже)-и там - 3 события
Код: vbnet
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.
' модуль clstextbox
Option Compare Database
Option Explicit
Private TextBoxEvents As ITextBoxEvents
Private WithEvents tbx As Textbox

Private Sub Class_Terminate()
    Set tbx = Nothing
End Sub
Public Sub Initialize(tb As Textbox)
    Set tbx = tb
    With tbx
     .OnGotFocus = DoProg
      .OnChange = DoProg
      .OnDblClick = DoProg
    End With
End Sub

Property Set ustsvz(tmp As Object)
Set TextBoxEvents = tmp
End Property
Public Property Get instance() As clsTextBox
    Set instance = Me
End Property
Private Sub tbx_change()
    TextBoxEvents.LChange tbx
End Sub

Private Sub tbx_DblClick(Cancel As Integer)
TextBoxEvents.LDblClick tbx, Cancel
End Sub
Private Sub tbx_GotFocus()
    TextBoxEvents.Lgotfocus tbx
End Sub
Property Let txtboxtag(tmp$)
tbx.Tag = tmp
End Property

' модуль TextBoxEvents
Option Compare Database
Option Explicit
Public Sub Lgotfocus(sender As Textbox)

End Sub
Public Sub LChange(sender As Textbox)

End Sub

Public Sub LDblClick(sender As Textbox, Cancel As Integer)

End Sub


Попытаюсь извлечь из этого полезное
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912850
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гляньте это:
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912855
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alecko
для использования имплементс
Почему не полностью реализован интерфейс (только ITextBoxEvents_LChange есть)? У ТС возникнут проблемы...
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912857
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
Гляньте это:

Спасибо,в понедел на работе проанализирую
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912863
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург
alecko
для использования имплементс
Почему не полностью реализован интерфейс (только ITextBoxEvents_LChange есть)? У ТС возникнут проблемы...

то что под спойлером - справочно, подробнее тс и другие могут узнать поиском по форуму, используя ключевые слова.
просто плюхнуть
Код: vbnet
1.
2.
3.
filtrsother = "" & sender.Tag & " Like ""*" & sr & "*"""' поиск обычный текстовый, одинаковый по всем полям, иначе здесь нужно разделять по датам, тексту, числам и пр.
If filtrmk = "" Then Me.Filter = filtrsother Else Me.Filter = filtrsother & " AND " & filtrmk
Me.FilterOn = True


как то рука не поднялась.
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912899
ИВП
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
функция NZ не пойдет,т.к. если поле1 пустое,то результатом применения этой функции будет ="",а это не одно и тоже что Null (для текстовой строки)
В NZ можно задать любой результат.


А можно так
Код: vbnet
1.
2.
филтр = "....."
филтр = филтр & iif (поле1 is not null, " and a = поле1", "")...

и так для каждого поля
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912908
DarkMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drafty
содержит значение null или не содержит значение null (если например таких combo 5 штук)...

Вот , лет 100 назад выкладывал пример в форум. :)
На черыре комбобокса. Скачайте пример . Дату начала установите 010101 например
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912910
DarkMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku
Гляньте это:

https://www.sql.ru/forum/actualfile.aspx?id=22057256] Приложенный файл (формированиеСтрокиWhere.rar - 52Kb)

Глянул. Я так подозреваю русская версия Access установлена? :)
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912932
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИВП
drafty
функция NZ не пойдет,т.к. если поле1 пустое,то результатом применения этой функции будет ="",а это не одно и тоже что Null (для текстовой строки)
В NZ можно задать любой результат.


А можно так
Код: vbnet
1.
2.
филтр = "....."
филтр = филтр & iif (поле1 is not null, " and a = поле1", "")...

и так для каждого поля

Тогда правильнее будет так:
филтр = филтр & iif (поле1 is not null, " and a = поле1", " Isnull(поле1)")...
...
Рейтинг: 0 / 0
Работа с фильтром
    #39912933
Фотография drafty
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMan
drafty
содержит значение null или не содержит значение null (если например таких combo 5 штук)...

Вот , лет 100 назад выкладывал пример в форум. :)
На черыре комбобокса. Скачайте пример . Дату начала установите 010101 например

Спасибо,гляну!
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Работа с фильтром
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]