Ограничение раскрывающегося списка

Источник: Sgml

К сожалению, в 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 можно взять здесь.

Пара замечаний:

1.  Тот самый Text Box на форме должен быть заблокирован. Иначе фамилию в справочнике сотрудников можно случайно изменить.

2.  При выборе другой фирмы надо очищать поле сотрудника. Это препятствует попаданию сотрудников в "чужие" фирмы.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=10390