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