Ограничение раскрывающегося списка
К сожалению, в Access'е не предусмотрена возможность формирования набора строк раскрывающегося списка с ограничением, накладываемым значением какого-либо другого поля записи. Такой список можно создать самостоятельно ценой лишних поля в источнике данных формы, элемента управления типа Text Box и пары строк кода в обработчике события Got Focus раскрывающегося списка: Private Sub MyCombo_GotFocus()
Me.MyCombo.RowSource = "SELECT ID, Должность FROM Должности WHERE Фирма = " & Me!Фирма
Me.MyCombo.Requery
End Sub
В источнике данных формы должны присутствовать и кодовое (из первичной таблицы - Сотрудники.Должность ) и текстовое (из присоединенного справочника - Должности.Должность ) представления поля Должность . Предполагается, что поле Фирма присутствует в обеих таблицах: именно по нему и происходит ограничение значений в списке. ALTER PROCEDURE СписокДолжностей (@Сотрудник Int = NULL)
AS SELECT Сотрудники.*, Должности.Должность
FROM Сотрудники LEFT OUTER JOIN Должности ON Сотрудники.Должность = Должности.ID
WHERE (Сотрудники.ID = @Сотрудник) OR (@Сотрудник IS NULL)
Здесь параметр @Сотрудник нужен для правильной работы этой процедуры как команды синхронизации (данный пример подразумевает работу с ADP в Access 2000/2002).
В самой форме, кроме раскрывающегося списка, должен быть Text Box, связанный с полем Должности.Должность . Его нужно расположить поверх списка но так, чтобы кнопка раскрывания всё таки была видна. Первоначально источник строк списка должен быть пустым, что, кстати, благоприятно сказывается на скорости открытия формы.
Разумеется, в режиме таблицы это работать не будет. Пример для Access'97 можно взять здесь.
Пара замечаний:
- Тот самый Text Box на форме должен быть заблокирован. Иначе фамилию в справочнике сотрудников можно случайно изменить.
- При выборе другой фирмы надо очищать поле сотрудника. Это препятствует попаданию сотрудников в "чужие" фирмы.
|