Как заставить список отображать результаты поиска на основе ввода в форме? - PullRequest
0 голосов
/ 15 апреля 2020

Я получил таблицу с именем «dbInventory» с «ID, InvName, InvQuantity, InvType» и форму ввода, соответствующую этим столбцам.

Я пытаюсь добиться того, чтобы в списке начала отображаться поиск результаты, основанные на вводе.

(столбец «Мой идентификатор» содержит штрих-коды, а не автономные номера)

Так, например, если я сканирую штрих-код для предмета, который я уже поместил в таблицу в другой раз, Я бы хотел, чтобы он сразу появился в списке.

Как бы go об этом?

1 Ответ

0 голосов
/ 15 апреля 2020

Похоже, что вы хотите иметь дело с двумя различными способами ввода - либо путем сканирования штрих-кода (который даст вам весь штрих-код), либо путем ввода пользователем штрих-кода.

Я бы предложил используя два элемента управления в тандеме - текстовое поле, в котором пользователь может либо отсканировать штрих-код, либо ввести начало штрих-кода (и удалить введенные данные), а затем список, в котором отображаются совпадения.

Вы можете использовать событие Изменить текстового поля, чтобы получить свойство .Text и использовать его в качестве основы для RowSource поля списка:

Private Sub txtSearch_Change()
    On Error GoTo E_Handle
    If Not (IsNull(Me!txtSearch.Text)) Then
        Me!lstInventory.RowSource = "SELECT ID, InvName, InvQuantity, InvType FROM dbInventory WHERE ID LIKE '" & Me!txtSearch.Text & "*' ORDER BY ID ASC;"
    Else
        Me!lstInventory.RowSource = "SELECT ID, InvName, InvQuantity, InvType FROM dbInventory ORDER BY ID ASC;"
    End If
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "frmInventory!txtSearch_Change", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

Я не уверен, сканирует ли штрих-код в текстовое поле вызовет событие OnChange - это должно произойти !!

Если вы сейчас используете 2 различных элемента управления для поиска (совпадение частей по ID и имени), тогда вам следует использовать небольшую процедуру, которая создает RowSource объекта ListBox как необходимо, а затем вызвать его из события OnChange любого текстового поля. Что-то вроде приведенного ниже кода должно помочь вам начать:

Private Sub txtSearchID_Change()
    Call sSearchForInventory(Nz(Me!txtSearchID.Text, ""), Nz(Me!txtSearchName.Value, ""))
End Sub
Private Sub txtSearchName_Change()
    Call sSearchForInventory(Nz(Me!txtSearchID.Value, ""), Nz(Me!txtSearchName.Text, ""))
End Sub
Sub sSearchForInventory(strID As String, strName As String)
    On Error GoTo E_Handle
    Dim strSQL As String
    If Len(strID) > 0 Then
        strSQL = " AND ID LIKE '" & strID & "*' "
    End If
    If Len(strName) > 0 Then
        strSQL = strSQL & " AND InvName LIKE '" & strName & "*' "
    End If
    If Left(strSQL, 4) = " AND" Then
        strSQL = "WHERE " & Mid(strSQL, 6)
    End If
    Me!lstInventory.RowSource = "SELECT ID, InvName, InvQuantity, InvType FROM dbInventory " & strSQL & " ORDER BY ID ASC;"
    Me!lstInventory.Requery
sExit:
    On Error Resume Next
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sSearchForInventory", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

Обратите внимание, что вам нужно использовать свойство .Text изменяемого элемента управления, но свойство .Value другого элемента управления.

С уважением,

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