Список из списка исчезнет после запуска макроса - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть простая база данных с двумя таблицами, одним запросом (для объединения таблиц) и одной формой для запроса, состоящей из текстового поля и списка (см. Рисунок ниже).

form example

Я пытаюсь использовать текстовое поле для поиска в поле списка при наборе текста (как показано в этом видео: YouTube видео)

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

broken list

Что я делаю не так?

Мой код:

Private Sub searchBox_Change()

    Dim strSource As String
    strSource = "SELECT  Paraiškos ID, Veikliosios m pavadinimas, Sugalvotas VP pavadinimas" & _
     "FROM Oldsys_Main" & _
     "Where Paraiškos ID Like '*" & Me.searchBox.Text & "*' " _
     & "Or Veikliosios m pavadinimas Like '*" & Me.searchBox.Text & "*' " _
     & "Or Sugalvotas VP pavadinimas Like '*" & Me.searchBox.Text & "*' "

    Me.oldListBox.RowSource = strSource
End Sub

Еще один (пока не существенный) вопрос: почему результаты 5-го столбца являются числами? Это должен быть текст, потому что 5 столбец связан с другой таблицей, возможно ли сделать так, чтобы он показывал текст вместо идентификатора?

1 Ответ

3 голосов
/ 23 апреля 2019

Это недопустимый синтаксис SQL. Идентификаторы (например, для имен столбцов) не могут содержать пробелы или специальные символы, кроме _. Если они есть, вы должны заключить имя в квадратные скобки.

Также пропущен пробел перед FROM и между Oldsys_Main и WHERE, потому что разрывы строк находятся внутри самого кода VBA, но не внутри созданной строки. Если вы хотите добавить разрывы строк в строке, вы можете сделать это с помощью "first line" & vbCrLf & "second line". Но SQL отлично работает в одной строке.

Dim strSource As String, strSearch As String

strSearch = Replace(searchBox.Text, "'", "''")
strSource = "SELECT [Paraiškos ID], [Veikliosios m pavadinimas], [Sugalvotas VP pavadinimas] " _
 & "FROM Oldsys_Main " _
 & "WHERE [Paraiškos ID] LIKE '*" & strSearch & "*' " _
 & "Or [Veikliosios m pavadinimas] LIKE '*" & strSearch & "*' " _
 & "Or [Sugalvotas VP pavadinimas] LIKE '*" & strSearch & "*' "

Также замените одинарные кавычки в тексте поиска двумя одинарными кавычками, чтобы избежать их. Текст типа Let's go становится 'Let''s go'.


Вы можете проверить SQL следующим образом:

  • Откройте окно Immediate с помощью Ctrl-G .
  • Скопируйте, вставьте в него код и измените его следующим образом (начните с "?", Что эквивалентно Debug.Print, замените переменную strSearch реальной текстовой строкой (например, "est"). Затем нажмите ввод

    ? "SELECT [Paraiškos ID], [Veikliosios m pavadinimas], [Sugalvotas VP pavadinimas]" _
    & "ОТ Oldsys_Main" _
    & "WHERE [Paraiškos ID] LIKE '*" & "est" & "*'" _
    & "Или [Veikliosios m pavadinimas] LIKE '*" & "est" & "*'" _
    & "Или [Sugalvotas VP pavadinimas] LIKE '*" & "est" & "*'"

    Результат будет напечатан так (в одну строку):

    SELECT [Paraiškos ID], [Veikliosios m pavadinimas], [Sugalvotas VP pavadinimas] ИЗ Oldsys_Main ГДЕ [Paraiškos ID] КАК '* est *' Или [Veikliosios m pavadinimas] LIKE '* est *ot vasvavas Suváv Or [Sugal ] НРАВИТСЯ '* est *'

  • Скопируйте этот результат в буфер обмена и создайте новый запрос в режиме конструктора. Переключитесь в представление SQL и вставьте в него результат.

  • Теперь выполните запрос. Вы увидите, работает ли он, или вы получите сообщение об ошибке. Также становятся очевидными синтаксические ошибки, такие как пропущенные пробелы.

...