Access SQL 中的 CDec 的行为与从 Access VBA 中使用时的行为不同

Posted

技术标签:

【中文标题】Access SQL 中的 CDec 的行为与从 Access VBA 中使用时的行为不同【英文标题】:CDec in Access SQL is not behaving the same as when used from Access VBA 【发布时间】:2015-07-09 20:17:34 【问题描述】:

根据MSDN,在VBA中将数字转换为十进制的语法是

CDec(expression)

我也经常在访问 SQL 中使用转换函数。例如 Clng、Cint 等...

但是,当我使用 CDec 时,有时会出现此错误

Compile error:Wrong number of arguments or invalid property assignment

考虑:

在即时窗口中

? cdec(round(0.00023,4))
0.0002 

? CDec(Round(0.12345678+0.00000001,6))
0.123457 

? CDec(Round(0.12345679,6))
0.123457 

? CDec(Round(0.12345679,6),10)
This gives the above error  (ie as expected as no parameter is allowed)

在 SQL 查询列中

CDec(Round(0.12345678,6))
This gives the above error.

CDec(Round(0.12345678,6),2)
This WORKS and give the answer 0.     What does the parameter do!?

CDec(Round(0.12345678,6),2,1)
This gives the above error.

我猜当从访问 SQL 调用函数时,它使用的代码与 VBA 使用的代码不同。但是,我被卡住了,不明白。

救命!

我使用的是 MS Access 2013:内部版本:15.0.4727.1003 32bit

哈维

【问题讨论】:

这是个好问题。我以前没有注意到(或受到打击)。也许您应该避免在 SQL 中使用 CDec ... 我使用了 Cdbl,但由于我处理的是小数点后 6 位的数据,这是否足够准确? 双精度“存储时”是准确的,如果仅是正数并且(稍后)仅添加。可能发生位错误的地方是当您减去时。如果您的数字不是太大,您还可以使用 100 倍进行缩放,并使用可以处理四位小数且没有错误的货币。 我已将此错误报告为错误(可能需要免费登录):[Office 16 Bug Bash - 7 月 15 日](yammer.com/itpronetwork/#/threads/…) 我认为这将被归类为错误...感谢您的建议我现在整理出来...谢谢。 【参考方案1】: MS 的

Dennis Wilmar 说,这是 Access 2003 中已确认的错误 - 尚未删除:

Error message when you use the CDec() function in an Access query

建议的解决方法是将 CDec 包装在自定义函数中:

Function NewCDec(MyVal)
   NewCDec = CDec(MyVal)
End Function

【讨论】:

以上是关于Access SQL 中的 CDec 的行为与从 Access VBA 中使用时的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

为啥从独立函数生成的 pyplot 窗口与从事件处理程序调用的函数生成时的行为不同?

SQL脚本存在TABLE ACCESS FULL行为及其优化

MS Access 和 SQL 服务器之间的 Max() 行为不同

MS Access 直通选择查询导致 SQL Server 中的页面锁定

选择案例的 Python 等效项 (CDec(variable)

Eclipse战队公告:原CDEC选手玄月加盟