Страницы

понедельник, 1 июня 2015 г.

Динамическая фильтрация поля со списком (Access)

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


Нажимаем кнопку «Итоги», устанавливаем группировку по всем полям, чтобы в список выводились уникальные значения.
Затем определим параметр в поле «Шифр» :

[Формы]![Форма для отбора по специальности и Уз]![ПолеСпециальность]

Сохраним запрос.
Переходим в форму и добавляем новое поле со списком. Выбираем в разделе запросов нужный запрос – ЗапросДляФильтрации


Выбираем поля для запроса:


Делаем сортировку по городу и по названию. Затем скрываем первый столбец:


Тут оставляем строку «Код»:


Далее добавляем подпись к полю. Затем переименуем для удобства.
Получается такой результат:


Вот такая разница получается:




Изменим запрос для запроса отбора абитуриентов, добавим в него поле с отфильтрованным списком. В условии отбора поля «Код» помещаем параметр – значение первого столбца поля со списком:

Сохраняем запрос.
Можно проверить на форме, все работает. Но при выборе другого значения в поле со списком специальностей второе поле не меняется. Нужно очистить первую строку и выполнить запрос снова.
В конструкторе формы открываем свойства поля со списком «ПолеСпециальность», на вкладке события ищем событие «После обновления» (AfterUpdate), выбираем процедуру обработки события и, нажав кнопку с тремя точками, переходим в редактор VisualBasic. Там в тексте процедуры вводим две строки (первая и последняя уже создана):
Private Sub ПолеСпециальность_AfterUpdate()
    Me.ПолеУЗфильтр = Null
    Me.ПолеУЗфильтр.Requery
End Sub
Сохраняем и проверяем работу формы и запроса. Сейчас результат можно получить гораздо быстрее, чем раньше, перебирая все строки специальностей и учебных заведений.