ms-access:仅显示特定日期内记录的报告
Posted
技术标签:
【中文标题】ms-access:仅显示特定日期内记录的报告【英文标题】:ms-access: report that displays records only within a certain date 【发布时间】:2010-05-10 20:57:45 【问题描述】:我有一个非常简单的报告,它只从一个表中生成。表中的一列是日期。
我需要能够允许报告用户输入日期范围并仅显示这些日期之间的数据。
我该怎么做>?
【问题讨论】:
【参考方案1】:我不喜欢在表单/报告的记录源中硬连线参数或表单引用,所以我会修改@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
一些cmets:
这里调用的对话框比您需要的要复杂得多,因为它有一堆预定义的日期范围,是根据对话框的 OpenArgs 参数设置的。表格如下所示:(来源:dfenton.com)
我使用Stephan Lebans date picker code 允许用户从日历控件中选择日期。
设置日期范围的代码是这样的,我所要做的就是将这个 CASE SELECT 的一个案例传递给它:
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
确实,这比您需要的信息多得多,但我想说的是,您应该考虑将报表的记录源与参数或对话框表单联系起来。
【讨论】:
【参考方案2】:最好的解决方案可能是创建一个允许用户输入日期的小表单。报告所基于的查询然后可以参考表单:
SELECT f1,f2,f3 FROM Table
WHERE SomeDate
BETWEEN Forms!DateSelect!StartDate AND Forms!DateSelect!EndDate
【讨论】:
谢谢。你能更清楚一点吗?我已经有一份报告,我应该编辑报告还是创建一个新表格? 创建一个表单。根据表单创建查询。更改报告的记录源以引用查询。从表单上的按钮启动报告。【参考方案3】:我要做的是创建一个查询来选择表中的所有行,并为日期字段设置几个参数。请尝试以下操作:
在查询设计中像这样指定日期字段:
Format([YourDateField],"mmm.dd, yyyy")
对于标准写:
格式([From],"mmm.yy, dddd")和格式([To],"mmm.dd.yyyy")之间
当您运行查询时,应该会出现两个输入框,要求输入指定格式的 From
和 To
日期。
【讨论】:
@Remou,您的链接很好地总结了为什么要加倍努力并创建表单等(David Fenton 的回答是一个极好的演练),但 zdawg 的回答肯定在这里占有一席之地。尽管有其局限性,但它是解决原始发帖人问题的最快捷、最简单的方法。 @hawbsl 这当然是一点,但是,我过去发现快速答案看起来不错并使用它们,认为 mdb 是一种临时措施,只是发现它变得越来越重要有一堆现在必须尽快修复的东西。此外,一旦用户/老板看到可以做的事情,他们几乎不可避免地会要求更多,而且还会继续。以上是关于ms-access:仅显示特定日期内记录的报告的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery 的 datepicker 突出显示特定范围内的日期