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

К сожалению, в 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. При выборе другой фирмы надо очищать поле сотрудника. Это препятствует попаданию сотрудников в "чужие" фирмы.


Опубликовал admin
22 Окт, Пятница 2004г.



Программирование для чайников.