С помощью мастеров доступа можно сделать гораздо более простую версию. Если вы включите мастера формы в дизайне формы и нажмете кнопку поля со списком и укажете на местоположение в заголовке вашей формы, вы автоматически получите возможность создать поле со списком, в котором будет найдена запись, соответствующая указанному в списке. в раскрывающемся списке.
Однако помните следующее:
это работает, только когда вы связали свою форму со всей таблицей (что не рекомендуется для больших наборов записей)
код, который он создает, ужасно ПЛОХО.
Есть несколько способов решить эту проблему. Если вы довольны привязкой своей формы ко всей таблице, навигация по закладкам (как и в коде, созданном мастером) будет в порядке. Однако я рекомендую использовать этот код вместо кода мастера (предполагается, что в поле со списком есть связанный столбец с PK ID записи, которую вы пытаетесь найти):
Private Sub MyComboBox_AfterUpdate()
If IsNull(Me!MyComboBox) Then Exit Sub
With Me.RecordsetClone
.FindFirst "[MyID]=" & Me!MyCombBox
If Not .NoMatch Then
If Me.Dirty Then Me.Dirty = False
Me.Bookmark = .Bookmark
End If
End With
End Sub
Поле со списком должно использовать источник строк SQL, и это будет что-то вроде:
SELECT CompanyID, CompanyName FROM Company ORDER BY CompanyName
И вы бы определили поле со списком, состоящее из 2 столбцов, первый - связанный столбец, и вы бы установили ширину для первого столбца равным 0. Мастер проведет вас через это и настроит для вас. , Единственное, что он делает неправильно, это пишет действительно плохой код.
Теперь, если вы не ищете уникальное значение, оно становится более сложным, и вы можете использовать другой подход. Предположим, у вас есть форма, которая отображает людей, и вы хотите увидеть их для конкретной компании. В этом случае вы можете фильтровать по CompanyName. В этом случае вместо выполнения операции поиска, как описано выше, вы можете применить фильтр. В этом случае событие AfterUpdate вашего поля со списком будет выглядеть примерно так:
Private Sub MyComboBox_AfterUpdate()
If IsNull(Me!MyComboBox) Then Exit Sub
Me.Filter = "[CompanyName]=" & Chr(34) & Me!MyComboBox & Chr(34)
Me.FilterOn = True
End Sub
Теперь, в этом случае, ваше поле со списком будет иметь только один столбец с названием компании и без скрытого поля идентификатора, так что это несколько отличается.
Мне не нравится программировать этот вид фильтрации, поскольку он предоставляется пользовательским интерфейсом Access (вы можете щелкнуть правой кнопкой мыши на поле CompanyName и в появившемся контекстном меню введите название компании, по которой вы хотите фильтровать, включая символы подстановки,? и *). Кроме того, это может сбить с толку, когда вы пытаетесь фильтровать, когда фильтр уже установлен. Если вы просматриваете только CitiCorp, а затем фильтруете по JP Morgan Chase, вы ничего не получите.
Вместо этого я буду стремиться изменить источник записей формы вместо применения фильтра. Это означает, что каждый поиск даст вам новый набор результатов и является наиболее эффективным подходом. Это немного усложняет возвращение к исходной точке, но в правильно сконструированном приложении вам, вероятно, в первую очередь следует представлять пользователям только подмножества данных, поэтому проблема в этом подходе ». «Причины» - это то, что вам нужно устранить, чтобы создать надлежащий и эффективный пользовательский интерфейс, который извлекает только те данные, которые действительно нужны пользователю.