Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Umlaute ...

Begonnen von peter4400, September 10, 2024, 10:51:41

⏪ vorheriges - nächstes ⏩

peter4400

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!)

Bitsqueezer

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

peter4400

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??


peter4400

hahaha passend zum Thema:
Sie dürfen in diesem Board keine Dateianhänge sehen.

MzKlMu

#4
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
Gruß Klaus

Bitsqueezer

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

peter4400

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.

Bitsqueezer

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

PhilS

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.

Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

peter4400

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;

Bitsqueezer

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

Debus

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

peter4400

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.