Another alternative you may want to use is setting the criteria at the form level. I'm very much against using parameter queries. The reason being is that by doing that, you're committing that one query where it can only be used with one report or form. By writing a procedure, you're not locking that query, so the same query can be used in different areas. Below is the code that you can try, which will compensate for if the user selects one, both or no selections for filtering. Note, this code is based on your Client field being a numeric value. Ideally, you should have a unique identifier for the client such as an auto-id field.
For the date fields, you would set up 2 unbound text boxes (txtBegin and txtEnd), so the user can enter a range of dates.
Code:
Private Sub cmdReport_Click()
Dim strClient As String
Dim strDateRange As String
Dim strSQL As String
'Clear the variable
strSQL = ""
'Perform validations
If IsNull(Me.txtBegin) Then
If Not IsNull(Me.txtEnd) Then
MsgBox "Most date fields must be completed or left blank"
Exit Sub
End If
End If
If Not IsNull(Me.txtBegin) Then
If IsNull(Me.txtEnd) Then
MsgBox "Most date fields must be completed or left blank"
Exit Sub
End If
End If
If Not IsNull(Me.txtBegin) Then
If Not IsNull(Me.txtEnd) Then
If DateDiff("d", Me.txtBegin, Me.txtEnd) < 0 Then
MsgBox "From date must be prior to or equal to the To date"
Exit Sub
End If
End If
End If
If Not IsNull(Me.txtBegin) Then
strDateRange = "[TheDate] Between #" & Me.txtBegin & "# and #" & Me.txtEnd & "#"
If Len(strSQL) > 0 Then
strSQL = strSQL & " and " & strDateRange
Else
strSQL = strDateRange
End If
End If
If Not IsNull(Me.Client) Then
strClient = "[Client]=" & Me.Client
If Len(strSQL) > 0 Then
strSQL = strSQL & " and " & strClient
Else
strSQL = strClient
End If
End If
If Len(strSQL) > 0 Then 'Report is filtered
DoCmd.OpenReport "MyReport", acViewPreview, , strSQL
Else 'No filter
DoCmd.OpenReport "MyReport", acViewPreview
End If
End Sub