I'm attempting to build an inventory sorting and tracking system in Access 2016 for people that are minimally computer literate, and I've been asked to narrow it down to one search bar rather than separate filters. After quite a bit of poking around, I've managed to get one working, when I went to replicate the design for another department, it's giving me a syntax error regarding the SQL statement my code is building. The format for the one that works is exactly the same, and returns the same error when run through an online validator, but works functionally in practice.
The user enters text into textbox MainSearch, which builds the search string (showing here as 1155 and so on), and filters the form results on the AfterUpdate event. Pretty sure I can manage debugging before and after, but I can't, for all the research I'm doing, figure out where my error with the SQL syntax is. I included the other function that it uses just in case it's relevant to someone that knows more than me.
Function ExecuteSearch(strCriteria As String) As Boolean
On Error Goto Err_ExecuteSearch
Dim strSQL As String
Dim strSQLWhere As String
Dim lngCount As Long
Dim rst as Recordset
strCriteria = "*" & Me.MainSearch.Text & "*"
Trim (strCriteria)
strCriteria = Replace(strCriteria, "'", "")
strSQL = "SELECT * FROM REOEM"
strSQLWhere = "ID IN (SELECT ID FROM REOEM WHERE Manufacturer LIKE 'strCriteria' OR Type LIKE 'strCriteria' OR Make LIKE 'strCriteria' OR Lester LIKE 'strCriteria' " _
& "OR OEM1 LIKE 'strCriteria' OR OEM2 LIKE 'strCriteria' OR OEM3 LIKE 'strCriteria' OR OEM4 LIKE 'strCriteria' OR OEM5 LIKE 'strCriteria' OR OEM6 LIKE 'strCriteria' OR OEM7 LIKE 'strCriteria' OR OEM8 Like 'strCriteria' OR OEM9 Like 'strCriteria' OR OEM10 LIKE 'strCriteria' " _
& "OR OEM11 LIKE 'strCriteria' OR OEM12 LIKE 'strCriteria' OR OEM13 LIKE 'strCriteria' OR OEM14 LIKE 'strCriteria' OR OEM15 LIKE 'strCriteria' OR OEM16 LIKE 'strCriteria' OR OEM17 LIKE 'strCriteria' OR OEM18 LIKE 'strCriteria' OR OEM19 LIKE 'strCriteria' OR OEM20 LIKE 'strCriteria' " _
& "OR OEM21 LIKE 'strCriteria' OR OEM22 LIKE 'strCriteria' OR OEM23 Like 'strCriteria' OR OEM24 LIKE 'strCriteria' OR OEM25 LIKE 'strCriteria' OR OEM26 LIKE 'strCriteria' OR OEM27 LIKE 'strCriteria' OR OEM28 LIKE 'strCriteria' OR OEM29 LIKE 'strCriteria' OR OEM30 LIKE 'strCriteria' " _
& "OR OEM31 LIKE 'strCriteria' OR OEM32 LIKE 'strCriteria' OR OEM33 LIKE 'strCriteria' OR OEM34 LIKE 'strCriteria' OR OEM35 LIKE 'strCriteria' OR OEM36 LIKE 'strCriteria' OR OEM37 LIKE 'strCriteria' OR OEM38 LIKE 'strCriteria' OR OEM39 LIKE 'strCriteria' OR OEM40 LIKE 'strCriteria' " _
& "OR OEM41 LIKE 'strCriteria' OR OEM42 LIKE 'strCriteria' OR OEM43 LIKE 'strCriteria' OR OEM44 LIKE 'strCriteria' OR OEM45 LIKE 'strCriteria' OR OEM46 LIKE 'strCriteria' OR OEM47 LIKE 'strCriteria' OR OEM48 LIKE 'strCriteria' OR OEM49 LIKE 'strCriteria' OR OEM50 LIKE 'strCriteria' " _
& "OR OEM51 LIKE 'strCriteria' OR OEM52 LIKE 'strCriteria' OR OEM53 LIKE 'strCriteria' OR OEM54 LIKE 'strCriteria' OR OEM55 LIKE 'strCriteria' OR OEM56 LIKE 'strCriteria' OR OEM57 LIKE 'strCriteria' OR OEM58 LIKE 'strCriteria' OR OEM59 LIKE 'strCriteria' OR OEM60 LIKE 'strCriteria' " _
& "OR OEM61 LIKE 'strCriteria' OR OEM62 LIKE 'strCriteria' OR OEM63 LIKE 'strCriteria' OR OEM64 LIKE 'strCriteria' OR OEM65 LIKE 'strCriteria' OR OEM66 LIKE 'strCriteria' OR OEM67 LIKE 'strCriteria' OR OEM68 LIKE 'strCriteria' OR OEM69 LIKE 'strCriteria' OR OEM70 LIKE 'strCriteria " _
& "OR OEM71 LIKE 'strCriteria' OR OEM72 LIKE 'strCriteria' OR OEM73 LIKE 'strCriteria' OR OEM74 LIKE 'strCriteria' OR OEM75 LIKE 'strCriteria' );"
strSQL = strSQL & " WHERE " & strSQLWhere
'Used for testing SQL String
'debug.print strSQL
lngCount = FindRecord(strSQL)
If lngCount = 0 Then
ExecuteSearch = False
Else
ExecuteSearch = True
Set rst = me.RecordsetClone
DoCmd.ApplyFilter (strSQL)
End If
Exit_ExecuteSearch:
Exit Function
Err_ExecuteSearch:
MsgBox Err.Description
ExecuteSearch = False
Resume Exit_ExecuteSearch
End Function
Function FindRecord(ByVal strSearchString As String) As Long
On Error GoTo Err_Findrecord
Dim dbSearch as DAO.Database
Dim rsSearch as DAO.Recordset
Set dbSearch = DBEngine.Workspaces(0).Databases(0)
Set rsSearch = dbSearch.OpenRecordset(strSearchString, dbOpenSnapshot)
With rsSearch
If (.BOF and .EOF) Then
FindRecord = 0
Else
.MoveLast
FindRecord = .RecordCount
End If
End With
Exit_FindRecord:
rsSearch.Close
dbSearch.Close
Exit Function
Err_FindRecord:
MsgBox Err.Description
Resume Exit_FindRecord
End Function
This is what it returns:
SELECT * FROM [REOEM] WHERE ID IN (SELECT ID FROM [REOEM] WHERE Manufacturer LIKE '*1155*' OR Type LIKE '*1155*' OR Make LIKE '*1155*' OR Lester LIKE '*1155*' OR OEM1 LIKE '*1155*' OR OEM2 LIKE '*1155*' OR OEM3 LIKE '*1155*' OR OEM4 LIKE '*1155*' OR OEM5 LIKE '*1155*' OR OEM6 LIKE '*1155*' OR OEM7 LIKE '*1155*' Or OEM8 Like '*1155*' Or OEM9 Like '*1155*'OR OEM10 LIKE '*1155*' OR OEM11 LIKE '*1155*' OR OEM12 LIKE '*1155*' OR OEM13 LIKE '*1155*' OR OEM14 LIKE '*1155*' OR OEM15 LIKE '*1155*' OR OEM16 LIKE '*1155*' OR OEM17 LIKE '*1155*' OR OEM18 LIKE '*1155*' OR OEM19 LIKE '*1155*' OR OEM20 LIKE '*1155*' OR OEM21 LIKE '*1155*' OR OEM22 LIKE '*1155*' OR OEM23 Like '*1155*' OR OEM24 LIKE '*1155*' OR OEM25 LIKE '*1155*' OR OEM26 LIKE '*1155*' OR OEM27 LIKE '*1155*' OR OEM28 LIKE '*1155*' OR OEM29 LIKE '*1155*' OR OEM30 LIKE '*1155*' OR OEM31 LIKE '*1155*' OR OEM32 LIKE '*1155*' OR OEM33 LIKE '*1155*' OR OEM34 LIKE '*1155*' OR OEM35 LIKE '*1155*' OR OEM36 LIKE '*1155*' OR OEM37 LIKE '*1155*' OR OEM38 LIKE '*1155*'
OR OEM39 LIKE '*1155*' OR OEM40 LIKE '*1155*' OR OEM41 LIKE '*1155*' OR OEM42 LIKE '*1155*' OR OEM43 LIKE '*1155*' OR OEM44 LIKE '*1155*' OR OEM45 LIKE '*1155*' OR OEM46 LIKE '*1155*' OR OEM47 LIKE '*1155*' OR OEM48 LIKE '*1155*' OR OEM49 LIKE '*1155*' OR OEM50 LIKE '*1155*' OR OEM51 LIKE '*1155*' OR OEM52 LIKE '*1155*' OR OEM53 LIKE '*1155*' OR OEM54 LIKE '*1155*' OR OEM55 LIKE '*1155*' OR OEM56 LIKE '*1155*' OR OEM57 LIKE '*1155*' OR OEM58 LIKE '*1155*' OR OEM59 LIKE '*1155*' OR OEM60 LIKE '*1155*' OR OEM61 LIKE '*1155*' OR OEM62 LIKE '*1155*' OR OEM63 LIKE '*1155*' OR OEM64 LIKE '*1155*' OR OEM65 LIKE '*1155*' OR OEM66 LIKE '*1155*' OR OEM67 LIKE '*1155*' OR OEM68 LIKE '*1155*' OR OEM69 LIKE '*1155*' OR OEM70 LIKE '*1155*' OR OEM71 LIKE '*1155*' OR OEM72 LIKE '*1155*' OR OEM73 LIKE '*1155*' OR OEM74 LIKE '*1155*' OR OEM75 LIKE '*1155*' );
Any assistance would be greatly appreciated. Be gentle, I've only been at this about a month. Most of this code is shamelessly adapted from online sources.
SELECT * FROM [REOEM] WHERE Manufacturer LIKE ...will work. Finally, very wide tables of like data such as OEM1-75 is suboptimal database design forcing complex queries. You could use one OEM field in long format with indicators 1-75 in adjacent column. And then search one column! Always remember columns are expensive but rows are cheap, no restructuring for new OEMs, OEM76-100.