Иллюстрированный самоучитель по Microsoft Access 2002

Создание процедур обработки событий

Синхронизация данных в связанных формах

Пример синхронизации данных в двух связанных формах с помощью процедуры обработки события Текущая запись (Current) можно увидеть в модуле формы "Поставщики" (Supplier). В форме есть кнопка Просмотр товаров (Review Products), при нажатии на которую выводится форма "Список товаров" (Product List), показывающая товары данного поставщика. Естественно, что при переходе к новой записи в форме "Поставщики" (Supplier), записи в форме "Список товаров" (Product List) тоже должны быть сменены. Процедура выглядит следующим образом:

Private Sub Form_Current()
On Error GoTo Err_Form_Current
'Отображение товаров текущего поставщика при открытии формы "Список товаров".
Dim strDocName As String
Dim strLinkCriteria As String
strDocName = "Список товаров"
strLinkCriteria = "[КодПоставщика] = Forms![Поставщики]![КодПоставщика]"
If IsNull(Me![Название]) Then
Exit Sub
Elself IsLoaded("Список товаров") Then
DoCmd.OpenForm strDocName,,, strLinkCriteria
End if
Exit_Form_Current:
Exit Sub
Err_Form_Current:
MsgBox Err.Description
Resume
Exit_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 Then
MsgBox "Клиент с таким идентификатором уже существует в базе"
Cancel = True
End If
rs.Close
End Sub

Поиск записи со значением ключа, совпадающим с введенным значением поля "КодКлиента" (CustomerlD), выполняется с помощью метода Seek объекта Recordset. Этот метод обеспечивает быстрый поиск необходимой записи. Применить его можно только к набору записей табличного типа, поэтому при создании этого набора записей используется внутренняя константа dbOpenTable. Если такая запись найдена, свойство NoMatch объекта Recordset принимает значение False. В этом случае процедура выведет сообщение, что такой пользователь уже существует и присвоит значение True аргументу Cancel. Это позволяет отменить обновление значения элемента управления. Если значение свойства NoMatch объекта Recordset равно True, процедура закрывает набор записей (рекомендуется не забывать это делать) и завершает свою работу.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.