У меня есть форма «Поиск» в моей базе данных, которая принимает строку, разбивает ее на массив и строит строку SQL на основе выбранного типа соединения (переключатели «Или», «И» или «Точная фраза»). Мой код отлично работает 95% времени, но каждый раз, когда база данных зависает, когда я переключаюсь между различными типами соединения и запросами. Я подтвердил, что SQL создается правильно, и я думаю, что проблема связана с попыткой изменить источник записей подчиненной формы, пока она все еще загружается.
Моя поисковая форма работает следующим образом:
- Пользователь помещает поисковый запрос / фразу в текстовое поле.
- При событии «After Update» текстового поля VBA создает строку SQL и сохраняет ее в скрытом текстовом поле (получившем название «ModifiedSearchValue»).
- Если пользователь изменяет тип соединения (радиокнопки с опциями «Или», «И» или «Точная фраза»), событие «После обновления» в группе вызывает подпрограмму VBA (как в № 2), и VBA создает строку SQL. который хранится в скрытом текстовом поле (получившем название "ModifiedSearchValue")
Когда пользователь нажимает кнопку «Поиск», VBA устанавливает для RecordSource подчиненной формы значение «ModifiedSearchValue» следующим образом:
Я! Results.Form.RecordSource = Me.ModifiedSearchValue
Опять же, это работает отлично большую часть времени, но если вы введете поисковый запрос, нажмите «Поиск», затем измените тип соединения и снова нажмите «Поиск», это приведет к зависанию базы данных примерно в 5% случаев.
Мой основной код VBA выглядит следующим образом
Private Sub SearchString()
Dim SearchString, SearchStringTitle, SearchStringName, SearchStringDescription, SearchStringInvestigator, JoinValue, j, SQLString As String, SearchArray, varValue As Variant
SearchString = Trim(Me.SearchValue)
If Not IsNull(SearchString) Then
SearchArray = Split(SearchString, " ")
SQLString = "SELECT tbl_Studies.StudyID, tbl_Studies.Study_Short_Title, tbl_Studies.Study_Name, tbl_Studies.Study_Description, [qry_General:FullName_FMLD].FullName AS Investigator, tbl_Studies.Project_Type, IIf([Project_Type]=1,[tbl_Studies:Status]![Status],[tbl_Studies:NR_Status]![NR_Status]) AS Overall_Status, tbl_Studies.Date_Submitted, tbl_Studies.Date_Updated, tbl_Studies.Results_Summary, tbl_Studies.Inactive " & _
"FROM ([tbl_Studies:NR_Status] RIGHT JOIN ([tbl_Studies:Status] RIGHT JOIN tbl_Studies ON [tbl_Studies:Status].StatusID = tbl_Studies.Status) ON [tbl_Studies:NR_Status].NR_StatusID = tbl_Studies.NR_Status) LEFT JOIN [qry_General:FullName_FMLD] ON tbl_Studies.Investigator = [qry_General:FullName_FMLD].PersonID " & _
"WHERE "
If Me.Join_Type <> 3 Then
If Me.Join_Type = 1 Then
JoinValue = "OR"
ElseIf Me.Join_Type = 2 Then
JoinValue = "AND"
Else
JoinValue = " "
End If
'--
SearchStringTitle = "(("
For Each varValue In SearchArray
j = Trim(varValue)
SearchStringTitle = SearchStringTitle & "(tbl_Studies.Study_Short_Title) Like ""*" & j & "*"""
If varValue <> SearchArray(UBound(SearchArray)) Then
SearchStringTitle = SearchStringTitle & " " & JoinValue & " "
End If
Next varValue
SearchStringTitle = SearchStringTitle & "))"
'--
SearchStringName = "(("
For Each varValue In SearchArray
j = Trim(varValue)
SearchStringName = SearchStringName & "(tbl_Studies.Study_Name) Like ""*" & j & "*"""
If varValue <> SearchArray(UBound(SearchArray)) Then
SearchStringName = SearchStringName & " " & JoinValue & " "
End If
Next varValue
SearchStringName = SearchStringName & "))"
'--
SearchStringDescription = "(("
For Each varValue In SearchArray
j = Trim(varValue)
SearchStringDescription = SearchStringDescription & "(tbl_Studies.Study_Description) Like ""*" & j & "*"""
If varValue <> SearchArray(UBound(SearchArray)) Then
SearchStringDescription = SearchStringDescription & " " & JoinValue & " "
End If
Next varValue
SearchStringDescription = SearchStringDescription & "))"
'--
SearchStringInvestigator = "(("
For Each varValue In SearchArray
j = Trim(varValue)
SearchStringInvestigator = SearchStringInvestigator & "([qry_General:FullName_FMLD].FullName) Like ""*" & j & "*"""
If varValue <> SearchArray(UBound(SearchArray)) Then
SearchStringInvestigator = SearchStringInvestigator & " " & JoinValue & " "
End If
Next varValue
SearchStringInvestigator = SearchStringInvestigator & "))"
SearchString = SearchStringTitle & " OR " & SearchStringName & " OR " & SearchStringDescription & " OR " & SearchStringInvestigator
Else
SearchStringTitle = "(((tbl_Studies.Study_Short_Title) Like ""*" & SearchString & "*""))"
SearchStringName = "(((tbl_Studies.Study_Name) Like ""*" & SearchString & "*""))"
SearchStringInvestigator = "((([qry_General:FullName_FMLD].FullName) Like ""*" & SearchString & "*""))"
SearchStringDescription = "(((tbl_Studies.Study_Description) Like ""*" & SearchString & "*""))"
SearchString = SearchStringTitle & " OR " & SearchStringName & " OR " & SearchStringDescription & " OR " & SearchStringInvestigator
End If
SearchString = SQLString & SearchString & ";"
Me.ModifiedSearchValue.Value = SearchString
End If
End Sub
Опять же, моя теория заключается в том, что зависание вызвано изменением RecordSource подчиненной формы до того, как она завершила загрузку из предыдущего поиска, но я не могу определить какой-либо обходной путь.
Заранее благодарим за любую информацию / помощь!
[tbl_Studies:Status]![Status]
? Является ли tbl_Studies: Status именем таблицы? Если да, то почему вы используете челку (!) Вместо точки (.)? Поместите построенный запрос (SQLString
) в пустой запрос и выполните его, чтобы проверить, работает ли он. Поместите точку останова в последнюю строку, затем введите? SQLString в непосредственном окне, чтобы получить SQL. - person Olivier Jacot-Descombes   schedule 27.10.2012Sub
илиFunction
в форме. Или, что еще лучше, создайте строку поиска только тогда, когда пользователь нажимает Search. Тогда больше не будет необходимости хранить ее постоянно. - person Olivier Jacot-Descombes   schedule 29.10.2012Filter
иFilterOn
. ГдеFilter
будет соответствовать вашему предложению Where без словаWhere
, аFilterOn
будет либоTrue
, либоFalse
. (Таким образом, вы даже можете сохранить частьSELECT FROM
как запрос Access, что упростит ее редактирование и понимание.) - person Olivier Jacot-Descombes   schedule 30.10.2012qry_General:FullName_FMLD
)? Вы вызываете некоторые функции VBA вqry_General:FullName_FMLD
? - person Olivier Jacot-Descombes   schedule 31.10.2012qry_General:FullName_FMLD
, чтобы я мог связать имя человека с его соответствующими степенями. Как только я переключился на запросqry_General:FullName_FML
(который не включает степень и, следовательно, VBA), проблема была решена. Теперь я могу нажимать «Поиск» столько раз, сколько мне нужно, без сбоя базы данных. Я предполагаю, что корень проблемы был в том, что форма пыталась применить фильтр до того, как запрос вернул результат, тем самым создав поврежденную строку фильтра. Еще раз спасибо! - person coffejor   schedule 01.11.2012