Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Работа с фильтром / 25 сообщений из 28, страница 1 из 2
10.01.2020, 15:03
    #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
10.01.2020, 18:12
    #39912570
Игортан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
drafty,

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

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

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

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

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

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

В хэлпе говорится следующее:
Тем не менее, если вы хотите создать строку условий, ссылающуюся на несколько полей, необходимо создать строки и объединить их самостоятельно. Например, если вы хотите создать критерии для фильтра, чтобы отображать записи для заказов, помещенных после 1-1-95 и для которых значение фрахта меньше $50, необходимо дважды использовать метод буилдкритериа и сцепить полученные строки.
но не указан синтаксис для данного случае,везде примеры приведены для применения фильтра только по одному полю.Можно пример для случая с двумя полями (чтобы понять синтаксис)?
...
Рейтинг: 0 / 0
11.01.2020, 10:42
    #39912725
ИВП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
drafty,
а = в AND c = d
...
Рейтинг: 0 / 0
11.01.2020, 11:02
    #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
11.01.2020, 11:06
    #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
11.01.2020, 13:34
    #39912760
ИВП
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
drafty,
имелось ввиду безо всяких Build....
...
Рейтинг: 0 / 0
11.01.2020, 13:37
    #39912762
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
ИВП
drafty,
имелось ввиду безо всяких Build....

Т.е. frm.filter =strCriteria AND strMoreCriteria или frm.filtet=strCriteria AND frm.filter=strMoreCriteria ?
...
Рейтинг: 0 / 0
11.01.2020, 13:41
    #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
11.01.2020, 16:53
    #39912803
DarkMan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
drafty, А почему бы Вам вместо фильтров не изменять RecordSource формы? И не нужно городить If .
...
Рейтинг: 0 / 0
11.01.2020, 17:24
    #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
11.01.2020, 18:54
    #39912836
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
DarkMan
drafty, А почему бы Вам вместо фильтров не изменять RecordSource формы? И не нужно городить If .

Дело в том,что у меня изменяется Recordsource формы по одному определенному (главному) критерию,но я хочу,чтобы ещё после изменения Recordsource формы по главному критерию,можно было бы "внутри" этого Recordsource осуществлять ещё и фильтрацию по второстепенным критериям.
Можно для этих целей конечно понавесить combobox для каждого из второстепенных критериев и определить события After_Update для каждого из них и на их основе опять же изменять Recordset формы,ну ту сами прикиньте-это сколько возможных вариантов надо будет прописать,если одно из combo содержит значение null или не содержит значение null (если например таких combo 5 штук)... Поэтому я думаю может применение фильтров поможет избежать такого "декартового" произведения возможных вариантов...🤔🤔🤔
...
Рейтинг: 0 / 0
11.01.2020, 18:56
    #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
11.01.2020, 19:48
    #39912850
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
Гляньте это:
...
Рейтинг: 0 / 0
11.01.2020, 19:58
    #39912855
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
alecko
для использования имплементс
Почему не полностью реализован интерфейс (только ITextBoxEvents_LChange есть)? У ТС возникнут проблемы...
...
Рейтинг: 0 / 0
11.01.2020, 20:04
    #39912857
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
sdku
Гляньте это:

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


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

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

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

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

Глянул. Я так подозреваю русская версия Access установлена? :)
...
Рейтинг: 0 / 0
12.01.2020, 07:11
    #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
12.01.2020, 07:12
    #39912933
drafty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с фильтром
DarkMan
drafty
содержит значение null или не содержит значение null (если например таких combo 5 штук)...

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

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


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