【问题标题】:MS Access - Docmd.OpenReportMS Access - Docmd.OpenReport
【发布时间】:2018-05-23 15:26:48
【问题描述】:

我正在尝试打开一个包含两个日期(dateFrom 和 dateTo)之间的日期字段的报告,该日期字段来自表单中的文本框。

dateFrom = Forms!formOptions!txtDateFrom.Value
dateTo = Forms!formOptions!txtDateTo.Value 

试过了:

(编辑:)

dateFrom 和 dateTo 变量周围有和没有“#”

& 带和不带 [] 的字段名称,仍然无法获取 这工作。

当我尝试这段代码时:

strCriteria = "[ActionTime] >= '" & dateFrom & "' And [ActionTime] <= '" & dateTo & "'"
DoCmd.OpenReport "reportLog", acViewReport, , strCriteria

将弹出一个“输入参数值”对话框,我检查了报告的控制源,字段名称正确,也没有发生排序或分组。

当我在上面的代码中的字段名称周围加上一对额外的 ' ' 时:

strCriteria = "'[ActionTime]' >= '" & dateFrom & "' And '[ActionTime]' <= '" & dateTo & "'"
DoCmd.OpenReport "reportLog", acViewReport, , strCriteria

报告正常打开,但不仅显示日期之间的记录,还显示所有记录。

也尝试过使用 WhereCondition:

DoCmd.OpenReport "reportLog", acViewReport, , WhereCondition:="'[ActionTime] >= #" & dateFrom & "# AND [ActionTime] <= #" & dateTo & "#'"

报告正常打开,但包含所有记录,而不遵循 WhereCondition。

我不知道这段编码的哪一部分是错误的,我已经参考了其他网站,但仍然无法检测出到底哪里错了。将不胜感激任何指导。提前致谢。

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    共享尝试不起作用。第一个,因为日期应该以特定方式(YYYY-MM-DD 或 MM/DD/YYYY)格式化,并被#(值,而不是字段名称)包围。第二,因为您将文字字符串 '[ActionTime]' 与包含日期的字符串进行比较,这不是一件非常明智的事情。

    然而,简单而安全的方法就是设置参数:

    strCriteria = "[ActionTime] >= dateFrom And [ActionTime] <=  dateTo"
    DoCmd.SetParameter "dateFrom", dateFrom
    DoCmd.SetParameter "dateTo", dateTo
    DoCmd.OpenReport "reportLog", acViewReport, , strCriteria
    

    阅读更多关于使用参数here

    【讨论】:

    • 我的意思是我尝试在 dateFrom 和 dateTo 变量周围使用和不使用 #。并且在字段名称周围带有和不带有 []。将编辑问题。
    • 但是这个报表中的ActionTime是从一个表中取出来的,在表中,这个字段的类型是日期,还是算字符串吗?我会试试你推荐的方法,谢谢。
    • 任何由' 引号分隔的内容都是Access SQL 中的字符串。几乎没有自动类型转换。
    • 感谢您的宝贵时间和建议。
    【解决方案2】:

    您的日期值需要格式正确的字符串表达式:

    Dim dateFrom As Date
    Dim dateTo As Date
    
    dateFrom = DateValue(Forms!formOptions!txtDateFrom.Value)
    dateTo = DateValue(Forms!formOptions!txtDateTo.Value)
    
    strCriteria = "[ActionTime] >= #" & Format(dateFrom, "yyyy\/mm\/dd") & "# And [ActionTime] <= #" & Format(dateTo, "yyyy\/mm\/dd") & "#"
    Debug.Print "'" & strCriteria & "'"
    DoCmd.OpenReport "reportLog", acViewReport, , strCriteria
    

    编辑:如果 ActionTime 出现多次,请尝试:

    strCriteria = "[reportLog].[ActionTime] >= #" & Format(dateFrom, "yyyy\/mm\/dd") & "# And [reportLog].[ActionTime] <= #" & Format(dateTo, "yyyy\/mm\/dd") & "#"
    

    【讨论】:

    • 试过了,但仍然弹出“输入参数值”对话框。我想可能是因为它无法识别[ActionTime],并添加了[reportLog]!在 [ActionTime] 前面要像 [reportLog]![ActionTime],这次没有弹出对话框并打开报告,但它仍然不遵循日期标准。感谢您的建议。
    • 那么[ActionTime] 拼写错误或者不是报表记录源中的字段。
    • 我检查了多次,[ActionTime] 是报告和表格中字段的完全相同的名称,是的,拼写是相同的。我不知道是什么原因造成的。
    • 检查条件字符串 - 请参阅编辑后的答案中的 Debug.Print。
    • 我之前也使用调试检查过。这就是即时窗口中出现的内容。 [ActionTime] &gt;= #05/22/2018# AND [ActionTime] &lt;= #05/23/2018#. 我将日期格式化为 mm/dd/yyyy,因为这就是 [ActionTime] 字段的日期格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2023-03-08
    • 2011-10-25
    相关资源
    最近更新 更多