3 Stimmen

ms-access Lokalisierung und boolesche Standardwerte

Unser Access Client generiert on the fly SQL-Inserts, Update- und Delete-Anweisungen, die an einen MS-SQL Server gesendet werden. Die meisten Benutzer haben die Runtime-Version von Access 2007, und einige wenige verwenden die vollständige MS-Access-Version, 2003 oder 2007. Heute Morgen konnte einer unserer neuen Benutzer im Ausland, der eine französische/komplette Version von Access 2003 verwendet, keine Daten aktualisieren, die boolesche Felder enthalten.

Es stellte sich heraus, dass diese Felder in der französischen Version von Access mit "Vrai/Faux"- anstatt mit "True/False"-Werten befüllt werden. Das Problem wurde durch die Installation der Access-Laufzeitversion 2007 gelöst.

Aber ich möchte eine dauerhafte Lösung finden, bei der ich von irgendwoher ablesen kann, welche lokalisierte Version von Access verwendet wird, und die lokalisierten Wahr/Falsch-Werte in standardmäßige Wahr/Falsch-Werte "übersetzen" kann. Ich habe bereits die regionalen Einstellungen des Computers überprüft, ohne Erfolg, also liegt es irgendwo anders. Irgendeine Idee?

EDIT: Nach dem Vorschlag von JohnFX ist es tatsächlich möglich, mit dieser einfachen Funktion von lokalem True/False in universelles True/False zu konvertieren:

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

EDIT: Nach den Kommentaren von @David habe ich die bevorzugte Lösung geändert. Sein Vorschlag ist schlauer als meiner.

EDIT: Ich erhalte die Vrai/Faux-Werte, indem ich den Wert eines Feldes in einem Recordset lese:

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

2voto

David-W-Fenton Punkte 22473

True ist in jedem Fall NOT FALSE oder NOT 0, unabhängig von der Lokalisierung oder dem Datenbankformat.

Wenn Sie also alle Tests für Wahr durch NICHT 0 und alle Tests für Falsch durch =0 ersetzen, haben Sie das Problem der Lokalisierung der Access-Schlüsselwörter umgangen (ich bin allerdings überrascht, dass VBA und die Ausdrucksdienste von Jet und Access Wahr/Falsch nicht verstehen würden), ebenso wie die Konvention, die Ihre Datenbank-Engine zum Speichern boolescher Werte verwendet.

Im Allgemeinen sollte Ihre Datenzugriffsschicht das für Sie abstrahieren. Sowohl ODBC als auch ADO tun es automatisch, so dass Sie mit den booleschen Werten arbeiten, die Sie kennen, und es wird für Sie transparent erledigt, meiner Erfahrung nach.

Ich bin auch immer noch verwirrt über die Frage, da es sich nach einem Anzeige-/Formatierungsproblem anhört, aber die Verwendung von NOT 0 und =0 für True und False vermeidet das Problem in allen Fällen vollständig.

EDIT: In Bezug auf die Funktion, die in die Frage von Philippe eingefügt wurde:

Gibt es einen Grund, warum Sie den Parameter Ihrer Funktion implizit als Variante definiert haben? Ist es das, was Sie meinen? Wenn eine Null übergeben wird, wird sie beim ersten CInt() fehlschlagen, da CInt() keine Null akzeptieren kann.

Außerdem gibt es ein logisches Problem, denn in VBA soll jede Zahl außer 0 True zurückgeben. Außerdem ist es völlig überflüssiger Code. Dieser Code ist einfacher und liefert in allen Fällen das richtige Ergebnis:

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

Oder, noch prägnanter:

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

Und um Nullen zu behandeln, die im Parameter übergeben werden:

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

Ich bin mir nicht sicher, ob das in dem Kontext, in dem du es gerade verwendest, notwendig ist, aber ich hasse es immer, Code zu schreiben, bei dem ich mir einen Fall vorstellen kann, in dem er fehlschlägt - selbst wenn ich weiß, dass er in seinem aktuellen Kontext nicht versagen kann, weiß man nie, wo er am Ende verwendet werden könnte, also solltest du eine Bedingung vorhersehen, die behandelt werden kann.

Verfrühte Optimierung?

Nein - es geht darum, eine Waffe mit einem Sicherheitsschloss zu versehen, das verhindert, dass sie missbraucht werden kann.

(andererseits würde ich es mir zweimal überlegen, wenn ich mehr Codezeilen bräuchte, um den erwarteten Fehler zu behandeln, als die Funktion zu Beginn hatte)

1voto

JohnFx Punkte 34169

Haben Sie in Erwägung gezogen, -1/0 (Access ist seltsam über Boolesche) anstelle von true/false in Ihrem Update und löschen Abfragen?

Mathematik ist die universelle Sprache, yaknow.

Um zu vermeiden, dass die Benutzeroberfläche so stark lokalisiert werden muss, können Sie auch Kontrollkästchen anstelle von Textfeldern für Boolesche Werte auf Ihrer Benutzeroberfläche verwenden.

0voto

DeeDee Punkte 21

Einfach:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X