Nickolay.info. Обучение. Зависимые списки в Access |
Довольно распространена ситуация, когда выбор значения из одного списка должен приводить к обновлению второго, подчинённого списка, недавно я описывал такую реализацию на PHP, а теперь вот понадобилась в Access.
Если упростить задачу, то в базе хранится информация о сотрудниках предприятия, работающих в нескольких отделах, при этом в каждом отделе есть свой набор должностей. Поскольку и у отдела, и у должности есть свои атрибуты (название, номер офиса для отдела, должностной оклад для должности и т.п.), целесообразно вынести информацию об отделах и должностях в отдельные таблицы. С другой стороны, сотрудник работает и в отделе, и на должности, так что получается следующая схема данных:
"Примечания" здесь добавлены просто для иллюстрации отношения "один к одному" как связи между двумя ключами.
Теоретически сотрудник может переводиться как на другую должность в рамках отдела, так и в другой отдел, что приведёт к необходимости выбрать должность из списка должностей нового отдела. То есть, по выбору для сотрудника нового отдела из верхнего списка, должен обновляться и нижний список "Наименование должности":
Как решить эту типовую задачу, мы и поговорим.
1. Источником записей формы "Сотрудники" делаем соответствующую таблицу, форму можно сгенерировать мастером, а затем удалить из неё поля "Код отдела" и "Код должности".
2. Вместо первого поля, включив кнопку "Мастера" на панели элементов Access, сгенерируем список, выводящий вместо кодов названия отделов. Сделать это можно так:
3. С помощью конструктора запросов составляем следующий запрос:
Здесь "ПолеСоСписком16" - наименование компоненты верхнего списка.
4. Аналогично с помощью мастера делаем второй список, указав источником строк наш запрос, а выбор сохраняя в поле КодДолжности таблицы Сотрудники, получается вот такое окно свойств второго списка:
Увидеть это окно можно, щёлкнув правой кнопкой мыши на втором списке и выбрав "Свойства".
5. Теперь самое главное. В списке компонент выбираем "Форма" вместо имени поля со списком, выбираем вкладку события, событие Текущая запись, щёлкаем по кнопке с многоточием, подтверждаем, что нам нужен построитель программы, а не макроса или выражения:
Открылся редактор Visual Basic и появилась пустая функция с именем Form_Current
. Пишем туда единственную строчку кода, которая обновит нижний список:
Private Sub Form_Current() Me.ПолеСоСписком20.Requery End Sub
Здесь предполагается, что имя нижнего списка ПолеСоСписком20
.
6. Ту же самую строчку кода добавляем на событие "До обновления" верхнего списка, у меня получилось вот что:
Private Sub ПолеСоСписком16_BeforeUpdate(Cancel As Integer) Me.ПолеСоСписком20.Requery End Sub
7. Готово, теперь при выборе отдела из верхнего списка в нижний список подгружается список должностей этого отдела. Все остальные возможности приложения - стандартные и не потребуют написания кода.
Скачать этот пример в архиве ZIP (41 Кб)
Аналогично можно организовать любые другие 2 подчинённых списка на Access, когда при выборе значения из одного списка должны загружаться новые значения во второй список.
Ну и общие соображения по зависимым спискам в Access:
Если первый список не связан с полем источника записей формы, то обновление надо ставить в обработчик события BeforeUpdate ("До обновления" в окне свойств конструктора формы в русских версиях Access-а), либо в AfterUpdate.
Если же первый список связан с полем источника записей формы, то обновление надо ставить в обработчик события Current ("Текущая запись") формы и BeforeUpdate (AfterUpdate) первого списка.
Данный способ действует только для одиночной формы (на экране видно одну запись).
Обычно ленточные и табличные формы предназначены для поиска и просмотра, для ввода и редактирования - одиночная форма, поэтому в ней как раз и нужна фильтрация списков.
гостевая; E-mail |