Фильтр в запросе

superpsih
Дата: 23.12.2015 10:15:24
Есть форма с текстовым полем. Называем его фильтр. Вбиваем туда какой-то текст. Жмём кнопку, открывается форма в которой есть поле со списком. Как сделать запрос, который брал бы данные из текстового поля первой формы и фильтровал по ним это поле со списком таким образом, чтобы отображались только те записи, которые содержат текст из первой формы (поле со списком содержит большой список данных, если в поле "фильтр" вбить текст, то во второй форме должны в поле со списком отображаться только те значения, которые содержат строку из "фильтра").
Rivkin Dmitry
Дата: 23.12.2015 10:48:19
Шаг 1:
Открывешь первую форму нормально. Забиваешь текст в поле.
Шаг 2:
Вторую форму открывешь в дизайне. В поле со спимском открывешь мастер посторителя запросов. Строишь запрос. Становишься в поле фильтра (where) и вызываешь визард (правой мышью). Находишь первую открытую форму и соотвтетствующее поле. Выбираешь его. Запускаешь запрос и проверяешь, что он работает корректно. Закрываешь мастера. Изучаешь текст запроса и в следующий раз уже пишешь все самосотоятельно без мастеров. Сохраняешь вторую форму.
Шаг 3:
Первую форму открываешь в дизайне и на событии AfterUpdate поля фильбра пишешь процедуру (или макро, как сейчас модно (ненавижу!)) requery на вторую форму.
Швг 4 последний:
Вновь открывешь аервую форму. Открываешь фторую форму. В первой вводишь значение фильтра. Ентер. Проверяешь, что получилось во второй.
усе

ЗЫ
Это, конечно, не единственное решение. Дело вкуса. Можно фильтровать, например, рекордсет второй формы прямо из первой.
Можно из первой формировать запрос для второй. Еще эффектнее, посадить соурс поля со списком на сохраненную процедуру с параметром фильтровки. И параметр этот посылать из первой формы...
superpsih
Дата: 23.12.2015 11:24:15
Спасибо, буду пробовать!
Анатолий ( Киев )
Дата: 23.12.2015 11:34:13
Допустим Форма2 лежит на таблице2 (Т2), в которой поле со списком связано с "Поле2", а поле со списком берет данные из таблицы1 (Т1), имеющей поле с текстом "Поле1" и ключевое поле "ID", значение которого и хранится в "Поле2".
Тогда при вызове Формы2 нужно указать фильтр:
"[Поле2] In (SELECT ID FROM Т1 WHERE [Поле1] = '" & Me![Фильтр] & "'"


Если в поле "Фильтр" предполагается указывать только часть значения, то вместо "=" укажите Like и примените символы шаблона.
__Michelle
Дата: 23.12.2015 11:45:03
Возник вопрос. Чисто теоретический.
А если источник данных поля со списком не запрос, а список значений,
к нему подобный "фильтр" можно ли как-то применить?
Rivkin Dmitry
Дата: 23.12.2015 11:57:41
__Michelle
Возник вопрос. Чисто теоретический.
А если источник данных поля со списком не запрос, а список значений,
к нему подобный "фильтр" можно ли как-то применить?

Карты в руки! Пробуй, докладай!
superpsih
Дата: 23.12.2015 14:01:02
Сделал через запрос с критерием отбора со следующим кодом:
Like "*" & [forms]![Form1].[Field1] & "*"

Заработало. Как бы теперь ещё сделать, чтобы выбранные позиции исчезали из выпадающего списка?
__Michelle
Дата: 24.12.2015 12:10:51
Rivkin Dmitry
__Michelle
Возник вопрос. Чисто теоретический.
А если источник данных поля со списком не запрос, а список значений,
к нему подобный "фильтр" можно ли как-то применить?

Карты в руки! Пробуй, докладай!
Ну что ж, раз инициатива, как всегда, наказуема....)))

Если в списке один столбец.
Вариант 1. С функцией Filter.
Lst.RowSource = Join(Filter(Split(<исходный RowSource>, ";"), <искомый фрагмент>, True, vbTextCompare))
Вариант 2. Без функции Filter.
 Dim m, s As String, i As Integer
 m = Split(<исходный RowSource>, ";")
 For i = 0 To UBound(m)
  s = s & IIf(m(i) Like "*" & <искомый фрагмент> & "*", m(i) & ";", "")
 Next
 Lst.RowSource = s

Если в списке больше одного столбца.
Вариант 3.
 Dim k As Byte, ks As Byte
 Dim m, s As String, i As Integer, j As Byte, n As Integer
 k = <количество столбцов>
 ks = <нужный столбец>
 m = Split(<исходный RowSource>, ";")
 n = -1
 For i = ks - 1 To UBound(m) Step k
  n = n + 1
  If m(i) Like "*" & <искомый фрагмент> & "*" Then
   For j = n * k To n * k + (k - 1)
    s = s & m(j) & ";"
   Next
  End If
 Next
 Lst.RowSource = s