Найдите ключевые слова в поле «Заметки» и отфильтруйте список имен по результатам. - PullRequest
1 голос
/ 03 мая 2019

У меня есть текстовое поле (txtSearch) с событием On Change, которое должно отфильтровать список имен на основе ключевых слов, которые подпрограмма находит в поле таблицы Notes. Однако, когда я ввожу текст в txtSearch, список (lstCustomers) не просто отфильтровывает результаты, он полностью стирает их, и я получаю ошибку (Invalid use of Null).

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

enter image description here

Вот несколько быстрых подробностей процедуры:

  • Когда пользователь вводит текст в txtSearch, он запускает маршрутизацию KeyWhere для создания оператора SQL, который список использует для фильтрации имен.
  • Отладка KeyWhere() в окне Immediate возвращает правильный оператор ( См. Изображение ниже )
    KeyWhere Results
  • Run-time error `94`: Invalid use of Null происходит в строке strWhere = KeyWhere(Me.txtSearch, "Notes")
  • Поле «Примечания» в таблице - «Длинный текст»

Вот процедура:

Public Function KeyWhere(strKeys As String, strColumn As String) As String

  Dim b    As Variant
  strKeys = Replace(strKeys, vbCrLf, ",") ' remove all line returns

  b = Split(strKeys, ",")
  Dim strWhere   As String
  Dim v    As Variant
  For Each v In b
     If Trim(v) <> "" Then
        If strWhere <> "" Then strWhere = strWhere & " or "
        strWhere = strWhere & strColumn & " like '*" & Trim(v) & "*'"
     End If
  Next
  strWhere = "(" & strWhere & ")"
  KeyWhere = strWhere

End Function

А вот процедура _Change():

Private Sub txtSearch_Change()
    Dim strWhere As String
    Dim SQL As String

    SQL = "SELECT qrySearchDatabase.Notes FROM qrySearchDatabase WHERE 1=1"
    strWhere = KeyWhere(Me.txtSearch.Text, "Notes")
    SQL = SQL & " AND " & strWhere
    Debug.Print SQL

    Me.lstCustomers.RowSource = SQL
    Me.lstCustomers.Requery

End Sub

У меня такое ощущение, что мой запрос (qrySearchDatabase) как-то шаткий, но я не совсем уверен, где. Вот SQL для моего запроса:

SELECT tblContacts.ID, tblContacts.Notes, [Last Name] & ", " & [First Name] AS [File As]
FROM tblContacts
WHERE (((tblContacts.Notes) Is Not Null));

РЕДАКТИРОВАТЬ: Обновлен код на основе ответа ниже .
РЕДАКТИРОВАТЬ 2: Добавлено изображение ниже, чтобы показать испорченные столбцы после Change()

Weird columns

1 Ответ

2 голосов
/ 03 мая 2019

В событии _Change свойство текстового поля .Value еще не установлено.

strWhere = KeyWhere(Me.txtSearch, "Notes")

Me.txtSearch (косвенно) использует Me.txtSearch.Value

In_Change событие, вы должны вместо этого использовать свойство .Text.

strWhere = KeyWhere(Me.txtSearch.Text, "Notes")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...