将日期从表单传递到 Docmd.openreport 的问题

Posted

技术标签:

【中文标题】将日期从表单传递到 Docmd.openreport 的问题【英文标题】:Problems passing a date from a form into Docmd.openreport 【发布时间】:2013-11-15 23:40:15 【问题描述】:

我正在拔头发,因为我只是看不出这里有什么问题。我怀疑这是一个简单/愚蠢的错误,但只是看不到它。我是一个相对缺乏经验的 VBA 程序员,但我喜欢认为自己有足够的知识来应付大多数编程语言。

问题 我有一个简单的发票系统。我想要生成的报告之一是特定日期之后所有发票问题的报告。

为此,我创建了一个报告“所有发票查询”,它使用同名查询来生成系统中所有发票的摘要并提供单行摘要(日期、金额、已付款标志)

我想对此进行修改,以便将打印输出限制为特定日期之后的发票。

我在仪表板中创建了一个字段(文本框;格式短日期)来保存日期和一个按钮来“运行”报告 按钮调用程序

Private Sub ButtonAfterDate_Click()
    DoCmd.OpenReport "All invoice query", acViewPreview, , "[Invoice date] > #" & Me.Printdate & "#"
End Sub

这会生成一个包含系统中所有发票的报告(即没有过滤)

如果我转到保存 [Invoices] 中的数据的表格并从那里复制日期并将其粘贴到表单控件中,则报告开始工作并且报告仅显示日期之后的发票。

我检查了我的表单控件是否设置为短日期,我尝试输入日期并使用日期选择器选择它(没有差异仍然无法过滤)

无奈之下,我尝试将控件更改为列表框,该列表框使用查询从 Invoice 表中提取日期(但是失败了,所以回到我原来的控件按钮和字段来保存日期(使用日期选择器)

总结 如果我将表格中的日期复制并粘贴到表单控件中,则 OpenReport 的行为与预期和过滤器相同 如果我键入日期或使用日期选择器将日期放入表单控件中,OpenReport 会忽略任何过滤并显示所有发票摘要。

这似乎是一个数据类型问题,但不知道下一步该尝试什么

提前感谢您的帮助

【问题讨论】:

【参考方案1】:

我找到了答案。我没有意识到 Docmd.OpenReport 的 where 子句必须有任何美国格式的日期,即 mm/dd/yyyy 我在英国,Windows 上的本地化(实际上是英国实践)输入为 dd/mm/年年了

经过一番研究,我发现了一个函数,可以将日期从 uk 改写为 us 格式,然后将修改后的字符串放在 where 子句中。

我在这里找到了修改日期的代码:http://bytes.com/topic/access/answers/511395-dates-where-clause

但为了方便:

Public Function FixDate(strDate As String)
Dim D1 As Integer, D2 As Integer
D1 = InStr(strDate, "/")
D2 = InStr(D1 + 1, strDate, "/")
FixDate = CDate(Mid(strDate, D1 + 1, D2 - (D1 + 1)) & "/" _
& Left(strDate, D1 - 1) & "/" _
& Mid(strDate, D2 + 1))

结束函数

由兰迪哈里斯发布 promail dot com 的技术

然后我修改我的事件过程以使用此代码:

Private Sub ButtonAfterDate_Click()
Dim mydate As Date
mydate = Me.Printdate
FixDate (mydate)
DoCmd.OpenReport "All invoice query", acViewPreview, , "[Invoice date] > #" & mydate & "#"
End Sub

而且它有效!

感谢所有看过并思考过它的人,我希望它对其他人有所帮助。

【讨论】:

以上是关于将日期从表单传递到 Docmd.openreport 的问题的主要内容,如果未能解决你的问题,请参考以下文章

访问:从表单传递参数到查询

将MS Access表单日期传递到Oracle SQL

如何从 html 输入表单中使用 php 查找时差

将变量从 PHP 传递到 javascript 并传递到 html 表单

如何从props传递对象获取默认日期为特定日期

仅从控制器通过DateTime对象传递日期。尝试多种方式绑定时间