Создание процедур обработки событий
Синхронизация данных в связанных формах
Пример синхронизации данных в двух связанных формах с помощью процедуры обработки события Текущая запись (Current) можно увидеть в модуле формы "Поставщики" (Supplier). В форме есть кнопка Просмотр товаров (Review Products), при нажатии на которую выводится форма "Список товаров" (Product List), показывающая товары данного поставщика. Естественно, что при переходе к новой записи в форме "Поставщики" (Supplier), записи в форме "Список товаров" (Product List) тоже должны быть сменены. Процедура выглядит следующим образом:
Private Sub Form_Current() On Error GoTo Err_Form_Current 'Отображение товаров текущего поставщика при открытии формы "Список товаров". Dim strDocName As StringDim strLinkCriteria As StringstrDocName = "Список товаров"strLinkCriteria = "[КодПоставщика] = Forms![Поставщики]![КодПоставщика]"If IsNull(Me![Название]) ThenExit SubElself IsLoaded("Список товаров") ThenDoCmd.OpenForm strDocName,,, strLinkCriteria End if Exit_Form_Current: Exit SubErr_Form_Current: MsgBox Err.Description ResumeExit_Form_Current End SubЕсли текущая запись в форме "Поставщики" (Supplier) пустая, т. е. добавляется новая запись, то сразу выполняется выход из процедуры. Если текущая запись отображает конкретного поставщика, то проверяется, загружена ли форма "Список товаров" (Product List). Если форма загружена, то меняется набор записей в ней. Делается это с помощью макрокоманды ОткрытьФорму (OpenForm) с соответствующим условием отбора записей. При этом на самом деле форма не открывается, просто повторно запрашивается источник данных.
Проверка дублирования значений первичного ключа
Обычно проверка дублирования значений первичного ключа задается на уровне таблицы, т. е. когда вы определили поле в таблице как первичный ключ, значение свойства Индексированное поле (Indexed) автоматически устанавливается равным Yes (No Duplicates) – Да (Совпадения не допускаются). Однако эта проверка выполняется только тогда, когда запись сохраняется в базе данных. Если значение ключевого поля вводится в форме пользователем, как, например, в таблице "Клиенты" (Customers), то эту проверку лучше выполнить сразу после ввода данных в это поле. Наиболее подходящим событием для этого является событие До изменения (Before Update). В форме "Клиенты" (Customers) элемент управления "КодКлиента" (CustomerID) содержит идентификатор клиента. Событие До изменения (Before Update) этого поля обрабатывается с помощью макроса "Клиенты" (Customers.ValidateID), который выполняет необходимую проверку. Мы покажем, как можно обработать это событие с помощью процедуры VBA. Данная процедура может глядеть следующим образом.
Private Sub КодКлиента_ВеforeUpdate(Cancel As Integer) Dim rs As Recordset Set rs = CurrentDB.Openrecordset("Клиенты", dbOpenTable) rs.Index = "PrimaryKey"rs.Seek "=", Me!КодКлиента if Not rs.NoMatch ThenMsgBox "Клиент с таким идентификатором уже существует в базе"Cancel = TrueEnd Ifrs.Close End SubПоиск записи со значением ключа, совпадающим с введенным значением поля "КодКлиента" (CustomerlD), выполняется с помощью метода Seek объекта Recordset. Этот метод обеспечивает быстрый поиск необходимой записи. Применить его можно только к набору записей табличного типа, поэтому при создании этого набора записей используется внутренняя константа dbOpenTable. Если такая запись найдена, свойство NoMatch объекта Recordset принимает значение False. В этом случае процедура выведет сообщение, что такой пользователь уже существует и присвоит значение True аргументу Cancel. Это позволяет отменить обновление значения элемента управления. Если значение свойства NoMatch объекта Recordset равно True, процедура закрывает набор записей (рекомендуется не забывать это делать) и завершает свою работу.
