Просто, чтобы добавить к миксу, я бы предложил два подхода, один рекомендованный, другой нет.
Подход 1. Если вы связали свою форму со всей таблицей данных (это не рекомендуемый подход), вы можете использовать мастер комбинированного окна для перехода к запрошенной записи, но я бы не рекомендовал ее использовать в последние версии Access:
а. он не позволяет правильно назвать поле со списком, прежде чем он создаст код.
б. код просто НЕПРАВИЛЬНЫЙ.
Вот код, который я только что создал в моей тестовой базе данных:
Dim rs As Object
Set rs = Me.Recordset.Clone
rs.FindFirst "[InventoryID] = " & Str(Nz(Me![Combo2], 0))
If Not rs.EOF Then Me.Bookmark = rs.Bookmark
Это неправильно во многих отношениях, это просто замечательно. Вот какой код должен быть:
With Me.RecordsetClone
.FindFirst "[ID]=" & Me!cmbMyComboBox
If Not .NoMatch Then
If Me.Dirty Then Me.Dirty = False
Me.Bookmark = .Bookmark
Else
MsgBox "Not Found!"
End If
End With
Нет необходимости клонировать набор записей формы, когда RecordsetClone уже существует.
Нет смысла использовать переменную объекта, если вы можете просто напрямую использовать уже существующий объект.
Перед удалением записи должна быть проверка на грязную запись, потому что если вы не принудительно сохраните данные, ошибки в процессе сохранения могут привести к потере данных.
Но лучший подход заключается в следующем:
Подход 2: Используйте поле со списком, чтобы изменить базовый источник записей формы.
Событие AfterUpdate вашего поля со списком будет выглядеть примерно так:
If Not IsNull(Me!cmbMyComboBox) Then
Me.Recordsource = Me.Recordsource & " WHERE [ID]=" & Me!cmbMyComboBox
End If
Теперь, это работает только в первый раз, так как при второй перезагрузке Источника записей вы получите два предложения WHERE, что не очень хорошо. Есть два подхода:
а. предполагая, что форма открывается без предложения WHERE, сохраните значение источника записей открытия в переменной уровня модуля в событии OnLoad формы:
Private Sub Form_Load()
strRecordsource = Left(Me.Recordsource,Len(Me.Recordsource)-1)
End Sub
А на уровне модуля, соответственно, определить strRecordsource:
Dim strRecordsource As String
Затем в событии AfterUpdate поля со списком у вас есть это вместо:
Me.Recordsource = strRecordsource & " WHERE [ID]=" & Me!cmbMyComboBox
Теперь, если ваша форма открывается с уже определенным предложением WHERE, она усложняется, но я не буду вдаваться в подробности и оставлю читателю в качестве упражнения наилучший подход.