Access 2007 VBA - Open report with filtering

This one should be quick and easy...

I've got a tabular report bound to a query.  I need to open that report from a form where I select a projectID and a date range.  In a button click event on the form I am able to open it using this...

DoCmd.OpenReport "rptExpenditureReport", acViewReport

But how do I pass parameters to the report and how do I utilize those parameters as filters?

Thanks
LVL 7
JosephEricDavisAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
VTKeganConnect With a Mentor Commented:
DoCmd.OpenReport "rptExpenditureReport", acViewReport,,"[ProjectID]=" & Me.ProjectID & " AND [DateRange]=#" & Me.DateRange & "#"
0
 
VTKeganConnect With a Mentor Commented:
Here is a link to msdn on exactly how to do this:

http://msdn.microsoft.com/en-us/library/bb243764(v=office.12).aspx
0
 
Helen FeddemaCommented:
I like to save the values to variables and construct a filtered recordset.  This allows for some error trapping.  Then save the filtered recordset to a query, which is the source of the filtered report.  Here is sample code:
[sample code fragment using the procedure]

   Dim dbs As DAO.Database
   Dim lngCount As Long
   Dim lngID As Long
   Dim rpt As Access.Report
   Dim rst As DAO.Recordset
   Dim strPrompt As String
   Dim strQuery As String
   Dim strRecordSource As String
   Dim strReport As String
   Dim strSQL As String
   Dim strTitle As String
   
   strRecordSource = "tblInventoryItemsComponents"
   strQuery = "qryTemp"
   Set dbs = CurrentDb

   'Numeric filter
   lngID = Nz(Me![ID])
   If lngID <> 0 Then
      strSQL = "SELECT * FROM " & strRecordSource & " WHERE " _
         & "[ID] = " & lngID & ";"
   End If

   'String filter
   strInventoryCode = Nz(Me![InventoryCode])
   If strInventoryCode <> "" Then
      strSQL = "SELECT * FROM " & strRecordSource & " WHERE " _
         & "[InventoryCode] = " & Chr$(39) & strInventoryCode & Chr$(39) & ";"
   End If

   'Date range filter from custom database properties
   dteFromDate = CDate(GetProperty("FromDate", ""))
   dteToDate = CDate(GetProperty("ToDate", ""))
   strSQL = "SELECT * FROM " & strRecordSource & " WHERE " _
      & "[dteDateReceived] Between " & Chr(35) & dteFromDate _
      & Chr(35) & " And " & Chr(35) & dteToDate & Chr(35) & ";"

   'Date range filter from controls
   If IsDate(Me![txtFromDate].Value) = True Then
      dteFromDate = CDate(Me![txtFromDate].Value)
   End If

   If IsDate(Me![txtToDate].Value) = True Then
      dteToDate = CDate(Me![txtToDate].Value)
   End If

   strSQL = "SELECT * FROM " & strRecordSource & " WHERE " _
      & "[dteDateReceived] Between " & Chr(35) & dteFromDate _
      & Chr(35) & " And " & Chr(35) & dteToDate & Chr(35) & ";"

   Debug.Print "SQL for " & strQuery & ": " & strSQL
   lngCount = CreateAndTestQuery(strQuery, strSQL)
   Debug.Print "No. of items found: " & lngCount
   If lngCount = 0 Then
      strPrompt = "No records found; canceling"
      strTitle = "Canceling"
      MsgBox strPrompt, vbOKOnly + vbCritical, strTitle
      GoTo ErrorHandlerExit
   Else
      'Use this line if you need a recordset
      Set rst = dbs.OpenRecordset(strQuery)
   End If

   'Use SQL string as the record source of a form
   strFormName = "fpriLoadSoldPackingSlip"
   DoCmd.OpenForm FormName:=strFormName, _
      view:=acDesign
   Set frm = Forms(strFormName)
   frm.RecordSource = strSQL
   DoCmd.OpenForm FormName:=strFormName, _
      view:=acNormal
   
   'Use SQL string as the record source of a report
   strReport = "rptLoadSold"
   DoCmd.OpenReport ReportName:=strReport, _
      view:=acViewDesign, _
      windowmode:=acHidden
   Set rpt = Reports(strReport)
   rpt.RecordSource = strSQL
   DoCmd.OpenReport ReportName:=strReport, _
      view:=acViewNormal, _
      windowmode:=acWindowNormal

=========================

Public Function CreateAndTestQuery(strTestQuery As String, _
   strTestSQL As String) As Long
'Created by Helen Feddema 28-Jul-2002
'Last modified 6-Dec-2009

On Error Resume Next
   
   Dim qdf As DAO.QueryDef
   Dim rst As DAO.Recordset
   
   'Delete old query
   Set dbs = CurrentDb
   dbs.QueryDefs.Delete strTestQuery

On Error GoTo ErrorHandler
   
   'Create new query
   Set qdf = dbs.CreateQueryDef(strTestQuery, strTestSQL)
   
   'Test whether there are any records
   Set rst = dbs.OpenRecordset(strTestQuery)
   With rst
      .MoveFirst
      .MoveLast
      CreateAndTestQuery = .RecordCount
   End With
   
ErrorHandlerExit:
   Exit Function

ErrorHandler:
   If Err.Number = 3021 Then
      CreateAndTestQuery = 0
      Resume ErrorHandlerExit
   Else
   MsgBox "Error No: " & Err.Number _
      & " in CreateAndTestQuery procedure; " _
      & "Description: " & Err.Description
   End If
   
End Function

Open in new window

0
Easily Design & Build Your Next Website

Squarespace’s all-in-one platform gives you everything you need to express yourself creatively online, whether it is with a domain, website, or online store. Get started with your free trial today, and when ready, take 10% off your first purchase with offer code 'EXPERTS'.

 
Helen FeddemaCommented:
Feeding values from controls directly to a report can be problematic, because of data conversion and/or Nulls or empty strings in the controls.
0
 
JosephEricDavisAuthor Commented:
I'm not quite sure exactly how the date range condition is being put together.  Can you give me an example of how the final conditional string is supposed to turn out if the date field I'm filtering on is called ExpenditureDate?

Thanks
0
 
VTKeganCommented:
If the criteria is numeric then you need nothing around the criteria like:

"[ProjectID]=" & Me.ProjectID

If the criteria is a string then you need ' 's around the criteria like:

"[ProjectID]='" & Me.ProjectID & "'"

If the criteria is a date then you need #'s around the criteria like:

"[ExpenditureDate]=#" & Me.ExpenditureDate & "#"

So the final result would be (assuming ProjectID is numeric)

"[ProjectID]=" & Me.ProjectID & " AND [ExpenditureDate]=#" & Me.ExpenditureDate & "#"




Your question seems to ask about a date range which I initially missed.  So you have two dates selected on your form, and you want to return values where [ExpenditureDate] is between those two values?
0
 
VTKeganConnect With a Mentor Commented:
For date range you would want to use

"[ExpenditureDate] BETWEEN #" & Me.StartDate & "# AND #" & Me.EndDate & "#"

So final result would be (assuming ProjectID is numeric)

DoCmd.OpenReport "rptExpenditureReport", acViewReport, ,"[ProjectID]=" & Me.ProjectID & " AND [ExpenditureDate] BETWEEN #" & Me.StartDate & "# AND #" & Me.EndDate & "#"
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.