2009-10-06 2 views
3

우리의 액세스 클라이언트는 MS SQL 서버에서 보내지는 플라이 SQL 삽입, 업데이트 및 삭제 지침을 생성합니다. 대부분의 사용자는 Access 2007의 런타임 버전을 보유하고 있으며, 일부는 완전한 MS-Access 버전, 2003 또는 2007을 사용합니다. 오늘 아침에 신규 사용자 중 한 명이 프랑스어/전체 버전의 Access 2003을 사용하여 부울 필드.ms- 액세스 지역화 및 기본 부울 값

"True/False"값 대신 "Vrai/Faux"로 채워진 Access 프랑스어 버전의 필드 인 것으로 나타났습니다. 이 문제는 2007 액세스 런타임을 설치하여 해결되었습니다.

하지만 영구적 인 해결책을 찾고 싶습니다. 어딘가에서 Access의 현지화 된 버전을 사용하고 '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 

편집 : 다윗의 의견 @ 다음, 내가 좋아하는 솔루션을 변경 JohnFX 제안에 따라,/지역 진정한이 간단한 기능을 가진 참/거짓 보편적 인 거짓 변환 효과적으로 가능하다 . 그의 제안은 내 것보다 더 똑똑하다.

편집 : 나는 레코드에서 필드의 값을 읽어 Vrai/가짜 값을 얻고있다 :

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

답변

2

모든 경우, 지역화 또는 데이터베이스 형식에 관계없이 True가 거짓이거나 0이 아닙니다.

그렇기 때문에 True에 대한 모든 테스트를 NOT 0으로 대체하고 False with = 0에 대한 모든 테스트를 바꾸면 Access 키워드의 현지화 문제를 피할 수 있습니다 (VBA와 Jet 및 Access 표현 서비스는 여전히 True/False를 이해하지 못할 것입니다.) 그리고 데이터베이스 엔진이 불리 안 값을 저장하기 위해 사용하는 모든 협약이 있습니다.

일반적으로 데이터 액세스 계층은 사용자를 대신하여이를 추상화해야합니다. ODBC와 ADO는 모두 자동으로 처리하므로 사용자가 알고있는 부울 값으로 작업하면 내 경험에 비추어 볼 때 투명하게 처리됩니다.

디스플레이/형식 문제와 같이 들리지만 True와 False에 NOT 0과 = 0을 사용하면 모든 경우에 문제를 완전히 피할 수 있습니다.

편집 : 필립의 질문에 편집 기능에 관해서 :

암시 적 변형으로 함수의 매개 변수를 정의한 이유가 있나요? 이게 네가 말하는거야? 그것은 Null 전달 된 경우 CInt() Null을 받아 들일 수 없으므로 첫 번째 CInt() 오류가 발생합니다.

또한 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 

을 현재 사용하고있는 컨텍스트에서 필요하지는 않은지는 모르겠지만 오류가있는 경우를 상상할 수있는 코드를 작성하는 것을 싫어합니다. 현재 상황에서 깨질 수는 없지만 절대 알지 못합니다.어디에서 사용하게 될지 궁금해 지므로 처리 할 수있는 상태를 예상해야합니다. 처리해야합니다.

조기 최적화?

아니요 - 오용을 방지하는 무기에 안전 잠금 장치를 장착하고 있습니다.

+0

이 기능은 즉시 작성되었습니다. 귀하의 솔루션은 분명히 제 것보다 낫습니다. –

1

은 사용 고려한 -1/0 (액세스 논리 값에 대한 이상한) 대신 진실/false 쿼리 업데이트 및 삭제?

수학은 보편적 인 언어이며, yaknow입니다.

또한 UI를 너무 많이 번역해야하는 번거 로움을 피하기 위해 UI에 부울 텍스트 입력란 대신 체크 박스를 사용하는 것이 어떻습니까?

+0

을 - 1/0은 해결책이지만 SQLServer는 그것을 이해하지 못합니다 : 0/1을 원합니다! –

+0

우리는 이미 checkBoxes를 사용하고 있지만, myChexBox.value는 Access가 프랑스 인 경우 Vrai 또는 Faux를 반환합니다! –

+0

어쨌든 솔루션 경로를 열었습니다. 감사합니다 –

0

간단한 (가 antipated 오류를 처리하는 코드의 더 많은 라인했다 경우 반면에, 함수는 그것에 대해 두 번 생각할 것와 함께 시작보다) :

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

이 문제는 어떻게 해결됩니까? 지금까지 보았 듯이 VBA/Access 스타일 부울 True (-1)를 다른 곳에서 사용 된 부울 True로 변환합니다. 그것은 질문에 관한 것이 아니라 Access에서도 실제 목적을 달성하지 못합니다. –