Я считаю, что вам понадобятся две вещи, в зависимости от того, насколько удобный интерфейс вам нужен.
Уникальный индекс
Добавьте уникальный многостолбцовый индекс в столбцы в таблице настроек, в котором их комбинация значений, которую вы никогда не хотите дублировать в другой строке. Вы можете прочитать, как это сделать, в ссылке, предоставленной KFleschner в комментариях к вашему исходному сообщению, или ознакомьтесь со вторым ответом на этот вопрос, в котором есть снимок экрана для выполнения шагов: Можем ли мы создать многоколоночные уникальные индексы в базах данных доступа MS?. Это запретит дублирование в таблице настроек.
Например, если ваши настройки и эксперименты были для компьютерных ригов, и у вас была таблица настроек со следующими столбцами:
SettingID, RAM_GB, CPU_GHz
Тогда ваш первичный ключ будет (SettingID), а ваш многостолбцовый уникальный индекс будет включен (RAM_GB, CPU_GHz), потому что вам нужна только одна запись с таким же объемом RAM и скоростью процессора.
На языке базы данных вашим первичным ключом SettingID будет так называемый суррогатный ключ. И новый уникальный индекс с несколькими столбцами будет так называемым естественным ключом. Оба могут использоваться для идентификации уникальной строки, но первичный ключ (суррогатный ключ) - это то, что используется в любом внешнего ключа, например SettingID в таблице экспериментов.
Это само по себе предотвратит проблему с дублированием, поскольку она будет реализована на уровне базы данных. Однако это не заставит вашу форму автоматически перейти к записи с соответствующим естественным ключом. Вместо этого Access предупредит пользователя сообщением о том, что вы ввели запись, нарушающую индекс. Но не более того. Пользователь должен будет отменить новую запись и сам найти подходящую.
Перед событием обновления
Событие Before Insert запускается при вводе первого символа новой записи. См. http://msdn.microsoft.com/en-us/library/office/ff835397.aspx для получения дополнительной информации. Это слишком рано, вам нужно событие «Перед обновлением». И добавьте к событию такой код:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Set rst = Me.RecordsetClone
rst.FindFirst "[SettingID] <> " & Me.SettingID & " AND [RAM_GB] = " & Me.RAM_GB & " AND [CPU_GHz] = " & Me.CPU_GHz
If Not rst.NoMatch Then
Cancel = True
If MsgBox("Setting already exist; goto existing record?", vbYesNo) = vbYes Then
Me.Undo
DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID")
End If
End If
rst.Close
End Sub
Этот код предполагает несколько вещей:
[RAM_GB]
и [CPU_GHz]
- это столбцы вашего уникального индекса с несколькими столбцами.
[SettingID]
- это столбец в вашем первичном ключе.
Настройте имена столбцов и тому подобное в соответствии с вашими потребностями, и тогда у вас также будет способ запрашивать и автоматически переходить к существующей записи.
person
Sybeus
schedule
30.01.2013