Access 2007, окно поиска в текстовом поле, например окно поиска имени в Facebook в правом верхнем углу - PullRequest
1 голос
/ 25 июня 2009

так что в основном у меня есть форма AddCompany, в которой есть текстовое поле [CompanyName], я хочу ввести там новое название компании, но пока проверю, есть ли уже существующее.

Так, например, скажем, я хочу ввести Microsoft, когда я набираю M, в текстовом поле отображается целый ряд других имен с помощью M, а затем продолжается до тех пор, пока я не закончу печатать microsoft. В основном, как работает окно поиска в Facebook.

Как мне реализовать это в Microsoft Access 2007 ?? это может быть в событии on dirty / on change / On key down ???

Пожалуйста, просветите меня !!

Большое спасибо !!!

Ответы [ 3 ]

1 голос
/ 26 июня 2009

С помощью мастеров доступа можно сделать гораздо более простую версию. Если вы включите мастера формы в дизайне формы и нажмете кнопку поля со списком и укажете на местоположение в заголовке вашей формы, вы автоматически получите возможность создать поле со списком, в котором будет найдена запись, соответствующая указанному в списке. в раскрывающемся списке.

Однако помните следующее:

  1. это работает, только когда вы связали свою форму со всей таблицей (что не рекомендуется для больших наборов записей)

  2. код, который он создает, ужасно ПЛОХО.

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

Вместо этого я буду стремиться изменить источник записей формы вместо применения фильтра. Это означает, что каждый поиск даст вам новый набор результатов и является наиболее эффективным подходом. Это немного усложняет возвращение к исходной точке, но в правильно сконструированном приложении вам, вероятно, в первую очередь следует представлять пользователям только подмножества данных, поэтому проблема в этом подходе ». «Причины» - это то, что вам нужно устранить, чтобы создать надлежащий и эффективный пользовательский интерфейс, который извлекает только те данные, которые действительно нужны пользователю.

0 голосов
/ 26 июня 2009

Формы в Access имеют функции обработчика событий. Так не могли бы вы использовать код автозаполнения, добавленный к этим функциям для этой функции? Я нашел книгу на Google Книги , в которой обсуждается это.

Я могу подумать о следующем коде, который необходимо добавить в функцию обработчика событий:
1. SQL для поиска существующих потенциальных совпадений
2. Код сгенерированный выпадающий список для отображения потенциальных совпадений

0 голосов
/ 25 июня 2009

В общем, эта функция называется автозавершение (я также слышал, как найти как вы). На этой странице есть статья о том, как это сделать в Access .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...