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) первого списка.

Данный способ действует только для одиночной формы (на экране видно одну запись).

Обычно ленточные и табличные формы предназначены для поиска и просмотра, для ввода и редактирования - одиночная форма, поэтому в ней как раз и нужна фильтрация списков.

Рейтинг@Mail.ru
вверх гостевая; E-mail