powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Фильтрация данных в подчиненной форме (AfterUpdate и Change)
25 сообщений из 26, страница 1 из 2
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292385
dmitriy_po
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Прошу помощи. Необходимо сделать фильтрацию в подчиненной табличной форме. Причем там, чтобы фильтр применялся по мере ввода данных. Для этого использую событие поля Change. Но что-то не складывается. Может сработать 1 раз, потом не работать, а потом сработать при деактивации и повторной активации поля и ввода в него данных. Изначально использовал свойства подчиненной формы Filter и FilterOn - не получилось. Потом решил попробовать со свойством RecordSource - та же история. Код прилагаю ниже.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
' Не работает, как ожидается, при вводе символов
   Private Sub FindCity_Change()
    Dim query As String
    Dim flt As String
    Dim rs As String
    
    query = "SELECT * FROM Grid"
    flt = "WHERE City like '" & FindCity & "'"
    rs = query & " " & flt
    
        With Grid.Form
            .RecordSource = rs
            .Requery
        End With
End Sub



Что примечательно. С событием поля AfterUpdate работает отлично. То есть, код, вроде как, верный.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub FindCity_AfterUpdate()
' Прекрасно работает после написания критерия
    Dim query As String
    Dim flt As String
    Dim rs As String
    
    query = "SELECT * FROM Grid"
    flt = "WHERE City like '" & FindCity & "'"
    rs = query & " " & flt
    
        With Grid.Form
            .RecordSource = rs
            .Requery
        End With
End Sub



Но задача стоит о применении фильтра именно в процессе ввода данных. Буду очень благодарен за помощь.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292394
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_po,
Код: vbnet
1.
2.
3.
4.
5.
...
    query = "SELECT * FROM Grid"
    flt = " WHERE City like '" & Me.FindCity.Text & "*'"
    rs = query & " " & flt
...
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292402
dmitriy_po
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панургdmitriy_po,
Код: vbnet
1.
2.
3.
4.
5.
...
    query = "SELECT * FROM Grid"
    flt = " WHERE City like '" & Me.FindCity.Text & "*'"
    rs = query & " " & flt
...


СПАСИБО!!!
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292410
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Requery не нужен после замены RecordSource, форма обновляется автоматически.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292461
dmitriy_po
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Новый затык.
По одному полю фильтрует без проблем, но...
Как быть, если в наличие 2 и более полей (критериев) фильтрации?
При обращении к свойству Text неактивного элемента возникает ошибка 2185 ("Невозможно обратится... пока на этот элемент не установлен фокус ввода").
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292480
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_poПри обращении к свойству Text неактивного элемента возникает ошибкаепстепственно. Ты хотя бы справочку почитай. У текстбокса/комбобокса есть свойства Value и Text . Значение свойства Text можно получить когда на контрол установлен фокус.

dmitriy_poКак быть, если в наличие 2 и более полей (критериев) фильтрации?У одного контрола спрашиваешь его Value , а у Me. ActiveControl получаешь Text .
Ну и разберись какой какой.
Проще написать на каждый контрол свою процедуру на событие изменение.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292489
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_po, что столько-то букав?

Код: vbnet
1.
2.
3.
Private Sub FindCity_Change()
Me.RecordSource = "SELECT * FROM Grid WHERE City like '" & Me.FindCity.Text & "*';"
End Sub
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292514
aleks2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панургdmitriy_po, что столько-то букав?

Код: vbnet
1.
2.
3.
Private Sub FindCity_Change()
Me.RecordSource = "SELECT * FROM Grid WHERE City like '" & Me.FindCity.Text & "*';"
End Sub



Осподе, милосердный?

1. Для подчиненной формы пишешь процедуру с параметрами.
2. На главной размещает любые элементы для ввода.
3. Главное! Имена параметров и имена "элементов для ввода" должны совпадать. (в именах параметров процедуры @ не считается).
4. Фсе. Можно вводить.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292520
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо на каждый контрол свою процедуру писать.
В событии Change каждого из полей, от которых зависит поиск просто вызываем процедуру формирования Recordsource, а там уже читаем все эти поля и если не пустое, добаляем соответствующее условие отбора в SQL.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292524
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks2Осподе, милосердный?
MrShinНе надо на каждый контрол свою процедуру писать.И на 1, 2, 3 контрола городить огород? Имхо 3 строки не стоят того.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292573
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панурггородить огород
Одна(!) простая функция - огород? Вызовы этой функции можно прописать непосредственно в свойстве OnChange, никаких допольнительных процедур для эвентов. А вот копи-паст несколько кусков кода дадут о себе знать при дальнейших изменениях, которые нужно будет делать сразу в нескольких местах
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292574
dmitriy_po
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks21. Для подчиненной формы пишешь процедуру с параметрами.
.

Я так уже делал изначально. В результате, при загрузке подчиненная форма запрашивает параметры у меня, а не берет их из главной формы. Это вариант действует, когда есть одна форма (ленточная), а поля для фильтров помещены в область заголовка формы.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292576
dmitriy_po
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Панургaleks2Осподе, милосердный?
MrShinНе надо на каждый контрол свою процедуру писать.И на 1, 2, 3 контрола городить огород? Имхо 3 строки не стоят того.

Таких элементов всего 9)
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292619
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также рекомендую учесть баг Акцеса и не пытаться строить субформу с использованием прямых обращений к коноролам главной формы - субформа перестает читать изменившиеся поля на главной форме после первого же наложения фильтра. Это есть во многих версиях, по крайней мере для форм в табличном виде. Я описывал этот баг в прикрепленной теме по багам.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292623
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dmitriy_poпри загрузке подчиненная форма запрашивает параметры у меня, а не берет их из главной формы
Там нужно не просто абы какие параметры, а в том виде, который выдает построитель выражений в конструкторе запросов, типа Forms![frmMainForm]![txtTextBoxControl] и писать их непосредственно в запрос. Вот как раз на таких обращениях баг и вылезает.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292681
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinПанурггородить огород
Одна(!) простая функция - огород? Вызовы этой функции можно прописать непосредственно в свойстве OnChange, никаких допольнительных процедур для эвентов. А вот копи-паст несколько кусков кода дадут о себе знать при дальнейших изменениях, которые нужно будет делать сразу в нескольких местах Бла-бла... Нарисуй. Интересно посмотреть простую функцию.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292710
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например для 3-х полей

Код: vbnet
1.
2.
3.
4.
5.
6.
Private Function SetRecordSource()
Me.RecordSource = "SELECT * FROM Grid WHERE true " & _
            IIf(Nz(Me.FindField1, "") = "", "", " and Field1 like '" & Me.FindField1 & "*'") & _
            IIf(Nz(Me.FindField2, "") = "", "", " and Field2 like '" & Me.FindField2 & "*'") & _
            IIf(Nz(Me.FindField3, "") = "", "", " and Field3 like '" & Me.FindField3 & "*'")
End Function



В свойствах On Change для текстбоксов FindField1 - FindField3 прописать
Код: vbnet
1.
=SetRecordSource()

вместо "[Event Procedure]"
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292713
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin, хм, мне каатся, что это на событие изменеии работать корректно не будет, т.к Value и Text несколько отличаются.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292736
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function FuncSetFilter()
 Dim C As Control, _
     S As Variant, _
     i As Byte
 Dim SFilter As String
 SFilter = "True"
 For i = 1 To 9
  Set C = Me(Choose(i, "...", "...", "...", .....))
  If C.Name = Me.ActiveControl.Name Then
   S = C.Text
  Else
   S = C.Value
  End If
  If Not IsNull(S) Then
'   <включение значения в фильтр>
  End If
 Next
' <применение сформированного фильтра>
End Function
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292762
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ты прав, чуть сложнее получается, т.к. iif уже не подойдет

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Function SetRecordSource()
Dim strSQL As String
strSQL = "SELECT * FROM Table1 WHERE Field1 like '"
If Me.ActiveControl.Name = "Text1" Then
    strSQL = strSQL & Nz(Me.Text1.Text, "") & "*' and Field2 like '"
Else
    strSQL = strSQL & Nz(Me.Text1, "") & "*' and Field2 like '"
End If
If Me.ActiveControl.Name = "Text2" Then
    strSQL = strSQL & Nz(Me.Text2.Text, "") & "*' and Field3 like '"
Else
    strSQL = strSQL & Nz(Me.Text2, "") & "*' and Field3 like '"
End If
If Me.ActiveControl.Name = "Text3" Then
    strSQL = strSQL & Nz(Me.Text3.Text, "") & "*'"
Else
    strSQL = strSQL & Nz(Me.Text3, "") & "*'"
End If
Me.frmSubForm.Form.RecordSource = strSQL
End Function



Можно сократить копи-паст через цикл
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292770
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin,
dmitriy_po...Таких элементов всего 9)...
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292777
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Michelle,
Конечно для 9 и даже для 3-х копи-пастить не стал бы, это был всего лишь демонстрационный пример. И я бы сделал не через for i... по массиву, а через For each по контролам с использованием тэгов в контролах, которые определяют поиск. Впрочем, вариантов много.
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292782
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShin__Michelle,
Конечно для 9 и даже для 3-х копи-пастить не стал бы, это был всего лишь демонстрационный пример. И я бы сделал не через for i... по массиву, а через For each по контролам с использованием тэгов в контролах, которые определяют поиск. Впрочем, вариантов много. Я предложил наиболее простой вариант, доступный. А усложнять и через одну функцию сделать, это и мы умеем...
Так чта...
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292785
Фотография __Michelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне вообще-то проще, когда одна функция...
...
Рейтинг: 0 / 0
Фильтрация данных в подчиненной форме (AfterUpdate и Change)
    #39292796
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__MichelleМне вообще-то проще, когда одна функция...Проще, когда много контролов нужно обслужить, а 2-3 - только код раздувать, да усложнять. Я вообще не вижу надобности в динамической фильтрации на таком количестве условий, это хорошо когда данных немного.
А так-то можно и на классах запузырить...
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Фильтрация данных в подчиненной форме (AfterUpdate и Change)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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