Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Regionals-Funktionsbibliothek für regionale Formatumwandlung
zurück: TempVars-Collection - Stiefkind aus der Makroprogrammierung weiter: Mehrere Autowerte in einer Tabelle / @@IDENTITY Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
29. Mai 2013, 21:28
Rufname:

Regionals-Funktionsbibliothek für regionale Formatumwandlung - Regionals-Funktionsbibliothek für regionale Formatumwandlung

Nach oben
       Version: (keine Angabe möglich)

Hallo zusammen,

Normen sind etwas schönes, wenn es um Datenbanken geht: Man hat ein definiertes Format, wie etwas aussehen soll und kann sich danach richten, Daten auf diese Weise einzugeben oder auszugeben.

Leider sind länderspezifische Dinge alles andere als normiert und Windows unterstützt das Chaos noch damit, daß es in den Regional Settings auch noch die Definition eigener Formate z.B. für Währung oder Datumsformat usw. erlaubt. Das wäre alles nicht so schlimm, wenn sich nicht diverse VBA-Funktionen und Formulareinstellungen danach richten würden.

So gibt es beispielsweise den List Separator, das ist das Zeichen, das in Comboboxen und Listboxen verwendet wird, um im Fall einer Wertliste die Werte voneinander zu trennen. Default in Deutschland ist Semikolon (";"), in den USA aber Komma (","). Bei der Combobox kann man seit A2007 einen eigenen festen Wert für das Zeichen definieren - bei der Listbox wiederum nicht, die verwendet die Einstellungen des Betriebssystems. Entsprechend funktioniert mancher Code in anderen Ländern wegen solcher Kleinigkeiten plötzlich nicht mehr.

Das gilt aber auch für elementar wichtige Dinge wie den Format-Befehl oder die Input Mask in Textboxen. Je nach Regionaleinstellungen von Windows erzeugt etwa die gleiche Input Mask einen Fehler in einen Fall und bei einer anderen Einstellung funktioniert sie wie gewünscht - weil die Zeichen anders interpretiert werden.

Auch Funktionen wie Val und die "C..."-Funktionen (CDate, CDbl usw.) richten sich nach den Regionaleinstellungen. Hat man auch noch mit verschiedenen Eingabedaten zu kämpfen, die aus unterschiedlichen Ländern kommen, ist das Chaos komplett - ein Datum mit "IsDate" zu identifizieren, ist je nach lokaler Regionaleinstellung mal erfolgreich und mal nicht.

Aber in der Ausgabe sieht es nicht besser aus: Wenn man ein Datum für Access oder für SQL Server ausgeben möchte, gibt es viele mögliche Formate, die Access anhand der Regionaleinstellungen von Windows umwandelt und SQL Server i.d.R. anhand der Spracheinstellung in SQL Server - dabei haben beide jeweils ein Standardformat, das in jeder Region funktioniert.

Will man wiederum einen Kalender programmieren, der die lokalen Monats- und Tagesnamen unterstützt, muß man sich normalerweise entscheiden, welche man implementiert, weil die Zahl der nötigen String-Arrays für alle Länder ziemlich groß wäre.

Alle diese Probleme versucht die vorliegende Klasse "clsCCRegionals" zu lösen (so gut es geht).

Die Lösung basiert ganz einfach darauf, daß man fast alle nötigen Informationen direkt aus dem Betriebssystem erhalten kann. Hier sind sämtliche Länder, Sprachen, Währungen, Datums- und Zeitformate, Tages- und Monatsnamen, Trennzeichen für Tausender und Dezimaltrennzeichen, der List Separator und vieles mehr gespeichert - also warum das Rad neu erfinden?

Leider sind einige Informationen nicht sehr logisch organisiert und mit jeder neuen Windows-Version wird das Chaos vergrößert (manchmal frage ich mich, wer sich bei Microsoft solche Strukturen ausdenkt...). So gibt es etwa keine echte Ländertabelle, sondern nur eine Tabelle mit "Locales", die gleichzeitig Land und Sprache darstellen. Allerdings nicht in der Reihenfolge. So findet man eine Liste von Locales mit "English", die eben alle Länder betreffen, die englischsprachig sind, aber ebenso findet sich ein Locale wie "Zulu", was lediglich eine Landessprache in Südafrika ist, aber kein Land.
Dann gibt es auch Locales, die im gleichen Land zwischen Latin- und Cyrillic-Schreibweise unterscheiden usw...

Daher habe ich in der Klasse ein Array für Länder erstellt, das (hoffentlich) alle Länder jeweils einmal enthält, mit dem Locale der Landessprache, die im jeweiligen Land am häufigsten gesprochen wird. Man kann sich über die Funktion "fnCountryValueList" eine Tabelle zusammenstellen, die verschiedene zusätzliche Informationen ausgibt, etwa Sprache oder Währung usw.

Weiterhin ist eine zentrale Funktion die Function "fnValidateDateAndTime", die einen String entgegennimmt und versucht, irgendwie ein Datum und eine Zeit aus diesem String herauszulesen, und sofern irgendwie interpretierbar, legt sie einen Datums/Zeitwert in der Klasse ab und gibt zurück, ob die Umwandlung erfolgreich war oder nicht. Dieser Wert kann dann über diverse Funktionen und Eigenschaften in unterschiedlichen Formaten ausgegeben werden, etwa für SQL Server oder Access mit "SQLDateAndTime" (abhängig von den Parametern), oder aber konvertiert in ein Zielformat mit Eigenschaften wie "DateAndTimeString" oder "TimeOnlyString" usw.

Im Code können immer alle Locales ausgewählt werden, die Demo zeigt allerdings nur die aus der Ländertabelle an.

Mit der zentralen Funktion "fnLocaleInfo" können ALLE Windows Regional Settings aller Locales ausgelesen werden. Diese können im Code bequem über entsprechende Enums ausgewählt werden, allerdings muß man bei dieser Funktion wissen, was die Rückgabewerte bedeuten. Eine Erläuterung der einzelnen Werte ist im Code bei den Enums enthalten.

Für die Konvertierung von Werten gibt es gleich drei "Val"-Funktionen: fnVal, fnValLocale und fnValParse. "fnVal" wandelt einen String in eine Zahl unter Verwendung des User Locales (wie es auch die VBA-Funktionen machen) - allerdings kann man auch einen beliebigen Thousand- und Decimal-Separator angeben und so auch anders formatierte Zahlen erfolgreich umwandeln. "fnValLocale" macht das gleiche unter Verwendung des angegebenen Locales. Hier werden Thousand- und Decimal-Separator aus dem angegebenen Locale geholt. "fnValParse" versucht, selbständig herauszufinden, ob der Thousand-String ein Punkt oder Komma ist, ebenso der Decimal-Separator, und wandelt dann die Zahl um. Hierbei werden keine Windows Locales verwendet, es werden nur diese beiden Formate überprüft. Dabei wird allerdings ebenso jedes Zeichen entfernt, das keine Zahl ist und außerdem alle doppelten Kommas oder Punkte. Somit kann man auch gelegentliche Schreibfehler in Importdaten damit konvertieren.

Das Demoformular der Beispieldatenbank zeigt diverse Möglichkeiten, wie man die Klasse nutzen kann. Das ist allerdings nur ein Auszug der Möglichkeiten. Die Windows Locales geben noch einiges mehr her.

Als Extra gibt es außerdem noch eine Konvertierung des genialen "Mischsort"-Algorithmus von H.-A. Kosog, der den Algorithmus 1985 in der Zeitschrift "64er" veröffentlicht hat. Näheres findet sich unter diesem Link:

Arrays in VBScript sehr schnell sortieren - Mischsort von 1985

(Darunter findet sich auch ein weiterer Link, der auf einen Artikel vom Autor verweist, in der er einen neueren Algorithmus beschreibt, der hier allerdings nicht verwendet wurde.)

Mit der Mischsort-Funktion kann man beliebige eindimensionale Arrays sortieren. Die Funktion "fnCountryValueList" zeigt, wie man diese auch bei einem zweidimensionalen Array anwenden kann.

Mit dieser Klasse sollte es möglich sein, einige Regionalprobleme mit Daten in Zukunft zu vermeiden. Das Modul "modObjects" wird nur verwendet, um über die "REG"-Funktion immer eine Instanz der Klasse verwenden zu können. Man kann aber auch, wie üblich, einfach eine Objektvariable erstellen und instantiieren, dann benötigt man das Modul nicht.

Die Datei ist in den Formaten A2000-2007, außerdem ist das Klassenmodul und das Standardmodul als Textdatei enthalten, für den Import in andere Versionen. Geschrieben und getestet in A2007.

Viel Spaß beim Experimentieren

Christian



CCRegionals.zip
 Beschreibung:
clsCCRegionals mit Demoformular, Funktionsbibliothek für regionale Formate und Mischsort, Formate A2000-2007 und Textdateien

Download
 Dateiname:  CCRegionals.zip
 Dateigröße:  746.57 KB
 Heruntergeladen:  19 mal

Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
30. Mai 2013, 14:14
Rufname:


AW: Regionals-Funktionsbibliothek für regionale Formatumwand - AW: Regionals-Funktionsbibliothek für regionale Formatumwand

Nach oben
       Version: (keine Angabe möglich)

Kleiner Tip am Rande:

Die LocaleID etwa der Benutzeroberfläche von Access bekommt man aus dem Application-Object von Access:
Code:
Debug.Print LanguageSettings.LanguageID(msoLanguageIDUI)
Die Funktion verfügt über weitere Konstanten, z.B. für die Online-Hilfe etc.
GastAusBerlin
Gast


Verfasst am:
30. Mai 2013, 16:27
Rufname:

AW: Regionals-Funktionsbibliothek für regionale Formatumwand - AW: Regionals-Funktionsbibliothek für regionale Formatumwand

Nach oben
       Version: (keine Angabe möglich)

Hallo

ist mal wieder ein cooles Ding.
Aber, ich musste in der Deklaration apiGetLocaleInfo auf die W-Variante verweisen, damit die meisten Datumse richtig angezeigt werden (hier Access 2003 falls es wichtig ist)
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
30. Mai 2013, 23:30
Rufname:

AW: Regionals-Funktionsbibliothek für regionale Formatumwand - AW: Regionals-Funktionsbibliothek für regionale Formatumwand

Nach oben
       Version: (keine Angabe möglich)

Hallo GastAusBerlin,

danke für's Testen und den Hinweis. Die "W"-Variante holt die Daten als Unicode, einfach nur wechseln würde nicht reichen, der Buffer in der Funktion fnLocaleInfo müßte verdoppelt werden und das Ergebnis mit StrConv wieder in einen lesbaren String verwandelt werden.

Bin aber immer für Verbesserungen offen, wenn Du eine Methode hast, die Unicode-Zeichen anderer Länder mit der W-Variante lesbar zu machen - ist mir nicht gelungen.

Gruß

Christian
GastAusBerlin
Gast


Verfasst am:
31. Mai 2013, 00:00
Rufname:

AW: Regionals-Funktionsbibliothek für regionale Formatumwand - AW: Regionals-Funktionsbibliothek für regionale Formatumwand

Nach oben
       Version: (keine Angabe möglich)

Hallo Christian

da VBA ja Unicode ist, verwende ich immer die W-Varianten, wenn diese zur verfügung stehen. Hierbei muss aber der Pointer des STrings übergeben werden, da VBA Strings bei API-Deklarationen immer automatisch die Strings bei der Übergabe in Ansi wandelt.
Die Deklaration ist dann:
Code:
Private Declare Function apiGetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoW" _
                                         (ByVal lngLocale As Long, _
                                          ByVal lngLocaleType As Long, ByVal strLocaleDataBuffer As Long, _
                                          ByVal lngDataBufferSize As Long) As Long
Den Buffer must du nicht ändern, nur den Aufruf der apiGetLocaleInfo, einaml in
Code:
    lngLength = apiGetLocaleInfo(lngLocaleType, lngLocaleSettingType, 0, 0)
und dann noch in
Code:
    lngLength = apiGetLocaleInfo(lngLocaleType, lngLocaleSettingType, StrPtr(strLocaleBuffer), lngLength)

Gruss
Daniel
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
31. Mai 2013, 01:10
Rufname:


AW: Regionals-Funktionsbibliothek für regionale Formatumwand - AW: Regionals-Funktionsbibliothek für regionale Formatumwand

Nach oben
       Version: (keine Angabe möglich)

Hallo Daniel,

danke für diese Verbesserung, das war das i-Tüpfelchen, das noch gefehlt hat! Jetzt sieht man etwa griechische Monatsnamen auch in der passenden Schrift (und hofft, daß es stimmt, ich kann das nicht lesen...Wink ).

Für alle, die sich die Änderung nicht selbst zutrauen, im Anhang die geänderte Klasse nochmal als Textdatei zum Import in die eigene Datenbank.

Gruß

Christian



clsCCRegionals.zip
 Beschreibung:
clsCCRegionals.cls in der Version 1.2 mit der Verbesserung von Daniel für die Darstellung von Unicode-Zeichen

Download
 Dateiname:  clsCCRegionals.zip
 Dateigröße:  17.52 KB
 Heruntergeladen:  20 mal

Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Access Tabellen