ms访问本地化和默认布尔值

时间:2009-10-06 13:05:55

标签: ms-access localization ms-office

我们的访问客户端即时生成SQL插入,更新和删除要在MS-SQL Server上发送的指令。大多数用户拥有Access 2007的运行时版本,还有一些使用完整的MS-Access版本,2003或2007.今天上午,我们的一个新用户使用法语/完整版Access 2003,无法更新包含布尔字段。

似乎这些字段在法语版本的Access中填充了“Vrai / Faux”而不是“True / False”值。通过安装2007访问运行时解决了该问题。

但是我想找到一个永久的解决方案,在那里我可以从某个地方读取Access的本地化版本,并将本地化的True / False值“转换”为标准的True / False。我已经检查了计算机的区域设置但没有成功,所以它在其他地方。有什么想法吗?

编辑:遵循JohnFX提案,使用这个简单的函数可以有效地从本地True / False转换为通用True / False:

Function xBoolean(xLocalBooleanValue) as Boolean
if cint(xLocalBooleanValue) = -1 Then
    xBoolean = True
endif
if cint(xLocalBooleanValue) = 0 Then
    xBoolean = False
endif
end function

编辑:关注@David的评论,我改变了最喜欢的解决方案。他的提议比我的聪明。

编辑:我通过读取记录集中字段的值来获取Vrai / Faux值:

? debug.print screen.activeForm.recordset.fields(myBooleanField).value 
Vrai

3 个答案:

答案 0 :(得分:2)

无论是本地化还是数据库格式,True都不是FALSE,或者不是0,无论是本地化还是数据库格式。

因此,如果用NOT 0替换所有True测试,用0替换False的所有测试,那么你就避免了Access关键字的本地化问题(我很惊讶VBA和Jet和Access表达式但是服务仍然不会理解True / False,以及数据库引擎用于存储布尔值的任何约定。

一般来说,您的数据访问层应该为您抽象出来。 ODBC和ADO都会自动执行,因此您可以使用您知道的布尔值,并根据我的经验透明地为您处理。

我仍然对这个问题感到困惑,因为它听起来像是一个显示/格式问题,但使用NOT 0和= 0表示True和False可以完全避免这个问题。

编辑:关于编辑菲利普问题的功能:

您是否有理由将函数的参数隐式定义为变体?你是这个意思吗?如果它传递了Null,它将在第一个CInt()上出错,因为CInt()不能接受Null。

此外,还存在一个逻辑问题,即在VBA中任何数字,但0应该返回True。它也是完全冗余的代码。这更简单,并在所有情况下返回正确的结果:

  Function xBoolean(xLocalBooleanValue As Vriant) as Boolean
    If CInt(xLocalBooleanValue) <> 0 Then
       xBoolean = True
    End If
  End Function

或者,pithier仍然:

  Function xBoolean(xLocalBooleanValue As Variant) as Boolean
    xBoolean = (CInt(xLocalBooleanValue) <> 0)
  End Function

并处理参数中传递的Null:

  Function xBoolean(xLocalBooleanValue As Variant) as Boolean
    xBoolean = (CInt(Nz(xLocalBooleanValue, 0)) <> 0)
  End Function

我不确定你目前正在使用它的上下文中是否有必要,但我总是讨厌编写代码,我可以想象它会出错的情况 - 即使我知道它不会破坏它目前的情境,你永远不知道它最终会被用到哪里,所以你应该预见到一个可以处理的条件,你应该处理它。

过早优化?

不 - 它正在对武器进行安全锁定,防止其被滥用。

(另一方面,如果需要更多行代码来处理反启动错误而不是函数启动时,我会三思而行)

答案 1 :(得分:1)

您是否考虑在更新和删除查询时使用-1/0(Access对于布尔值很奇怪)而不是true / false?

数学是通用语言,yaknow。

另外,为了避免必须对UI进行本地化,为什么不在UI上使用复选框而不是文本字段来表示布尔值呢?

答案 2 :(得分:0)

简单:

Function xBoolean(bool As Variant) As Boolean
    xBoolean = Abs(Nz(bool, 0))
End Function