Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Achtung: Dies ist nicht der vollständige Artikel, sondern nur ein paar Seiten davon. Wenn Sie hier nicht erfahren, was Sie wissen möchten, finden Sie am Ende Informationen darüber, wie Sie den ganzen Artikel lesen können.

Kompletten Artikel lesen?

Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

E-Mail:

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 6/2005.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Zusammenfassung

Erfahren Sie, wie Sie den Soundex-Algorithmus zum Suchen ähnlich lautender Namen verwenden.

Techniken

VBA

Voraussetzungen

Access 97 und höher

Beispieldateien

Soundex97.mdb, Soundex00.mdb

Suchfunktion mit phonetischem Vergleich

Martin Hoffmann, Düsseldorf; André Minhorst, Duisburg

Eine oft benötigte Funktion in einer Datenbank ist das Suchen nach bestimmten Daten. Dies lässt sich mit ein wenig Fleißarbeit leicht realisieren. Interessant wird es, wenn Sie die Suche mit zusätzlichem Komfort ausstatten möchten - etwa, indem Sie der Suchfunktion zusätzlich die Möglichkeit zum Suchen nach ähnlich klingenden Begriffen hinzufügen. Wie man das programmieren soll? Nun, das ist gar nicht schwer. Mit dem so genannten Soundex-Algorithmus erzeugen Sie aus Wörtern einen bestimmten Code, der nicht nur im Englischen, sondern auch im Deutschen verblüffend gute Ergebnisse liefert.

Der Soundex-Algorithmus

Knackpunkt der nachfolgend vorgestellten Suchfunktion ist der Soundex-Algorithmus, der aus einem Namen einen Code aus einem Buchstaben und drei Zahlen erzeugt. Der Algorithmus arbeitet nach den folgenden Regeln:

  • Das erste Zeichen ist der Anfangsbuchstabe des Begriffs.
  • Doppelte Buchstaben werden als einzelner Buchstabe betrachtet.
  • Die Vokale a, e, i, o und u und Umlaute werden genau wie y, w und h nicht beachtet, das scharfe s (ß) wird wie ein normales s behandelt.
  • Alle anderen Buchstaben werden in die in Tab. 1 angegebenen Zahlencodes umgewandelt, wobei bei zwei aufeinander folgenden Buchstaben mit gleichem Code der zweite verworfen wird.
  • Das Codieren erfolgt von links nach rechts. Sind vier Zeichen inklusive dem ersten Buchstaben erreicht, spielen die folgenden Buchstaben keine Rolle mehr. Reichen die relevanten Buchstaben hingegen nicht für einen Code von vier Zeichen aus, werden die restlichen Stellen mit der Ziffer 0 aufgefüllt.
  • Buchstabe

    Soundex-Code

    B, F, P, V

    1

    C, G, J, K, Q, S, X, Z

    2

    D, T

    3

    L

    4

    M, N

    5

    R

    6

    Tab. 1: Buchstaben und die entsprechenden Soundex-Codes

    Quellcode 1: Diese Funktion liefert den Soundex-Wert für eine Zeichenkette.

    Public Function Soundex(sfName As String) As String

      On Error GoTo Soundex_err

      '(c) mdb Solution 1998 (Dirk Bauer)

      Dim sfSoundex(3) As String

      Dim sfZeichen(2) As String, sfZeichenCode(2) As String, _
        sfNameNeu As String

      Dim iAnzZeichen As Integer, i As Integer

      Dim iPos As Integer, iZähler As Integer

      'Zeichenkette in Großbuchstaben umwandeln

      'und Blanks entfernen

      sfName = Trim(UCase(sfName))

      'Umlaute und Sonderzeichen ersetzen

      iPos = 1

      sfNameNeu = ""

      For i = 1 To Len(sfName)

        sfZeichen(0) = Mid(sfName, iPos, 1)

        Select Case Asc(sfZeichen(0))

            Case 192, 193, 194, 195, 196, 197, 198:   'Ä, Á...

            sfNameNeu = sfNameNeu & "AE"

            Case 210, 211, 212, 213, 214, 216:        'Ö...

            sfNameNeu = sfNameNeu & "OE"

            Case 217, 218, 219, 220:                  'Ü...

            sfNameNeu = sfNameNeu & "UE"

            Case 223:                                 'ß

            sfNameNeu = sfNameNeu & "SS"

            Case Is < 65:                             'Sonderzeichen 

            sfNameNeu = sfNameNeu

            Case Else: 'Zeichen ohne Änderung übernehmen

            sfNameNeu = sfNameNeu & sfZeichen(0)   

        End Select

        iPos = iPos + 1

      Next i

      sfName = sfNameNeu

      'Doppelte Zeichen entfernen

      iPos = 1

      sfNameNeu = ""

      For i = 1 To Len(sfName)

        sfZeichen(1) = Mid(sfName, iPos, 1)

        sfZeichen(2) = Mid(sfName, iPos + 1, 1)

        If sfZeichen(1) <> sfZeichen(2) Then

           ' Zeichen 2 ist NICHT doppelt, also schreiben...

           sfNameNeu = sfNameNeu & sfZeichen(1)

        End If

        iPos = iPos + 1

      Next i

      sfName = sfNameNeu

      'Benachbarte Zeichen auf identischen Zifferncode prüfen

      iPos = 1

      sfNameNeu = ""

      For i = 1 To Len(sfName)

        sfZeichen(1) = Mid(sfName, iPos, 1)

        sfZeichen(2) = Mid(sfName, iPos + 1, 1)

        'Code-Ziffer der beiden Zeichen ermitteln

        sfZeichenCode(1) = Soundex_CodeZiffer(sfZeichen(1))

        If sfZeichenCode(1) <> "KeinCode" And i <> Len(sfName)

          '1. Zeichen hat einen Code, also 2. Zeichen prüfen

          sfZeichenCode(2) = Soundex_CodeZiffer(sfZeichen(2))

    Beispiel: Bei der Suche nach dem Nachnamen "Meier" gibt Access in der Regel nur die Personen aus, bei denen die Schreibweise des Namens exakt identisch ist. Mit der Soundex-Suche werden auch Namen wie Mayer, Maier oder Meyer zurückgeliefert, da diese den gleichen Code haben.

    Der Code für alle Varianten lautet M600 - M ist der erste Buchstabe, a, y, i und e fallen aus der Wertung, also bleibt nur noch das r, das dem Zahlenwert 6 entspricht. Da keine weiteren Buchstaben vorhanden sind, wird der Code mit zwei Nullen aufgefüllt.

    Sie haben das Ende des frei verfügbaren Teils des Artikels erreicht. Lesen Sie weiter, um zu erfahren, wie Sie den vollständigen Artikel lesen und auf viele hundert weitere Artikel zugreifen können.

    Sind Sie Abonnent?Jetzt einloggen ...
     

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Verwandte Beiträge:

    Globale Suche

    Fehlertolerantes Suchen

    Suchformularassistent

    Suchfunktionen von einfach bis komplex

    Modale Dialoge mal anders

    Formulare im Blickpunkt

    Zugriff auf Formulare

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.