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")之间

当您运行查询时,应该会出现两个输入框,要求输入指定格式的 FromTo 日期。

【讨论】:

@Remou,您的链接很好地总结了为什么要加倍努力并创建表单等(David Fenton 的回答是一个极好的演练),但 zdawg 的回答肯定在这里占有一席之地。尽管有其局限性,但它是解决原始发帖人问题的最快捷、最简单的方法。 @hawbsl 这当然是一点,但是,我过去发现快速答案看起来不错并使用它们,认为 mdb 是一种临时措施,只是发现它变得越来越重要有一堆现在必须尽快修复的东西。此外,一旦用户/老板看到可以做的事情,他们几乎不可避免地会要求更多,而且还会继续。

以上是关于ms-access:仅显示特定日期内记录的报告的主要内容,如果未能解决你的问题,请参考以下文章

MS-Access 获取特定订单日期的产品价格

使用 jQuery 的 datepicker 突出显示特定范围内的日期

SQL/ms-access 中的条件仅考虑月份中的某一天,而不是完整日期

查询未在MS-Access中使用日期条件

MS-Access 报告在执行时显示设计视图

在 MS-Access 中禁用除报告(打印预览)之外的功能区栏