データベースに「検索」フォームがあり、文字列を取り込んで配列に分解し、選択した結合タイプ(「Or」、「And」、または「ExactPhrase」ラジオボタン)に基づいてSQL文字列を作成します。私のコードは95%の確率で完全に機能しますが、さまざまな結合タイプを切り替えて再クエリを実行すると、データベースがハングすることがあります。SQLが正しく作成されていることを確認しました。問題は、サブフォームのロード中にサブフォームのレコードソースを変更しようとしたことが原因だと思います。
私の検索フォームが機能する正確な方法は次のとおりです。
- ユーザーが検索語/フレーズをテキストボックスに入力します
- テキストボックスの「更新後」イベントで、VBAはSQL文字列を作成し、それを非表示のテキストフィールド(「ModifiedSearchValue」と呼ばれる)に格納します。
- ユーザーが結合タイプ(オプション "Or"、 "And"、または "Exact Phrase"のラジオボタン)を変更すると、グループの "After Update"イベントがVBAサブを呼び出し(#2のように)、VBAがSQL文字列を作成します非表示のテキストフィールド(「ModifiedSearchValue」と呼ばれる)に格納されます
ユーザーが[検索]ボタンを押すと、VBAはサブフォームのRecordSourceを次の方法で「ModifiedSearchValue」の値に設定します。
Me!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を変更することでハングが発生しますが、回避策を特定できないようです。
ありとあらゆる洞察/ヘルプを事前に感謝します!