Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: peter4400 am September 10, 2024, 10:51:41

Titel: Umlaute ...
Beitrag von: peter4400 am September 10, 2024, 10:51:41
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!)
Titel: Re: Umlaute ...
Beitrag von: Bitsqueezer am September 10, 2024, 11:11:03
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
Titel: Re: Umlaute ...
Beitrag von: peter4400 am September 10, 2024, 11:13:46
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??

Titel: Re: Umlaute ...
Beitrag von: peter4400 am September 10, 2024, 11:15:46
hahaha passend zum Thema:
222225.JPG
Titel: Re: Umlaute ...
Beitrag von: MzKlMu am September 10, 2024, 11:28:46
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
Titel: Re: Umlaute ...
Beitrag von: Bitsqueezer am September 10, 2024, 12:09:56
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
Titel: Re: Umlaute ...
Beitrag von: peter4400 am September 10, 2024, 12:34:26
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.
Titel: Re: Umlaute ...
Beitrag von: Bitsqueezer am September 10, 2024, 12:40:54
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
Titel: Re: Umlaute ...
Beitrag von: PhilS am September 10, 2024, 12:47:34
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.

Titel: Re: Umlaute ...
Beitrag von: peter4400 am September 10, 2024, 12:56:16
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;
Titel: Re: Umlaute ...
Beitrag von: Bitsqueezer am September 10, 2024, 13:34:29
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
Titel: Re: Umlaute ...
Beitrag von: Debus am September 10, 2024, 15:32:21
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
Titel: Re: Umlaute ...
Beitrag von: peter4400 am September 11, 2024, 13:24:39
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.