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