splats
Technical User
- Jan 2, 2003
- 131
Hello
I have a complicated search that is not returning the correct records that I would like.
#1 I have an unbound textbox [txtSearchFor] that checks many fields to see if the data is in there. There is an option group [fraUsing] here as well that determines the combination of the words that are input in the textbox being as follows, (Any of the words entered, All or Exact Phrase)
#2 As well, I have 3 other fields that are unbound as well that return records that are not able to be looked up within the primary search because they are lookup fields. [ComboName], [ComboFrom], [ComboTo].
I would like the combined searches to work together so that if there is a word within the primary search, that it filters the secondary search and vice versa.
Below is my code, presently the combined searches both work but do not work interactively. e.g. records are returned for both searches but are not restricted to the records that meet both criteria.
Thank you
Private Sub cmdSearch_Click()
Dim arrSearch() As String
Dim i As Integer
Dim strWhere As String
Dim strTemp As String
Dim arrStreets() As String
Dim strStreets As String
Dim lngRcnt As Long
Dim ValName As Long
Dim ValFrom As Long
Dim ValTo As Long
Dim ISTHERETEXT As Boolean
Dim temp1 As String
Dim temp2 As String
Dim temp3 As String
Dim Bool As String
Dim Db As DAO.Database
Dim rs As DAO.Recordset
Dim strFilter As String
strFilter = ""
'Values from the Combo Box
'Needed to add a correction factor of one
ValName = Me.ComboName.ListIndex + 1
ValFrom = Me.ComboFrom.ListIndex + 1
ValTo = Me.ComboTo.ListIndex + 1
' If no option is selected in one of the StreeName, StreetFrom, StreetTo
' drop down menus, the value is changed to 999999 in order to make the
' search not match any fields.
If ValName = 0 Then
ValName = 999999
End If
If ValFrom = 0 Then
ValFrom = 999999
End If
If ValTo = 0 Then
ValTo = 999999
End If
'Search based on text entry and drop down menus
If txtSearchFor <> "" Then
If fraUsing = 1 Then ' any
arrSearch() = Split(txtSearchFor, " ", -1, 1)
For i = 0 To UBound(arrSearch)
If i = 0 Then
strWhere = strWhere & " ("
Else
strWhere = strWhere & " AND "
End If
strtemp1 = Trim(arrSearch(i))
strWhere = strWhere & "([PlanNo] LIKE '*" & strtemp1 & "*' )" & " OR ([PlanDescription] LIKE '*" & strtemp1 & "*')" & " OR ([DeveloperName] LIKE '*" & strtemp1 & "*')" & " OR ([Full Address] LIKE '*" & strtemp1 & "*')" & " OR ([SheetNo] LIKE '*" & strtemp1 & "*')" & " OR (ConsultantName LIKE '*" & strtemp1 & "*')" & " OR (ContractNo LIKE '*" & strtemp1 & "*')" & " OR (ConsultantPlanNo LIKE '*" & strtemp1 & "*')" & " OR (SheetDescription LIKE '*" & strtemp1 & "*')" & " OR (TypeID LIKE '*" & strtemp1 & "*')" & " OR " & " (StreetNameID = " & ValName & ") AND (StreetFromID = " & ValFrom & ") AND (StreetToID = " & ValTo & ")"
Next
ElseIf fraUsing = 2 Then ' all
arrSearch = Split(txtSearchFor, " ", -1, 1)
Set Db = CurrentDb
Set rs = Db.OpenRecordset("SELECT StreetNameId, StreetFromID, StreetToID FROM tblsheetstreetdetails WHERE StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & " ")
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
strFilter = rs.Filter
For i = 0 To UBound(arrSearch)
If i = 0 Then
strWhere = strWhere & " ("
Else
strWhere = strWhere & " AND "
End If
strtemp1 = Trim(arrSearch(i))
strWhere = strWhere & "(([PlanNo] LIKE '*" & strtemp1 & "*' )" & " OR ([PlanDescription] LIKE '*" & strtemp1 & "*')" & " OR ([DeveloperName] LIKE '*" & strtemp1 & "*')" & " OR ([Full Address] LIKE '*" & strtemp1 & "*')" & " OR ([SheetNo] LIKE '*" & strtemp1 & "*')" & " OR (ConsultantName LIKE '*" & strtemp1 & "*')" & " OR (ContractNo LIKE '*" & strtemp1 & "*')" & " OR (ConsultantPlanNo LIKE '*" & strtemp1 & "*')" & " OR (SheetDescription LIKE '*" & strtemp1 & "*')" & " OR (TypeID LIKE '*" & strtemp1 & "*'))"
Next
Else 'exact
Set Db = CurrentDb
Set rs = Db.OpenRecordset("SELECT StreetNameId, StreetFromID, StreetToID FROM tblsheetstreetdetails WHERE StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & " ")
If (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo = 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValTo & " OR StreetToID = " & ValFrom & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
'case # = 1
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo = 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo = 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom = 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
'case # = 3
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
End If
strFilter = rs.Filter
strWhere = strWhere & " ("
strWhere = strWhere & "([PlanNo] LIKE '*" & Trim(txtSearchFor) & "*' )" & " OR ([PlanDescription] LIKE '*" & Trim(txtSearchFor) & "*')" & " OR ([DeveloperName] LIKE '*" & strtemp1 & "*')" & " OR ([Full Address] LIKE '*" & Trim(txtSearchFor) & "*')" & " OR ([SheetNo] LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (ConsultantName LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (ContractNo LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (ConsultantPlanNo LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (SheetDescription LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (TypeID LIKE '*" & Trim(txtSearchFor) & "*')"
End If
strWhere = strWhere & ") "
If (fraUsing = 1) Then
strWhere = strWhere
ElseIf ((fraUsing = 2 Or fraUsing = 3) And (ValName = 999999 And ValFrom = 999999 And ValTo = 999999)) Then
strWhere = strWhere
Else
strWhere = strWhere & " AND " & strFilter
End If
[frm-subdata1].Form.Filter = strWhere
[frm-subdata1].Form.FilterOn = True
Else
' No text in search box, Search is only dependant on the drop down menus
strTemp = ValName & " " & ValFrom & " " & ValTo
arrStreets = Split(strTemp, " ", -1, 1)
'case # = 2
If (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo = 999999) Then
strStreets = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValTo & " OR StreetToID = " & ValFrom & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
'case # = 1
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo = 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo = 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom = 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
'case # = 3
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
End If
If (fraUsing = 2 Or fraUsing = 1) Then
For j = 0 To UBound(arrStreets)
If j = 0 Then
strStreets = strStreets & " ("
Else
strStreets = strStreets & " OR "
End If
'Filter out the streets chosen from the drop-down boxes
'Can filter on one or all of the drop-down boxes so need to check all of them
'**********************************************
If j = 0 Then
'transfer into a variable because form.filter will not handle an array
temp1 = arrStreets(j)
strStreets = strStreets & " (StreetNameID = " & temp1 & ")"
ElseIf j = 1 Then
temp2 = arrStreets(j)
strStreets = strStreets & " (StreetFromID = " & temp2 & ")"
ElseIf j = 2 Then
temp3 = arrStreets(j)
strStreets = strStreets & " (StreetToID = " & temp3 & ")"
strStreets = strStreets & " )"
End If
Next
'**********************************************
End If
[frm-subdata1].Form.Filter = strStreets
[frm-subdata1].Form.FilterOn = True
End If
' If nothing is entered in the txtbox or any of the dropdown menus then
' All the records will show.
If txtSearchFor <> "" Then
ISTHERETEXT = True
End If
If (ValName = 999999) Then
If (ValFrom = 999999) Then
If (ValTo = 999999) Then
If Not ISTHERETEXT Then
[frm-subdata1].Form.FilterOn = False
End If
End If
End If
End If
End Sub
I have a complicated search that is not returning the correct records that I would like.
#1 I have an unbound textbox [txtSearchFor] that checks many fields to see if the data is in there. There is an option group [fraUsing] here as well that determines the combination of the words that are input in the textbox being as follows, (Any of the words entered, All or Exact Phrase)
#2 As well, I have 3 other fields that are unbound as well that return records that are not able to be looked up within the primary search because they are lookup fields. [ComboName], [ComboFrom], [ComboTo].
I would like the combined searches to work together so that if there is a word within the primary search, that it filters the secondary search and vice versa.
Below is my code, presently the combined searches both work but do not work interactively. e.g. records are returned for both searches but are not restricted to the records that meet both criteria.
Thank you
Private Sub cmdSearch_Click()
Dim arrSearch() As String
Dim i As Integer
Dim strWhere As String
Dim strTemp As String
Dim arrStreets() As String
Dim strStreets As String
Dim lngRcnt As Long
Dim ValName As Long
Dim ValFrom As Long
Dim ValTo As Long
Dim ISTHERETEXT As Boolean
Dim temp1 As String
Dim temp2 As String
Dim temp3 As String
Dim Bool As String
Dim Db As DAO.Database
Dim rs As DAO.Recordset
Dim strFilter As String
strFilter = ""
'Values from the Combo Box
'Needed to add a correction factor of one
ValName = Me.ComboName.ListIndex + 1
ValFrom = Me.ComboFrom.ListIndex + 1
ValTo = Me.ComboTo.ListIndex + 1
' If no option is selected in one of the StreeName, StreetFrom, StreetTo
' drop down menus, the value is changed to 999999 in order to make the
' search not match any fields.
If ValName = 0 Then
ValName = 999999
End If
If ValFrom = 0 Then
ValFrom = 999999
End If
If ValTo = 0 Then
ValTo = 999999
End If
'Search based on text entry and drop down menus
If txtSearchFor <> "" Then
If fraUsing = 1 Then ' any
arrSearch() = Split(txtSearchFor, " ", -1, 1)
For i = 0 To UBound(arrSearch)
If i = 0 Then
strWhere = strWhere & " ("
Else
strWhere = strWhere & " AND "
End If
strtemp1 = Trim(arrSearch(i))
strWhere = strWhere & "([PlanNo] LIKE '*" & strtemp1 & "*' )" & " OR ([PlanDescription] LIKE '*" & strtemp1 & "*')" & " OR ([DeveloperName] LIKE '*" & strtemp1 & "*')" & " OR ([Full Address] LIKE '*" & strtemp1 & "*')" & " OR ([SheetNo] LIKE '*" & strtemp1 & "*')" & " OR (ConsultantName LIKE '*" & strtemp1 & "*')" & " OR (ContractNo LIKE '*" & strtemp1 & "*')" & " OR (ConsultantPlanNo LIKE '*" & strtemp1 & "*')" & " OR (SheetDescription LIKE '*" & strtemp1 & "*')" & " OR (TypeID LIKE '*" & strtemp1 & "*')" & " OR " & " (StreetNameID = " & ValName & ") AND (StreetFromID = " & ValFrom & ") AND (StreetToID = " & ValTo & ")"
Next
ElseIf fraUsing = 2 Then ' all
arrSearch = Split(txtSearchFor, " ", -1, 1)
Set Db = CurrentDb
Set rs = Db.OpenRecordset("SELECT StreetNameId, StreetFromID, StreetToID FROM tblsheetstreetdetails WHERE StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & " ")
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
strFilter = rs.Filter
For i = 0 To UBound(arrSearch)
If i = 0 Then
strWhere = strWhere & " ("
Else
strWhere = strWhere & " AND "
End If
strtemp1 = Trim(arrSearch(i))
strWhere = strWhere & "(([PlanNo] LIKE '*" & strtemp1 & "*' )" & " OR ([PlanDescription] LIKE '*" & strtemp1 & "*')" & " OR ([DeveloperName] LIKE '*" & strtemp1 & "*')" & " OR ([Full Address] LIKE '*" & strtemp1 & "*')" & " OR ([SheetNo] LIKE '*" & strtemp1 & "*')" & " OR (ConsultantName LIKE '*" & strtemp1 & "*')" & " OR (ContractNo LIKE '*" & strtemp1 & "*')" & " OR (ConsultantPlanNo LIKE '*" & strtemp1 & "*')" & " OR (SheetDescription LIKE '*" & strtemp1 & "*')" & " OR (TypeID LIKE '*" & strtemp1 & "*'))"
Next
Else 'exact
Set Db = CurrentDb
Set rs = Db.OpenRecordset("SELECT StreetNameId, StreetFromID, StreetToID FROM tblsheetstreetdetails WHERE StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & " ")
If (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo = 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValTo & " OR StreetToID = " & ValFrom & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
'case # = 1
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo = 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo = 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom = 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
'case # = 3
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
rs.Filter = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
End If
strFilter = rs.Filter
strWhere = strWhere & " ("
strWhere = strWhere & "([PlanNo] LIKE '*" & Trim(txtSearchFor) & "*' )" & " OR ([PlanDescription] LIKE '*" & Trim(txtSearchFor) & "*')" & " OR ([DeveloperName] LIKE '*" & strtemp1 & "*')" & " OR ([Full Address] LIKE '*" & Trim(txtSearchFor) & "*')" & " OR ([SheetNo] LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (ConsultantName LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (ContractNo LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (ConsultantPlanNo LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (SheetDescription LIKE '*" & Trim(txtSearchFor) & "*')" & " OR (TypeID LIKE '*" & Trim(txtSearchFor) & "*')"
End If
strWhere = strWhere & ") "
If (fraUsing = 1) Then
strWhere = strWhere
ElseIf ((fraUsing = 2 Or fraUsing = 3) And (ValName = 999999 And ValFrom = 999999 And ValTo = 999999)) Then
strWhere = strWhere
Else
strWhere = strWhere & " AND " & strFilter
End If
[frm-subdata1].Form.Filter = strWhere
[frm-subdata1].Form.FilterOn = True
Else
' No text in search box, Search is only dependant on the drop down menus
strTemp = ValName & " " & ValFrom & " " & ValTo
arrStreets = Split(strTemp, " ", -1, 1)
'case # = 2
If (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo = 999999) Then
strStreets = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValTo & " OR StreetToID = " & ValFrom & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
'case # = 1
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom = 999999 And ValTo = 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom <> 999999 And ValTo = 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
ElseIf (fraUsing = 3 And ValName = 999999 And ValFrom = 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " OR StreetFromID = " & ValFrom & " OR StreetToID = " & ValTo & ")"
'case # = 3
ElseIf (fraUsing = 3 And ValName <> 999999 And ValFrom <> 999999 And ValTo <> 999999) Then
strStreets = "(StreetNameID = " & ValName & " AND StreetFromID = " & ValFrom & " AND StreetToID = " & ValTo & ")"
End If
If (fraUsing = 2 Or fraUsing = 1) Then
For j = 0 To UBound(arrStreets)
If j = 0 Then
strStreets = strStreets & " ("
Else
strStreets = strStreets & " OR "
End If
'Filter out the streets chosen from the drop-down boxes
'Can filter on one or all of the drop-down boxes so need to check all of them
'**********************************************
If j = 0 Then
'transfer into a variable because form.filter will not handle an array
temp1 = arrStreets(j)
strStreets = strStreets & " (StreetNameID = " & temp1 & ")"
ElseIf j = 1 Then
temp2 = arrStreets(j)
strStreets = strStreets & " (StreetFromID = " & temp2 & ")"
ElseIf j = 2 Then
temp3 = arrStreets(j)
strStreets = strStreets & " (StreetToID = " & temp3 & ")"
strStreets = strStreets & " )"
End If
Next
'**********************************************
End If
[frm-subdata1].Form.Filter = strStreets
[frm-subdata1].Form.FilterOn = True
End If
' If nothing is entered in the txtbox or any of the dropdown menus then
' All the records will show.
If txtSearchFor <> "" Then
ISTHERETEXT = True
End If
If (ValName = 999999) Then
If (ValFrom = 999999) Then
If (ValTo = 999999) Then
If Not ISTHERETEXT Then
[frm-subdata1].Form.FilterOn = False
End If
End If
End If
End If
End Sub