Hallo Forum,
wir haben hier eine Tabelle mit Personendaten, die vor 30 Jahren oder so mal in dbase begonnen wurde mit der Regel für die Datenerfasser: mache aus ä->ae,ö->oe ü->ue und aus ß ->ss
Dann haben wir aus einer anderen Datenbank im Prinzip die gleichen Personendaten, aber mit Umlauten.
In beiden Tabellen gibts auch noch das Geburtsdatum.
Ich überlege, ob ich das irgendwie mit dem "natürlichen Schlüssel" Vorname, Nachname, gebdat korrigiert bekomme.
Oder zumindest soweit "vorsortiert", dass eine Aushilfe, die alle Daten durchgehen muss, die jeweiligen Kandidaten aus der Tabelle mit Umlauten möglichst akkurat zu den zu korrigierenden angezeigt bekommt, ohne für jeden Datensatz erst mit STRG-F suchen zu müssen.
Irgendwie müsste ich wohl versuchen, mit den natürlichen Schlüsseln die Tabellen zu verbinden, und dann zu der Tabelle mit den korrekten Namen mit Umlauten in einer Abfrage eine berechnete Spalte erzeugen, die die Umlaute auflöst ... ja, so müsste es gehen ... beim Formulieren des Problems hatte ich die richtige Idee .... danke für Eure Hilfe :)
(noch bessere Ideen wären natürlich super!)
Hallo,
warum "auflöst"? Wenn Du einen passenden Match hergestellt hast, hast Du ja die Namen aus beiden Tabellen, Du könntest dann also einfach die neuen übernehmen und die sonstigen Daten aus den alten.
In der Abfrage per "Replace" alle Umlaute aus der neuen gegen die alten ersetzen, sollte ja nicht schwierig sein. Umgekehrt eher nicht, da z.B. "ae" ja auch etwas anderes als ein ersetzter Umlaut sein könnte, dagegen die "echten" Umlaute aus der neuen Tabelle problemlos mit den Pendants zuverlässig ersetzt werden können, um Matches zu finden (also im JOIN-Ausdruck, nicht mit einem UPDATE).
Gruß
Christian
was ich nicht kapiere, warum macht mir Access in der Abfrage
SELECT
Persdaten.Nachname,
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
Persdaten.Nachname, 'ä', 'ae'), 'ö', 'oe'), 'ü', 'ue'), 'Ä', 'Ae'), 'Ö', 'Oe'), 'Ü', 'Ue') AS AufgeloesteUmlaute
FROM
Persdaten;
aus Ö nicht anweisungsgemäß Oe sondern kleingeschrieben oe ???
Hat da jemand eine Idee??
hahaha passend zum Thema:
222225.JPG
Hallo,
Replace unterscheidet zuerst mal nicht zwischen Groß und Kleinschreibung. Dazu muss erst der binäre Vergleich eingestellt werden. Dazu hat Replace einen entsprechenden (optionalen) Parameter.
Siehe hierzu:
https://learn.microsoft.com/de-de/office/vba/language/reference/user-interface-help/replace-function?f1url=%3FappId%3DDev11IDEF1%26l%3Dde-DE%26k%3Dk(vblr6.chm1008930)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue
Da Du aber eine verschachtelte Replace Anweisung hast, ist es einfacher wenn Du im Modulkopf den binären Vergleich einstellst.
Option Compare Binär
Hallo,
neben dem, was Klaus aufgeführt hat: Für einen Match zwischen der alten und neuen Tabelle brauchst Du das auch nicht. Du willst ja nur Person zu Person zuordnen, also vergiß die Groß-/Kleinschreibung, damit verkürzt sich die Replace-Orgie auf die Hälfte.
Je nach Qualität der Daten würde ich hier immer auch ein Trim verwenden, um Leerzeichen davor und danach zu entfernen.
Gruß
Christian
Zitat von: Bitsqueezer am September 10, 2024, 11:11:03Hallo,
warum "auflöst"? Wenn Du einen passenden Match hergestellt hast, hast Du ja die Namen aus beiden Tabellen, Du könntest dann also einfach die neuen übernehmen und die sonstigen Daten aus den alten.
In der Abfrage per "Replace" alle Umlaute aus der neuen gegen die alten ersetzen, sollte ja nicht schwierig sein. Umgekehrt eher nicht, da z.B. "ae" ja auch etwas anderes als ein ersetzter Umlaut sein könnte, dagegen die "echten" Umlaute aus der neuen Tabelle problemlos mit den Pendants zuverlässig ersetzt werden können, um Matches zu finden (also im JOIN-Ausdruck, nicht mit einem UPDATE).
Gruß
Christian
ich muss sie doch auflösen, um einen Match herzustellen. Ich brauche eine zusätzliche berechnete Spalte mit aufgelösten Umlauten, über die ich den Vergleich anstelle. Klar, ich könnte den Zwischenschritt weglassen und das nicht als Spalte definieren, aber das wird mir zu unübersichtlich.
Hallo,
da Du ja nur voraussichtlich eine einmalige Operation durchführst, brauchst Du ja nur die Replace-Geschichte in den JOIN-Ausdruck einzubauen zwischen den beiden Tabellen.
Aber einen Zwischenschritt über eine Abfrage ist ja auch kein Problem. In Access ist es manchmal auch erforderlich, da Access SQL mit komplexeren Abfragen bisweilen nicht zurechtkommt ohne solche Zwischenschritte.
Gruß
Christian
Wenn man eine Datenbank mit der Sortierreihenfolge "German Phone Book" erstellt, dann werde die ae, oe, ue und ss Umschreibungen in Abfragen als identisch zu ä, ö, ü und ß angesehen.
Nur zur Dokumentation, so funktioniert meine Abfrage nun:
SELECT
Persdaten.Nachname,
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
Persdaten.Nachname, 'ä', 'ae',1,-1,0), 'ö', 'oe',1,-1,0), 'ü', 'ue',1,-1,0), 'Ä', 'Ae',1,-1,0), 'Ö', 'Oe',1,-1,0), 'Ü', 'Ue',1,-1,0),'ß','ss',1,-1,0) AS AufgeloesteUmlaute
FROM
Persdaten;
Hallo,
oder eben viel einfacher mit:
SELECT
Persdaten.Nachname,
REPLACE(REPLACE(REPLACE(REPLACE(Persdaten.Nachname, 'ä', 'ae'), 'ö', 'oe'), 'ü', 'ue'),'ß', 'ss') AS AufgeloesteUmlaute
FROM
Persdaten;
Es spielt, wie gesagt, keine Rolle, wenn die Namen mit falscher Groß-/Kleinschreibung erscheinen. Zum Matchen ist es ohnehin nicht gut, denn oft liegen Datenfehler vor, wo einer "meier" statt "Meier" geschrieben hat und ein genauer Vergleich würde diesen dann nicht finden.
Ich habe hier noch "ß"-Ersetzung ergänzt.
Gruß
Christian
Hey, ich habe das leicht anders gelöst:
Sub ErsetzeSonderzeichen()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim feldname As String
Dim i As Long
Const tabellenname As String = "DeineTabelle"
Const feldname As String = "DeinFeld"
Set db = CurrentDb()
Set rs = db.OpenRecordset(tabellenname)
Do While Not rs.EOF
rs.Fields(feldname).Value = ErsetzeSonderzeichenInText(rs.Fields(feldname).Value)
rs.Edit
rs.Fields(feldname).Value = rs.Fields(feldname).Value
rs.Update
rs.MoveNext
Loop
rs.Close
Set rs = Nothing
Set db = Nothing
MsgBox "Ersetzung abgeschlossen!"
End Sub
Function ErsetzeSonderzeichenInText(text As String) As String
''''''Definition der zu ersetztenden Zeichen
text = Replace(text, "ä", "a")
text = Replace(text, "ö", "o")
text = Replace(text, "ü", "u")
text = Replace(text, "ß", "ss")
****Je nach Bedarf erweiterbar
ErsetzeSonderzeichenInText = text
End Function
Gruß
Holger
Zitat von: Bitsqueezer am September 10, 2024, 13:34:29Es spielt, wie gesagt, keine Rolle, wenn die Namen mit falscher Groß-/Kleinschreibung erscheinen. Zum Matchen ist es ohnehin nicht gut, denn oft liegen Datenfehler vor, wo einer "meier" statt "Meier" geschrieben hat und ein genauer Vergleich würde diesen dann nicht finden.
Da ich mir eine temporäre Tabelle baue, gefällt mir meine Variante besser. Da hab ich dann immer noch hinterher die Wahl, ob ich case-sensitive oder nicht vergleichen will.