ms-access:仅在特定日期内显示记录的报告
最好的解决方案可能是创建一个允许用户输入日期的小表单。然后,该报告是基于查询可以指形式:
SELECT f1,f2,f3 FROM Table
WHERE SomeDate
BETWEEN Forms!DateSelect!StartDate AND Forms!DateSelect!EndDate
我会做的是创建一个选择表和我会成立日期字段中的所有行的查询几个参数。请尝试以下操作:
-
指定,像这样的日期字段的查询设计:
格式([YourDateField], “MMM DD,YYYY”)
-
而对于标准的编写:
格式之间进行([从] “MMM YY,DDDD”)和格式([到], “MMM DD YYYY。”)
运行查询时,应该出现两个输入框,以指定格式请求From
和To
日期。
通常最好使用一个表格:http://www.tek-tips.com/faqs.cfm?fid=6763 – Fionnuala 2010-05-10 21:31:12
@Remou,你的链接是一个很好的总结,为什么要多走一步,创建一个表单(和大卫芬顿的答案是一个极好的演习),但肯定zdawg的答案在这里有一个地方。尽管有其局限性,它是解决原始海报问题的极其快捷的方式。 – hawbsl 2010-05-11 03:30:42
@hawbsl然而,这当然是一个观点,我发现在过去,快速回答看起来不错,并使用它们,认为mdb是一个临时措施,只是发现它增长,现在变得更重要,现在有一堆东西必须尽快修复。此外,一旦用户/老板看到了可以做的事情,他们几乎不可避免地会要求更多的信息,并且还会带来钟声。 – Fionnuala 2010-05-11 07:45:53
我不喜欢在表单/报表的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
这是方式更多信息比你需要的,真的,但我试图做的一点是,您应该考虑将报告的记录源绑定到参数或对话框表单。
谢谢。你可以更清楚一点吗?我已经有一个报告,所以我应该编辑报告,或者我应该创建一个新的表格? – 2010-05-10 21:10:54
创建一个表单。根据表单创建一个查询。更改报告的记录来源以引用该查询。从表单上的按钮启动报告。 – Fionnuala 2010-05-10 21:26:17