Access зависает на источнике записей Subform, установленном на SQL из VBA
У меня есть форма "Поиск" в моей базе данных, которая принимает строку, разбивает ее на массив и создает строку SQL на основе выбранного типа соединения (переключатели "Или", "И" или "Точная фраза"). Мой код работает отлично в 95% случаев, но время от времени база данных зависает, когда я переключаюсь между различными типами соединений и запросами. Я подтвердил, что SQL создается правильно, и я думаю, что проблема связана с попыткой изменить источник записей подчиненной формы, пока она все еще загружается.
Точный способ работы моей формы поиска заключается в следующем:
- Пользователь помещает поисковый термин / фразу в текстовое поле
- В событии "После обновления" текстового поля 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 подчиненной формы до того, как она закончила загрузку из предыдущего поиска, но я не могу определить какой-либо обходной путь.
Заранее спасибо за все и понимание / помощь!
1 ответ
Согласно предложениям Оливье, истинная причина проблемы была вызвана VBA как часть запроса [qry_General:FullName_FMLD]
; переключение на [qry_General:FullName_FML]
(который не называет VBA) устранил все проблемы. Я предполагаю, что корень проблемы был в том, что форма пыталась применить фильтр до того, как запрос вернул результат, создав тем самым поврежденную строку фильтра.
Вот обновленный код, использующий метод фильтра и заменяющий все челки точками:
Private Sub Search_Click()
On Error GoTo Err_Search_Click
Dim SearchString, SearchStringTitle, SearchStringName, SearchStringDescription, SearchStringInvestigator, JoinValue, j, SQLString As String, SearchArray, varValue As Variant
Me.Results.Form.FilterOn = True
SearchString = Trim(Me.SearchValue)
If Not IsNull(SearchString) Then
SearchArray = Split(SearchString, " ")
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_FML].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_FML].FullName) Like ""*" & SearchString & "*""))"
SearchStringDescription = "(((tbl_Studies.Study_Description) Like ""*" & SearchString & "*""))"
SearchString = SearchStringTitle & " OR " & SearchStringName & " OR " & SearchStringDescription & " OR " & SearchStringInvestigator
End If
Me.Results.Form.Filter = SearchString
End If
Exit_Search_Click:
Exit Sub
Err_Search_Click:
MsgBox ("There are no active records to review.")
Resume Exit_Search_Click
End Sub
Опять же, заслуга в этом решении принадлежит Оливье Жако-Дескомбу - спасибо за вашу помощь и предложения!