Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246

Фильтр свободной подформы по текстовому полю с частичным совпадением

19.04.2015, 19:17. Показов 2906. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане!

Есть у меня форма с несколькими свободными подформами.
Нужно сделать фильтр подформы по текстовому полю с возможностью частичного совпадения (типа с использованием *).
Раньше делал через свободный комбобокс на основной форме, привязанный к нужной таблице и полю, а ссылку на этот комбобокс указывал в подформе как основное поле.
Но теперь основное поле в подформе уже используется, и кроме того, вариант с комбобоксом не работает с частичным совпадением.

Понимаю что вопрос глупый, но покурил немного форум и ответа именно на частичное совпадение не нашел.

В ВБА не разбираюсь.

Буду благодарено за помощь.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.04.2015, 19:17
Ответы с готовыми решениями:

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

Выборка по текстовому полю
Добрый день, подскажите как осуществить выборку по текстовому полю, тип "з-з 125/14", "з-з 123456", "з-з...

Запросы по текстовому полю
Пытаюсь создать запрос по маске "*", который бы находил все записи БД. То есть в искомом текстовом поле находил не только заполненные,...

9
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.04.2015, 19:28
Можно сделать фильтрацию по каждому введенному символу. Используется событие изменение (Change) текстового поля. Или по кнопке, тогда по всему готовому фильтру.
Вариант на событии Изменение (Change) с использованием свойства Text поля формы
Visual Basic
1
2
3
4
5
Private Sub Change()
  Dim s
  s="select * from Таблица where [ФильтруемоеПоле] Like "'*" & Me.ТекстовоеПолеФормы.Text & "*'" 
  Me.КонтролКонтейнерПодформы.Form.RecordSource=s
End Sub
Вариант на кнопке. Свойство Text не используется. Оно уже недоступно
Visual Basic
1
2
3
4
5
Private Sub Кнопка_Click()
  Dim s
  s="select * from Таблица where [ФильтруемоеПоле] Like "'*" & Me.ТекстовоеПолеФормы & "*'" 
  Me.КонтролКонтейнерПодформы.Form.RecordSource=s
End Sub
0
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
19.04.2015, 22:03  [ТС]
пробую первый вариант, где по событию изменения, но очевидно что-то не так сделал. Понимаю что нужно нажать вверху иконку Программа и ввести код, только вот что нужно выбрать перед нажатием кнопки Программа (поле фильтра, подформу, главную форму или поле которое фильтруется)?
И еще - фильтровать нужно результаты запроса, на основе которого сделан комбобокс (типа чтоб при нажатие на стрелочку комбобокса выбрасывались не все результаты запроса, который есть источником данных комбобокса, а только те, которые отвечают условиям фильтра).

Добавлено через 26 минут
и еще - что такое КонтролКонтейнерПодформы?
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.04.2015, 22:17
Цитата Сообщение от AMufu Посмотреть сообщение
что такое КонтролКонтейнерПодформы?
Смотрите здесь Скрытие/отображение подчиненной формы по нажатию кнопки

Цитата Сообщение от AMufu Посмотреть сообщение
очевидно что-то не так сделал
В режиме конструктора формы выделите текстовое поле фильтра, перейдите в Свойства-вкладка События-Изменение. Нажмите кнопку со стрелкой и выберите Процедура обработки событий. Нажмите рядом кнопку с 3 точками и попадете в редактор ВБА, где уже будет оглавление процедуры. Внутрь нее скопируйте предложенный текст без строк Private Sub... и End Sub. Замените "Таблица" на имя запроса-источника подформы, [ФильтруемоеПоле] на имя фильтруемого поля подформы, а Me.ТекстовоеПолеФормы на имя текстового поля фильтра.
0
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
20.04.2015, 00:15  [ТС]
Спасибо за детальное объяснение. Правда все равно пишет Error: Method or data member not found.
Если можна посмотрите что делаю не так. Образец базы прилагаю.
Там есть форма Frm_Mat_Names в ней поле Mat_fltr_fld которое служит фильтром для комбобокса MatID_fld в подформе frmMat_OurNames. Комбобокс имеет источником строк запрос q3. Нужно чтоб при открытии комбобокса были доступны только результаты, которые удовлетворяют условиям фильтра.
Вложения
Тип файла: rar ProductionEney_v8_4_5 - копия (2).rar (339.0 Кб, 9 просмотров)
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.04.2015, 01:22
AMufu, Вы там много поперепутали... Поправил. Смотрите процедуру на Change.

И да, вот еще что. Я исключил из референсов ссылку на StrokeScribe.ocx. У меня такой библиотеки нет. Если нужна, заново подлинкуйте.
Вложения
Тип файла: rar ProductionEney_v8_4_5 - копия (2).rar (331.1 Кб, 31 просмотров)
1
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
20.04.2015, 21:08  [ТС]
Спасибо.
Но есть еще пару вопросов
1. Я пробую переделать процедуру для другой подформы и ничего не получается - пишет разные ошибки
Вот текст запроса, на основе которой построена другая подформа
SQL
1
2
3
4
5
6
SELECT MaterGroups.IDMatGr, MaterGroups.GrMatID, MaterGroups.MatID, 
DLookUp("RemQuant","qMater","IDMater=" & MaterGroups.MatID) AS RemQuant, 
DLookUp("OurName","qMater","IDMater=" & MaterGroups.MatID) AS OurName, 
DLookUp("OurColName","qMater","IDMater=" & MaterGroups.MatID) AS OurColName, 
DLookUp("OurColCode","qMater","IDMater=" & MaterGroups.MatID) AS OurColCode
FROM MaterGroups;
Данный запрос (т.е. источник строк подформы) сохранен как запрос q4.

Поле формы MatID является комбобоксом и имеет источником строк запрос
SQL
1
2
SELECT Material.MaterName, Material.[1Ccode], Material.OV, Material.IDMater, Material.IDOV
FROM Material;
Я хочу для каждого из полей этой подформы сделать поле фильтр по частичному совпадению (типа как тот, что сделали Вы) который будет фильтровать записи паказываемые подформой.
ПРобовал ка для тех полей, которые не используют комбобокс, например поле (DLookUp("OurName","qMater","IDMater=" & MaterGroups.MatID) AS OurName).


Visual Basic
1
2
3
4
5
6
7
8
Private Sub OurNames_fltr_fld_Change()
 
Dim s
  s = "select * from q4 where [IDMatGr] Like " '*" & OurNames_fltr_fld.Text & "*'"
  
  
  Me.frmMaterGroups.Form.RecordSource = s
End Sub
Так и для поля MatID которое использует комбобокс

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub OurNames_fltr_fld_Change()
 
Dim s
 
 s = "SELECT MaterGroups.IDMatGr, MaterGroups.GrMatID, MaterGroups.MatID " _
  & " FROM MaterGroups INNER JOIN q6 ON MaterGroups.MatID = q6.IDMater" _
  & " where q6.MaterName Like '*" & OurNames_fltr_fld.Text & "*'"
  
  Me.frmMaterGroups.Form.RecordSource = s
  
End Sub
(q6 - запрос-источник строк комбобокса)

и даже так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub OurNames_fltr_fld_Change()
 
Dim s
 
 s = "SELECT MaterGroups.IDMatGr, MaterGroups.GrMatID, MaterGroups.MatID, DLookUp("RemQuant","qMater","IDMater=" & MaterGroups.MatID) AS RemQuant, DLookUp("OurName","qMater","IDMater=" & MaterGroups.MatID) AS OurName,  DLookUp("OurColName","qMater","IDMater=" & MaterGroups.MatID) AS OurColName,  
DLookUp("OurColCode","qMater","IDMater=" & MaterGroups.MatID) AS OurColCode " _
  & " FROM MaterGroups INNER JOIN q6 ON MaterGroups.MatID = q6.IDMater" _
  & " where q6.MaterName Like '*" & OurNames_fltr_fld.Text & "*'"
  
  Me.frmMaterGroups.Form.RecordSource = s
  
End Sub
Вобщем если не трудно - подскажите, как надо.

2. Моя идея была относительно предыдущей формы была чтоб фильтровались не записи самой формы, а записи которые вываливаются в комбобоксе (т.е. набор, из которого можна выбрать значение в комбобоксе ограничивается фильтром, данные же самой формы при этом фильтроватся не должны). А получается наоборот. Сейчас же фильтр работает как фильтр записей которые выводятся в форме, а не фильтр записей (значений) которые выпадают из комбобокса. Возможно ли это переделать?

На всякий случай приложу базу. Форма которая относится к первому вопросу называется FrmMater , а подформа которую пробую фильтровать - frmMaterGroups. Пробное поле называется OurNames_fltr_fld, хотя такие поля хочу создать для каждого из полей подформы frmMaterGroups.
Вложения
Тип файла: rar ProductionEney_v8_4_5 - копия (3).rar (408.2 Кб, 24 просмотров)
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
20.04.2015, 22:12
По первому вопросу недоперепонял, что нужно. Попробуйте как-то иначе сформулировать задачу.

По фильтрации комбо. Вы не сказали как называется поле со списком, которое надо фильтровать. Предположу, что "Art_fltr_fld". Тогда измените процедуру на событии Change поискового поля OurNames_fltr_fld на:
Visual Basic
1
2
3
4
5
6
7
Private Sub OurNames_fltr_fld_Change()
    Dim s
    s = "SELECT Artik.Art FROM Artik " _
    & " Where ModName Like '*" & OurNames_fltr_fld.Text & "*' " _
    & " ORDER BY Artik.Art "
    Me.Art_fltr_fld.RowSource = s
End Sub
И еще. При открытии формы идет ошибка. Возможно, не хватает какой-то таблицы или запроса. Но откуда она идет, не нашел. Это надо скрупулезно удалять поля и подформы, чтобы увидеть источник ошибки
0
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
21.04.2015, 00:30  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
По первому вопросу недоперепонял, что нужно. Попробуйте как-то иначе сформулировать задачу
ну то есть в форме FrmMater нужно организовать фильтры для подформы frmMaterGroups которыми можно фильтровать каждое поле подформы, а именно MatID, RemQuant, OurName, OurColName, OurColCode (ну чтоб как в обычном фильтре для таблицы или запроса). Очевидно будет разница для процедур фильтрации поля MatID, которое отображается через комбобокс и всех остальных полей, которые выбыраются коммандой DlookUp()

Добавлено через 55 минут
Цитата Сообщение от mobile Посмотреть сообщение
По фильтрации комбо. Вы не сказали как называется поле со списком, которое надо фильтровать. Предположу, что "Art_fltr_fld".
Поле которое нужно фильтровать называется MatID в подформе frmMaterGroups формы FrmMater.
Вот попробовал переделать процедуру для его фильтрации. Оно как будто фильтрует подформу, но что бы я не ввел совпадений не находит. Очищаю поле фильтра - форма заполняется обратно всеми записями.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Private Sub OurNames_fltr_fld_Change()
 
Dim s
    s = "SELECT Material.MaterName, Material.[1Ccode], Material.OV, Material.IDMater, Material.IDOV" _
    & " FROM Material" _
    & " Where IDMater Like '*" & OurNames_fltr_fld.Text & "*' " _
    
    Me.frmMaterGroups.Form!MatID.RowSource = s
 
  
End Sub
ПС. Относительно ошибки - странно, не знаю что может быть. Но это не важно я думаю.

Добавлено через 46 минут
К вопросу 1. Попробовал еще так, что-то работает, но фильтр срабатывает только на первый введенный символ. Второй уже сразу выдает ошибку. Если пробуешь стереть - тоже ошибка.
Visual Basic
1
2
3
4
5
6
7
8
9
Private Sub OurNames_fltr_fld_Change()
Dim s
 
  s = "SELECT q7.IDMatGr, q7.GrMatID, q7.MatID " _
  & " FROM q7 INNER JOIN q8 ON q7.MatID = q8.IDMater " _
  & " where q8.MaterName Like '*" & OurNames_fltr_fld.Text & "*'"
 
  Me.frmMaterGroups.Form.RecordSource = s
End Sub
0
17 / 17 / 7
Регистрация: 05.09.2012
Сообщений: 246
22.04.2015, 14:33  [ТС]
Ребята, так и не смог разобратся с фильтром для формы по частичному совпадению. Помогите пожалуйста сделать. Я смог сделать только на основе макроса и только для совпадения целого поля. И то етот фильтр работает только если фитльруемая форма открыта отдельно, а если она открывается как подформа в другой форме то фильтр не работает. Фильтр по основному и и подчиненному полю не подходит так как уже используется для связи подформы м другой подформой.
Нужен фильтрпо частичному совпадению любого поля любой подформы формы FrmMater. Свободное поле которое используется как фильтр должно размещатся на основное форме FrmMater так как может быть использовано несколькими подформами. Если есть разница для фильтрации по простому поль и полю со списком то желательно сделать по одному пильтру для каждого варианта. Помогите плиииз

Добавлено через 55 минут
Базу прилагал ранее.
Прошу прощения за грамматику - писал с телефона
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.04.2015, 14:33
Помогаю со студенческими работами здесь

Обратится к текстовому полю на родительской форме
Я хочу обратится из сабформы к текстовому полю на родительской форме. Т.е вот это работает: =MsgBox(!!) А как можно обратится используя...

Множественный фильтр по текстовому полю
Привет специалистам! Есть таблица в БД MySQL с текстовым полем complete. В этом поле хранится массив чисел в JSON, напр: или , если...

Поиск на листе с частичным совпадением
Доброго времени, суток! Подскажите, почему у меня не работает find??? Ниже код и пример Sub ЗагрузкаСпискаНомеровExcel() ...

Запрос на поиск с частичным совпадением и 4 переменными
Доброго времени суток, товарищи, ломаю голову и не знаю как сделать - в общем у меня есть 4 поля для ввода (не обязательно что бы все были...

Поиск через textbox c частичным совпадением
Привет всем, помогите реализовать нормальный поиск с частичным совпадением введенного в textbox Вот код TextBoxа который ищет в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru