локализация ms-доступа и логические значения по умолчанию - PullRequest
3 голосов
/ 06 октября 2009

Наш клиент доступа на лету генерирует инструкции вставки, обновления и удаления SQL для отправки на сервер MS-SQL. У большинства пользователей есть рабочая версия 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

РЕДАКТИРОВАТЬ: следуя комментариям @ Дэвида, я изменил любимое решение. Его предложение умнее моего.

РЕДАКТИРОВАТЬ: я получаю значения Vrai / Faux, читая значение поля в наборе записей:

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

Ответы [ 3 ]

2 голосов
/ 07 октября 2009

Истина НЕ ЛОЖЬ или НЕ 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

Я не уверен, что это необходимо в контексте, в котором вы сейчас его используете, но я всегда ненавижу писать код, в котором я могу представить себе случай, когда он выдаст ошибку - даже если я знаю, что он не может сломаться В данном контексте вы никогда не знаете, где он может в конечном итоге привыкнуть, поэтому, если вы ожидаете условие, которое может быть обработано, вы должны его обработать.

Преждевременная оптимизация?

Нет - это установка предохранителя на оружие, которое предохраняет его от неправильного использования.

(с другой стороны, если бы для обработки ошибки с антипатированием потребовалось больше строк кода, чем начиналась функция, я бы дважды подумал об этом)

1 голос
/ 06 октября 2009

Рассматривали ли вы использование -1/0 (доступ странен для логических значений) вместо true / false в ваших обновлениях и запросах на удаление?

Математика - универсальный язык, я знаю.

Кроме того, чтобы избежать необходимости локализовывать пользовательский интерфейс, почему бы не использовать флажки вместо текстового поля для логических значений в вашем пользовательском интерфейсе?

0 голосов
/ 07 сентября 2010

Simple:

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