Проверка дублирования значений первичного ключа
Обычно проверка дублирования значений первичного ключа задается на уровне таблицы, т. е. когда вы определили поле в таблице как первичный ключ, значение свойства
Индексированное поле
(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, процедура закрывает набор записей (рекомендуется не забывать это делать) и завершает свою работу.
CompEbook.ru Железо, дизайн, обучение и другие