Question

I have a form Main with a subform Issue on it. To implement search functionality on Main so that users can search for records in Issue that have a given substring, Main has a text box keyword and a submit button SubmitBtn. Here is the VBA code I am using to try to make this work:

Private Sub SubmitBtn_Click()   
 Dim keyword As String
 Dim recordSourceSql As String

 keyword = Nz(Me.keyword.value)
 recordSourceSql = "select * from [Issue] where [Details] like " & quoteWrap(keyword)  
 Me.Issue.Form.RecordSource = recordSourceSql
 Me.Issue.Form.Requery
End Sub

Private Function quoteWrap(value As String) As String
 quoteWrap = "'*" & value & "*' "
End Function

The problem is that after this line:

Me.Issue.Form.RecordSource = recordSourceSql

there is only one record showing in Issue--it's the first record in the original recordset, when there should be at least 20 records showing with the value of keyword that I tested. Once this occurs, the Me.Issue.Form.Requery call does not change the contents of Issue.

I know that the correct recordSourceSQL is being created, because when I put in, e.g., "data" for keyword, I get this string for recordSourceSQL:

select * from [Issue] where [Details] like '*data*'

and when I create a query in Access and set this as the SQL, I get all the correct results returned.

What's wrong with this code to search the subform according to the given criteria?

UPDATE: I was able to get this to work by setting Me.Issue.Form.Filter to the WHERE clause in recordSourceSql. I don't understand why .Filter works but changing .RecordSource doesn't.

UPDATE 2: The .Filter solution is not working either. I've described this issue in this SO question.

Was it helpful?

Solution

I created a sample, copied your code and was able to replicate your problem and solve it.

If your subform was unbound (i.e., recordsource was empty) and the primary key of your main table and Issue table had the same field name (e.g., both were named "ID", etc.) and you did not link any parent or child fields, then it will only work if you specifically name each field like this:

recordSourceSql = "SELECT Issue.IssueID, Issue.Details FROM Issue WHERE Issue.Details Like '*Data*'"

You are correct! Wildcards in the select don't work in this scenario, including Select Issue.* From Issue.

Alternatively, if you rename the primary key in your Issue table so it is not the same as your main form main table, then the wildcards work as you would expect. When I made this change your exact code worked:

recordSourceSql = "SELECT * FROM Issue WHERE Details Like " & quoteWrap(Keyword)

Note the Me.Issue.Form.Requery is not necessary. Just setting or changing the RecordSource automatically requeries.

It does not seem to matter if the two primary key fields are dragged to the main or subform. It also doesn't help to make the subform databound but empty with an initial recordsource in the property sheet of "Select * from Issue Where 1=2" (one way to create an empty recordset, but keep the form bound).

I don't know if this is an MS-Access quirk or something intentional. It seems to me that I must have come across this scenario many times (primary key was "ID", subform unbound, no child fields linked) but I don't recall coming across this limitation. Maybe I didn't use a wildcard. When I googled, I didn't find this reported by others but no doubt some MS-Access expert out there will know the reason.

Hope this helps.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top