MS Access - Docmd.OpenReport

时间:2018-05-15 09:32:01

标签: vba ms-access access-vba

我正在尝试打开一个报表,其中包含两个日期(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

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

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

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

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

还尝试过使用WhereCondition:

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

报告正常打开,但包含所有记录,而不是关注WhereCondition。

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

2 个答案:

答案 0 :(得分:2)

共享尝试无效。第一个,因为日期应该以特定方式(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

答案 1 :(得分:1)

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

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") & "#"