Making a report with only records matching certain criteria

D

Doug

What is the simplest way to make a report where only the records
where a field matches a certain date are included, and the user first
selects that date (from form or popup)? (I can write the SQL to select
the records I want...)
 
G

Guest

Hi,

1st of all make a ctiteria from by the name of 'CriteriaForm' add 2
textboxes and 1 cmdButton to it.
named textbox1 by 'BeginnigDate' and textbox2 by 'EndingDate'.
Set CmdButton 'On Click' property to Event Procedure and click click ...
(Button) next to the property box to open Visual Basic code window.

write this code before End Sub.

DoCmd.OpenReport "report_name",acViewPreview
Me.Form.Visibe=FALSE
Close the window.
Save and Close the form.

Design a query (data source for your report) by the name of 'CritQry'
Add all Table fields to the design grid.
In '_Date' criteria box write
Between Forms!CriteriaForm!BeginnigDate And Forms!CriteriaForm!EndingDate

Save and Close the query.

Set your report's Data Sorce Property to 'CritQry'
Save and Close the report.

Now you are able to open your report by CriteriaForm for specific dates.

JB
 
A

Albert D. Kallal

What is the simplest way to make a report where only the records
where a field matches a certain date are included, and the user first
selects that date (from form or popup)? (I can write the SQL to select
the records I want...)

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

You can build a query that references the "prompt" form direclity, and this
takes no code.

eg:

InvoiceDate = forms!reportPrompt!txtDate

If you want more contorl (and can write some code), then read on:

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
 
G

Guest

Doug,

The simplest way is to use the Report Wizard based on your query.

I suspect your difficulty is in passing a parametric date value to your
report/query construct. The simplest way to do this is to use the full
syntax address of the date control on the form such as:

[Forms]![My Form Name]![My Date Control Name]

in your SQL. I assume you use the Query Grid so just enter this syntax,
preceded by an '=' sign, in the 'Criteria' row of the date column.

Note well that this solution relies on [My Form Name] being loaded; it
doesn't have to be visible but it must be accessible by the Access engine
(instantiated). You must also therefore have the form present as you develop
and test your report.

Regards,

Rod
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top