2010-05-10 92 views

回答

1

最好的解决方案可能是创建一个允许用户输入日期的小表单。然后,该报告是基于查询可以指形式:

SELECT f1,f2,f3 FROM Table 
WHERE SomeDate 
BETWEEN Forms!DateSelect!StartDate AND Forms!DateSelect!EndDate 
+0

谢谢。你可以更清楚一点吗?我已经有一个报告,所以我应该编辑报告,或者我应该创建一个新的表格? – 2010-05-10 21:10:54

+0

创建一个表单。根据表单创建一个查询。更改报告的记录来源以引用该查询。从表单上的按钮启动报告。 – Fionnuala 2010-05-10 21:26:17

1

我会做的是创建一个选择表和我会成立日期字段中的所有行的查询几个参数。请尝试以下操作:

  1. 指定,像这样的日期字段的查询设计:

    格式([YourDateField], “MMM DD,YYYY”)

  2. 而对于标准的编写:

    格式之间进行([从] “MMM YY,DDDD”)和格式([到], “MMM DD YYYY。”)

运行查询时,应该出现两个输入框,以指定格式请求FromTo日期。

+0

通常最好使用一个表格:http://www.tek-tips.com/faqs.cfm?fid=6763 – Fionnuala 2010-05-10 21:31:12

+0

@Remou,你的链接是一个很好的总结,为什么要多走一步,创建一个表单(和大卫芬顿的答案是一个极好的演习),但肯定zdawg的答案在这里有一个地方。尽管有其局限性,它是解决原始海报问题的极其快捷的方式。 – hawbsl 2010-05-11 03:30:42

+0

@hawbsl然而,这当然是一个观点,我发现在过去,快速回答看起来不错,并使用它们,认为mdb是一个临时措施,只是发现它增长,现在变得更重要,现在有一堆东西必须尽快修复。此外,一旦用户/老板看到了可以做的事情,他们几乎不可避免地会要求更多的信息,并且还会带来钟声。 – Fionnuala 2010-05-11 07:45:53

4

我不喜欢在表单/报表的recordsources中硬连线参数或表单引用,所以我会修改@ Remou的想法,而不是在报表的OnOpen事件中设置RecordSource。也就是说,首先打开表单,收集所选日期的值,然后将其插入报表的RecordSource的where子句中。像这样的事情(从我的一个真实反映复制):

Dim strRecordSource As String 

    DoCmd.OpenForm "dlgDateRange", , , , , acDialog, "ThisYear" 
    If IsLoaded("dlgDateRange") Then 
    With Forms!dlgDateRange 
     If .Tag = "Cancel" Then 
      Cancel = True 
     Else 
      Me.Filter = "[InvoiceDate] Between #" & !txtStart & "# AND #" & !txtEnd & "#" 
      Me.FilterOn = True 
      Me!lblDateRange.Caption = StrConv(Trim(("from " + varZLStoNull(Format(!txtStart, "mm/dd/yyyy"))) & (" to " + varZLStoNull(Format(!txtEnd, "mm/dd/yyyy")))), vbProperCase) 
     End If 
    End With 
    DoCmd.Close acForm, "dlgDateRange" 
    End If 

一些评论:

  • 这里所说的对话形式是不是你所需要的,因为它有一堆预定义的要复杂得多日期范围,基于对话框窗体的OpenArgs参数设置。该形式如下:

alt text http://dfenton.com/DFA/examples/DateCriteriaForm.png

我用Stephan Lebans date picker code允许用户挑选从日历控件的日期。

用于设置日期范围的代码是这样的,而我所要做的就是通过它的这一案件的情况选择其一:

Public Sub SetDates(strType As String, ctlStart As Control, ctlEnd As Control) 
    Dim dteStart As Date 
    Dim dteEnd As Date 
    Dim ctl As Control 

    Select Case strType 
     Case "EndOnly" ' OK 
     dteStart = #1/1/1980# 
     ctlStart.Enabled = False 
     dteEnd = Date 
     Case "Trace" ' OK 
     dteStart = DateAdd("d", -7, Date) 
     dteEnd = DateAdd("d", 7, Date) 
     Case "LastWeek" ' OK 
     dteStart = Date - Weekday(Date, vbMonday) - 6 
     dteEnd = dteStart + 6 
     Case "ThisWeek" ' OK 
     dteStart = Date - Weekday(Date, vbMonday) + 1 
     dteEnd = dteStart + 6 
     Case "LastMonth" ' OK 
     dteStart = month(DateAdd("m", -1, Date)) & "/01/" & year(DateAdd("m", -1, Date)) 
     dteEnd = DateAdd("m", 1, dteStart) - 1 
     Case "ThisMonth" ' OK 
     dteStart = month(Date) & "/01/" & year(Date) 
     dteEnd = DateAdd("m", 1, dteStart) - 1 
     Case "LastQuarter" ' OK 
     dteStart = DateSerial(year(DateAdd("q", -1, Date)), (3 * Format(DateAdd("q", -1, Date), "q")) - 2, 1) 
     dteEnd = DateAdd("q", 1, dteStart) - 1 
     Case "ThisQuarter" ' OK 
     dteStart = DateSerial(year(Date), (3 * Format(Date, "q")) - 2, 1) 
     dteEnd = DateAdd("q", 1, dteStart) - 1 
     Case "LastYear" ' OK 
     dteStart = "01/01/" & year(Date) - 1 
     dteEnd = "12/31/" & year(Date) - 1 
     Case "ThisYear" ' OK 
     dteStart = "01/01/" & year(Date) 
     dteEnd = "12/31/" & year(Date) 
     Case "LastFY" ' OK 
     dteStart = "09/01/" & year(DateAdd("m", 4, Date)) - 2 
     dteEnd = DateAdd("yyyy", 1, dteStart) - 1 
     Case "ThisFY" ' OK 
     dteStart = "09/01/" & year(DateAdd("m", 4, Date)) - 1 
     dteEnd = DateAdd("yyyy", 1, dteStart) - 1 
     Case "Last3Years" ' OK 
     dteStart = "01/01/" & year(Date) - 2 
     dteEnd = Date 
     Case "BeforeLast3Years" ' OK 
     dteEnd = DateValue("01/01/" & year(Date) - 2) - 1 
     Case Else 
     dteStart = Date 
     dteEnd = Date 
    End Select 
    If ctlStart.Enabled Then 
     If dteStart = 0 Then 
      ctlStart = Null 
     Else 
      ctlStart = Format(dteStart, "mm/dd/yyyy") 
     End If 
    End If 
    If ctlEnd.Enabled Then 
     If dteEnd = 0 Then 
      ctlEnd = Null 
     Else 
      ctlEnd = Format(dteEnd, "mm/dd/yyyy") 
     End If 
    End If 
    For Each ctl In ctlStart.Parent!optPresetDates.Controls 
     If ctl.ControlType <> acLabel Then 
     If Replace(ctl.Controls(0).Caption, " ", vbNullString) = strType Then 
      ctlStart.Parent!optPresetDates = ctl.OptionValue 
      Exit For 
     End If 
     End If 
    Next ctl 
    Set ctl = Nothing 
    End Sub 

这是方式更多信息比你需要的,真的,但我试图做的一点是,您应该考虑将报告的记录源绑定到参数或对话框表单。