Настройка функции автозаполнения в таблице данных Microsoft Access

У меня есть основная форма, привязанная к записи пользователя, с подчиненной формой, привязанной к ряду объектов Client, которыми «владеет» пользователь. Таким образом, между пользователем и клиентом существует отношение «один ко многим».

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

Следует отметить, что в таблице «Клиенты» каждый клиент имеет уникальный числовой идентификатор, а также полное название компании (Test Agency, Inc.), разговорное название (Test Agency) и сокращенное название (TA). .

Я пытаюсь отредактировать подчиненную форму, чтобы функция автозаполнения соответствовала любому из трех полей, перечисленных выше (полное имя, разговорное имя и сокращенное имя). Прямо сейчас автозаполнение работает только с полным именем, так как это поле связано с подчиненной формой. Я хотел бы, чтобы пользователь мог ввести часть строки, подчиненная форма, чтобы попытаться сопоставить ее с любым из трех полей (полное имя, разговорное имя, сокращенное имя) и вернуть список потенциальных совпадений для любого из три поля. Когда пользователь выбирает правильное потенциальное соответствие для Клиента, которого он пытается найти, тогда полное название компании будет введено в таблицу данных. По сути, эти дополнительные поля просто облегчают пользователю поиск нужного Клиента (представьте, что вы вводите AMD вместо Advanced Micro Devices, Inc.).

Мой первый вопрос - это возможно сделать с простой таблицей данных? Я изучал использование полей поиска и полей поиска с несколькими значениями, но я не уверен, что это правильный метод. Или мне нужно будет создать собственный элемент управления, который выполняет сопоставление нескольких полей?


person npp1993    schedule 22.06.2017    source источник


Ответы (2)


Сделал такой запрос

SELECT *
FROM Company
WHERE fullName LIKE '*' & pCompany & '*'
    OR Colloquial LIKE '*' & pCompany & '*'
    OR Abbr LIKE '*' & pCompany & '*'

и в моей форме я сделал это

Private Sub cboCompany_KeyUp(KeyCode As Integer, Shift As Integer)
    ClearCombo cboCompany

    Dim sql As String

    Dim rs As DAO.Recordset
    Dim companySearch As DAO.QueryDef
    Set companySearch = CurrentDb.QueryDefs("CompanySearch")
    companySearch.Parameters("pCompany") = cboCompany.Text

    Set rs = companySearch.OpenRecordset

    Do While Not rs.EOF
        cboCompany.AddItem rs("ID") & ";" & rs("FullName") & ";" & rs("Colloquial") & ";" & rs("Abbr")
        rs.MoveNext
    Loop
End Sub

Private Sub ClearCombo(cbo)
    For i = cbo.ListCount - 1 To 0 Step -1
            cbo.RemoveItem i
    Next i
End Sub

Это не супер быстро, но работает. Я думаю, что это сделает его быстрее, если не отключать событие KeyUp, а вместо этого включать таймер, когда пользователи начнут печатать в этом поле. Затем выключите таймер, когда они перестанут печатать или фокус покинет поле со списком.

person Brad    schedule 22.06.2017

Таким образом, вы уже можете выполнять поиск с частичной строкой - возможно, с помощью запроса с подобным условием. Следующий шаг очень прост. Выполните поиск для каждого поля, объедините их с помощью UNION и удалите дубликаты с помощью SELECT DISTINCT. Надеюсь, этого краткого ответа будет достаточно?

person y4cine    schedule 22.06.2017