Истина НЕ ЛОЖЬ или НЕ 0 во всех случаях, независимо от локализации или формата базы данных.
Итак, если вы замените все тесты для True на NOT 0 и все тесты для False на = 0, то вы избежали проблемы локализации ключевых слов 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
Или еще более:
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
Я не уверен, что это необходимо в контексте, в котором вы сейчас его используете, но я всегда ненавижу писать код, в котором я могу представить себе случай, когда он выдаст ошибку - даже если я знаю, что он не может сломаться В данном контексте вы никогда не знаете, где он может в конечном итоге привыкнуть, поэтому, если вы ожидаете условие, которое может быть обработано, вы должны его обработать.
Преждевременная оптимизация?
Нет - это установка предохранителя на оружие, которое предохраняет его от неправильного использования.
(с другой стороны, если бы для обработки ошибки с антипатированием потребовалось больше строк кода, чем начиналась функция, я бы дважды подумал об этом)