DateSerial用作导致奇怪行为的查询参数

时间:2013-10-24 20:38:18

标签: ms-access ms-access-2010

这是针对在Access 2007中开发的预算应用程序,目前运行2010年。该应用程序运行正常。我在查询中发现了一个逻辑错误。修复它时,我意识到我可以改变参数:

Month(budget.capture_date) = [forms]![f_budget]![tglMonth]
AND
Year(budget.capture_date) = Year([forms]![f_budget]![capture_date])

简单地说:

budget.capture_date = DateSerial(Year([forms]![f_budget]![capture_date]),[forms]![f_budget]![tglMonth],1)

应该没问题吧?我的想法可能是因为函数调用较少会稍快一些。

在打开查询时,在手动测试和键入参数时,查询正常工作。

使用条件通过DoCmd.OpenForm打开预算表单时,所有带有DateSerial参数的子表单都显示为空白。参数中使用的字段f_budget!capture_date确实包含一个值。

手动打开表单时,每个子表单都会出现以下错误(无错误代码):

  

此表达式输入错误,或者太复杂而无法评估。例如,数字表达式可能包含太多复杂元素。尝试通过将表达式的一部分分配给变量来简化表达式。

因此,经过调查,如果您使用DateSerial打开参数查询并只是跳过参数,您将收到上述错误。如果您手动输入日期,它将正常工作。如果我通过OpenForm打开带有条件的表单,则没有错误,但所有子表单都是空白的。从那里,如果我更改为设计视图,然后返回到窗体视图而不关闭窗体,表单将完美地工作。如果我关闭表单并手动打开它,我将收到每个具有DateSerial标准的子表单的上述错误。

请注意,使用Year()或Month()并跳过查询的参数只会返回没有结果,不会导致上述错误。

这个让我难过。我创建了一个新的数据库并导入了其中的所有内容,反编译,修复,将DateSerial添加到查询ect的参数列表中。无所谓,行为是一致的。有人有任何见解吗?

1 个答案:

答案 0 :(得分:1)

Year()和Month()函数允许传递NULL,而DateSerail需要有效的整数。

因此查询无法使用空参数运行。