If it just one selection from a listbox, or drop down, then you simply build
a query, and place the condtion in the query builder
in the query grid, for hte condction, simply type int he name of hte form +
the unbound contorl
eg:
forms!MyPromptForm!txtTraining
If you have a buttion on your form, then you can have it launch a report
based on that query..and it will be filtered by the selection
The above appparch means that you actually don't even have to write ANY
code. However, you might want a case where the user does not sledct ANY
thing from the combo box (or list box). I you need more flecibty, then read
on....
The normal approach is to build a un-bound form (a un-bound form is a form
that is NOT attached to a table - these forms are typicaly desiged for user
interface face stuff like promtps, print buttions etc).
The following screen shots are all un-bound forms, and they simply prompt
the user for informaton.
http://www.members.shaw.ca/AlbertKallal/ridesrpt/ridesrpt.html
The above shold give you some ideas
So, the solution use now is simply to take the values from the form, and
build your own where clause in code. That way, you simply design the reports
(or forms), and attached them to the query. And, NO FORMS conditions are
placed in the query.
To "send" the conditions to the report (or form), you simply use the "where"
clause. This is exactly why ms-access has this feature...and it solves a
zillion problems...and will reduce your development costs by a substantial
amount.
The code to make those above screens work and launch the report with the
selected restrictions when you hit the "print" button is easy:
dim strWhere as string
' select sales rep combo
if isnull(cboSalesRep) = false then
strWhere = "SalesRep = '" & cboSalesRep & "'"
end if
' select what City for the report
if isnull(cboCity) = false then
if strWhere <> "" then
strWhere = strWhere " and "
endif
strWhere = strWhere & "City = '" & cobCity & "'"
end if
Note how the 2nd combo test is setup. You can add as "many" more conditions
you want. Lets say we have a check box to only include Special Customers. We
can add to our very nice prompt screen a check box to
[x] Show Only Special customers
The code we add would be:
if chkSpeicalOnly = True then
if strWhere <> "" then
strWhere = strWhere " and "
endif
strWhere = strWhere & "SpecialCust = true"
endif
For sure, each combo and control we add to the nice report screen takes a
bit of code, but no more messy then the query builder..and this way, each
query is nice and clean, and free of a bunch of HIGHLY un-maintainable
forms! expressions.
Further, it means you can re-use the same query for different reports, and
have no worries about some form that is supposed to be open. So, a tiny bit
more code eliminates the messy query problem.. For me, this is very worth
while trade.
For a date range, we could put two calendar contorls on the screen. The code
could be:
dim strWhere as string
dim strStartDate as string
dim strEndDate as string
strStartDtae = "#" & format(me.StartDateContorl,"mm/dd/yyyy") & "#"
strEndDate = "#" & format(me.EndDateContorl,"mm/dd/yyyy") & "#"
strWhere = "InvoiceDate is between " & strStartDate & " and " & strEndDate
docmd.openReport "InvoiceReport",acViewPreview,,strWhere
And, if you note close, in those screen shots, I often simply state (no
selection = all).
So, you can bold the report, place an actually condition that references the
form, and then when you launch the report..it will be filter..and it will
take ZERO code....
If your looking to make something more user friendly, and have users will
your hide the ms-access interface, then the above codng ideas should give
you a good start of this...
--
Albert D. Kallal (Access MVP)
Edmonton, Alberta Canada
[email protected]
http://www.members.shaw.ca/AlbertKallal