Усечение конечных пробелов в Access для поиска по типу - PullRequest
0 голосов
/ 19 октября 2018

Я создаю динамический поиск по типу, который фильтрует список данных по типу пользователя в текстовом поле.

Private Sub TxtSearch_Change()
Dim CursorPosition As Long
Dim strSearch As String
Dim sqlSearch As String

CursorPosition = TxtSearch.SelStart

Me.Dirty = False 'set the dirty property to false to save the current value
strSearch = ""
If Not IsNull(Me.TxtSearch.Value) Then
    strSearch = Me.TxtSearch.Value
End If

searchLength = Len(strSearch)
If searchLength < CursorPosition Then
    For i = 1 To (CursorPosition- searchLength)
        strSearch = strSearch + " "
    Next
End If

'Check if a keyword has been entered or not
If strSearch = "" Then
    Me.TxtSearch.SetFocus
    sqlShowAll = "SELECT * FROM qrySearch"
    Forms![frmSearch]!fsubTest.Form.RecordSource = sqlShowAll
Else
    sqlSelect = "SELECT * FROM qrySearch WHERE ("
    sqlLastName = "(LastName Like ""*" & strSearch & "*"")"
    sqlFirstName = " OR (FirstName Like ""*" & strSearch & "*"")"
    sqlFullName = " OR (FullName Like ""*" & strSearch & "*"")"
    sqlEnd = ")"
    sqlAllNames = sqlLastName & sqlFirstName & sqlFullName
    sqlSearch = sqlSelect & sqlAllNames & sqlEnd
   Forms![frmSearch]!fsubTest.Form.RecordSource = sqlSearch

End If

TxtSearch.SelStart = CursorPosition

End Sub

Доступ обрезает конечные пробелы в текстовых полях.Есть ли способ обойти это?Я уже реализовал цикл for, чтобы восстановить конечное пространство для целей поиска, но я хотел бы сохранить конечное пространство, чтобы, пока пользователь продолжает ввод, пространство не исчезало.Например, я мог ввести «Джейн» и искать «Джейн», но когда я вернулся в текстовое поле, я увидел «Джейн», поэтому я никогда не мог печатать «Джейн Доу», а только «Джейн Доу».

1 Ответ

0 голосов
/ 19 октября 2018

Вот код, который я использую, чтобы выполнить то, что вы ищете.У меня есть окно поиска «Searchfor», где я печатаю, и «SearchResults» в виде комбинированного списка с данными.Также есть текстовое поле «SrchText», которое используется запросом «QRY_SearchAll».Этот запрос представляет собой серию «Like» »& [Forms]! [FRM_SearchMulti]! [SrchText] &""" для каждого поля, которое я хочу отобразить в поле со списком, см. Рисунок.QrySearchall image

Private Sub SearchFor_Change()
'Create a string (text) variable
    Dim vSearchString As String

'Populate the string variable with the text entered in the Text Box SearchFor
    vSearchString = SearchFor.Text

'Pass the value contained in the string variable to the hidden text box SrchText,
'that is used as the sear4ch criteria for the Query QRY_SearchAll
    SrchText = vSearchString

'Requery the List Box to show the latest results for the text entered in Text Box SearchFor
    Me.SearchResults.Requery


'Tests for a trailing space and exits the sub routine at this point
'so as to preserve the trailing space, which would be lost if focus was shifted from Text Box SearchFor
    If Len(Me.SrchText) <> 0 And InStr(Len(SrchText), SrchText, " ", vbTextCompare) Then
        'Set the focus on the first item in the list box
            Me.SearchResults = Me.SearchResults.ItemData(1)
            Me.SearchResults.SetFocus
        'Requery the form to refresh the content of any unbound text box that might be feeding off the record source of  the List Box
            DoCmd.Requery
        'Returns the cursor to the the end of the text in Text Box SearchFor,
        'and restores trailing space lost when focus is shifted to the list box
            Me.SearchFor = vSearchString
            Me.SearchFor.SetFocus
            Me.SearchFor.SelStart = Me.SearchFor.SelLength

        Exit Sub
    End If

'Set the focus on the first item in the list box
    Me.SearchResults = Me.SearchResults.ItemData(1)
    Me.SearchResults.SetFocus

'Requery the form to refresh the content of any unbound text box that might be feeding off the record source of  the List Box
    DoCmd.Requery

'Returns the cursor to the the end of the text in Text Box SearchFor
    Me.SearchFor.SetFocus

    If Not IsNull(Len(Me.SearchFor)) Then
        Me.SearchFor.SelStart = Len(Me.SearchFor)
    End If
End Sub

Одно предупреждение об этой системе: вместо обновления используется запрос.Это хорошо для разумного количества записей в достаточно быстрой системе.Я обнаружил, что когда я пытаюсь использовать этот же код для данных на древнем сервере Sharepoint, я получаю задержку в 10 секунд после каждой вводимой буквы.Поэтому, если вы имеете дело с большим количеством записей или с медленным сервером, вы можете изменить «требуемый» на «обновить».

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