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 5/2003.

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

Knowledge-Base mit Suchfunktion

Christoph Spielmann, Düsseldorf

Auch erfahrene Access-Entwickler müssen von Zeit zu Zeit passen, wenn knifflige Fragen zu beantworten oder Probleme zu lösen sind. Oft versucht man sich dann mit dem Satz "Ich hab’ da mal was gelesen ..." aus der Affäre zu ziehen (sofern das Gegenüber nicht mit der Frage "Was denn?" kontert). Hierbei soll Ihnen die Knowledge-Base (kurz "KB") helfen, die Ihnen in dieser Musterlösung vorgestellt wird.

Aufbau der Knowledge-Base

Die Knowledge-Base besteht aus einer Ansammlung von Artikeln, die zusammen mit einem Titel, einem Text sowie mehreren Schlüsselwörtern gespeichert werden. Das besondere Augenmerk liegt hierbei in der Suchfunktion, die nicht nur die gefundenen Artikel auflistet, sondern zusätzlich auch den Textausschnitt mit dem gefundenen Text anzeigt.

Feldname

Beschreibung

KBEintragID

AutoWert-Primärschlüssel

EintragstypID

Typ des Eintrags (Text oder Programmcode)

KategorieID

Kategorie, unter der der Eintrag abgelegt ist (z. B. Access, API, Word ...)

Titel

Titel des Artikels (Text)

Text

Artikeltext (Memo)

Schlüsselwörter

Auflistung von Schlüsselwörtern zum leichteren Auffinden eines Beitrags

Tab. 1: Der Aufbau der Tabelle tblKBEinträge

Die Datenstruktur besteht im Wesentlichen aus der Tabelle tblKBEinträge. Hier sind die einzelnen Artikel untergebracht. Sie finden die Struktur dieser Tabelle in Tab. 1.

Bei den Feldern EintragstypID und KategorieID handelt es sich jeweils um Fremdschlüssel, die auf die beiden Tabellen tblEintragstypen und tblKategorien zeigen. Den Aufbau der beiden Tabellen entnehmen Sie dem ER-Diagramm (s. Abb. 1) oder der Beispieldatenbank.

Um die spätere Anlage von Formularen zu vereinfachen, sind die beiden Fremdschlüssel als Nachschlagefelder konfiguriert. Hierbei sind die Eigenschaften aus Tab. 2 definiert.

Eigenschaft

Einstellung

Steuerelement anzeigen

Kombinationsfeld

Herkunftstyp

Tabelle/Abfrage

Gebundene Spalte

2

Spaltenanzahl

2

Spaltenüberschriften

Nein

Spaltenbreiten

5cm;0cm

Zeilenanzahl

16

Listenbreite

Automatisch

Nur Listeneinträge

Ja

Tab. 2: Formulareigenschaften und deren Einstellung

Die Datensatzherkunft des Feldes EintragstypID ist wie folgt eingestellt:

SELECT Eintragstyp, EintragstypID FROM 
tblEintragstypen ORDER BY Eintragstyp;

Die Datensatzherkunft des Feldes KategorieID hat einen ähnlichen Aufbau:

SELECT tblKategorien.Kategorie, tblKategorien.KategorieID FROM tblKategorien
ORDER BY tblKategorien.Kategorie;

Die beiden SQL-Anweisungen fragen jeweils das Text- und das Primärschlüsselfeld beider Nachschlagetabellen ab und sortieren es zudem nach dem Textfeld. Durch die Einstellung der Spaltenbreiten-Eigenschaft ist später nur das Textfeld sichtbar.

Neben den drei bereits vorgestellten Tabellen enthält das Datenmodell noch eine vierte Tabelle namens tblSuchergebnis. Hier wird das Ergebnis eines Suchvorgangs abgelegt. Die genaue Funktion dieser Tabelle lernen Sie später noch kennen.

Abb. 1: Das ER-Diagramm der Musterlösung

Hinweis

Die Datenbank liegt in zwei Versionen für Access 97 (KB97.mdb) und für Access 2000/XP (KB2000.mdb) auf der Heft-CD der vorliegenden Ausgabe von Access im Unternehmen vor. Die Version für Access 97 verwendet einige DAO-Anweisungen für den Datenzugriff, die im Beitrag nicht beschrieben werden. Im Beitrag finden Sie die Beschreibung der Vorgehensweise anhand des ADO-Objektmodells, das in Access 2000 und höher standardmäßig eingesetzt wird. (

Erfassung einzelner Artikel

Die Erfassung und Pflege einzelner Artikel erfolgt über das Formular frmKBEinträge (s. Abb. 2). Als Basis kann ein Standardformular dienen, das Sie mit Hilfe des Formularassistenten von Access anlegen:

  • Wählen Sie den Befehl Formular des Menüpunkts Einfügen aus.
  • Wählen Sie den Assistenten AutoFormular: Einspaltig.
  • Selektieren Sie aus dem Kombinationsfeld die Tabelle tblKBEinträge.
  • Bestätigen Sie mit OK. (
  • Durch die Definition der Nachschlagefelder sollte das neu erzeugte Formular für die beiden Felder EintragstypID und KategorieID bereits zwei Kombinationsfelder enthalten.

    Speichern Sie das Formular unter dem Namen frmKBEinträge.

    Zur Verbesserung des optischen Erscheinungsbildes entfernen Sie noch das Primärschlüsselfeld samt Bezeichnung.

    Aus den Bezeichnungsfeldern der beiden Fremdschlüssel entfernen Sie außerdem das "ID" und vergrößern das Textfeld Text.

    Um von dem Formular einfach in das Suchformular zu wechseln, das später noch angelegt wird, schalten Sie in die Entwurfsansicht um und platzieren im oberen Bereich des Formulars eine neue Schaltfläche.

    Beschriften Sie diese mit dem Text Suchen... und geben Sie ihr den Namen btnSuchen.

    Abb. 2: Das Formular frmKBEinträge

    Abb. 3: Der Kopfbereich des Suchformulars

    Private Sub RefreshUI()

        Me.cmbEintragstypID.Enabled = _
            Me.chkEintragstyp.Value

        Me.cmbKategorieID.Enabled = Me.chkKategorie.Value

    End Sub

    Quellcode 1

    Private Sub chkEintragstyp_Click()

        RefreshUI

    End Sub

    Private Sub chkKategorie_Click()

        RefreshUI

    End Sub

    Private Sub Form_Load()

        RefreshUI

    End Sub

    Quellcode 2

    Zur Anlage der Ereignisprozedur wählen Sie den Befehl Ereignis aus dem Kontextmenü der neu erstellten Schaltfläche.

    Bestätigen Sie das folgende Dialogfenster mit einem Doppelklick auf Code-Generator und ergänzen Sie die Ereignisprozedur wie folgt:

    DoCmd.OpenForm _
        "frmSuchen", acNormal

    Diese Anweisung öffnet das im folgenden Abschnitt vorgestellte Formular frmSuchen.

    Das Suchformular

    Das Suchformular hat zwei Aufgaben: Zu einem ermöglicht es die Erfassung der Suchkriterien und zum anderen zeigt es das Suchergebnis an.

    Zu diesem Zweck kommt ein Formular mit Endlosansicht zum Einsatz, bei dem zusätzlich der Formularkopf eingeblendet ist.

    Im Kopf sind die drei Felder Titel, Eintragstyp und Kategorie untergebracht, die zur Definition der Suchkriterien dienen (s. Abb. 3). Sie können diese Felder aus dem Formular frmKBEinträge kopieren und mit den Namen cmbEintragstypID, cmbKategorieID und txtSuchtext versehen. Zusätzlich sind vor den beiden Kombinationsfeldern zwei Kontrollkästchen untergebracht.

    Hiermit kann der Benutzer später bestimmen, ob der ausgewählte Eintragstyp beziehungsweise die ausgewählte Kategorie bei der Suche berücksichtigt werden soll.

    Private Sub btnSucheStarten_Click()

        SuchergebnisAktualisieren

    End Sub

    Quellcode 3

    If Me.txtSuchtext.Value = "" Then

            MsgBox "Bitte geben Sie einen Suchtext ein!", vbInformation

            Exit Sub

    End If

    Quellcode 4

    SQL = "SELECT * FROM tblKBEinträge"

        SQL = SQL + " WHERE (Titel LIKE " + Quote("%" + Me.txtSuchtext + "%")

        SQL = SQL + " OR Text LIKE " + Quote("%" + Me.txtSuchtext + "%")

        SQL = SQL + " OR Schlüsselwörter LIKE " + Quote("%" + Me.txtSuchtext + "%") + ")"

    Quellcode 5

    Geben Sie den Kontrollkästchen die Namen chkEintragstyp bzw. chkKategorie. Als Standardwert-Eigenschaft tragen Sie für beide Kontrollkästchen den Wert 0 ein.

    Um den Komfort für den Benutzer zu erhöhen, soll das entsprechende Kombinationsfeld deaktiviert werden, sofern das Kontrollkästchen nicht angekreuzt ist. Dies erledigt die Ereignisprozedur RefreshUI (s. Quellcode 1), die im Klassenmodul des Formulars untergebracht ist.

    Der Aufruf dieser Prozedur erfolgt sowohl beim Öffnen des Formulars als auch bei jeder Änderung des Zustands der beiden Kontrollkästchen. Diese Aufgabe übernehmen die drei Ereignisprozeduren aus Quellcode 2.

    Die ersten beiden Prozeduren sind an das On Click-Ereignis der beiden Kontrollkästchen gebunden. Die Dritte ist dagegen mit dem On Load-Ereignis des Formulars verknüpft.

    Zusätzlich befindet sich im Kopf noch eine Schaltfläche namens btnSucheStarten, die den Suchvorgang startet. Die Ereignisprozedur ist wie in Quellcode 3 aufgebaut.

    Sie ruft die Unterprozedur SuchergebnisAktualisieren, die Sie im folgenden Abschnitt kennen lernen.

    Der Suchvorgang

    Wie bereits zu Beginn dieses Artikels erwähnt, besteht die Besonderheit der Suche darin, dass nicht nur die gefundenen KB-Einträge, sondern auch der Textausschnitt, also zum Beispiel die 30 vorhergehenden bzw. nachfolgenden Zeichen mit angezeigt werden. So kann der Benutzer besser entscheiden, ob die Fundstelle seinen Wünschen entspricht.

    Um eine solche Suche zu realisieren, enthält die Datenbank die Tabelle tblSuchergebnis
    (s. Tab. 3).

    Feldname

    Beschreibung

    SuchergebnisID

    AutoWert-Primärschlüssel

    Text

    Gefundener Textausschnitt

    KBEintragID

    Artikel, in dem der Text gefunden wurde

    Priorität

    Relevanz der
    Fundstelle

    Tab. 3: Der Aufbau der Tabelle tblSuchergebnis

    Public Function Quote(Text As Variant) As Variant

        Const Q = "'"

        If IsNull(Text) Then

            Quote = Q & Q

        Else

            Quote = Q & Replace(Text, Q, Q & Q) & Q

        End If

    End Function

    Quellcode 6

    If Me.chkEintragstyp.Value = True Then

        If IsNull(Me.cmbEintragstypID.Value) Then

            MsgBox "Bitte wählen Sie einen Eintragstyp aus!"

            Exit Sub

        Else

            SQL = SQL + " AND EintragstypID=" _
                + Me.cmbEintragstypID.Value

        End If

    End If

    If Me.chkKategorie.Value = True Then

        If IsNull(Me.cmbKategorieID.Value) Then

            MsgBox "Bitte wählen Sie eine Kategorie aus!"

            Exit Sub

        Else

            SQL = SQL + " AND KategorieID=" _
                + Me.cmbKategorieID.Value

        End If

    End If

    Quellcode 7

    With rstEinträge

        .ActiveConnection = CurrentProject.Connection

        .CursorLocation = adUseClient

        .CursorType = adOpenDynamic

        .LockType = adLockOptimistic

        .Source = SQL

        .Open

    End With

    Quellcode 8

    If rstEinträge.RecordCount = 0 Then

        MsgBox "Es wurde kein Eintrag gefunden"

        Exit Sub

    End If

    Quellcode 9

    Das Suchergebnis wird hier mit Hilfe der VBA-Prozedur SuchergebnisAktualisieren eingetragen, sodass dieses dann im Formular angezeigt werden kann.

    Die Prozedur prüft zunächst, ob ein Suchkriterium eingegeben wurde (s. Quellcode 4).

    Sollte dies nicht der Fall sein, bricht die Prozedur ab.

    Anschließend wird eine SQL-Abfrage zur Suche nach dem eingegebenen Text zusammengestellt (s. Quellcode 5).

    Diese SQL-Anweisung sucht mit Hilfe des LIKE-Operators im Titel, im Text sowie bei den Schlüsselwörtern nach dem eingegebenen Text.

    Damit Eingaben inklusive einfacher Anführungszeichen (’) nicht zu einem Fehler führen, werden diese durch die Quote-Funktion doppelt ausgegeben. Access interpretiert diese dann nicht als Beginn einer neuen Zeichenkette innerhalb der SQL-Anweisung (s. Quellcode 6).

    Sollte der Benutzer zusätzlich einen Eintragstyp oder eine Kategorie als Filter definiert haben, wird die Abfrage entsprechend erweitert (s. Quellcode 7). Zusätzlich prüft dieser Anweisungsblock noch, ob zum Beispiel eine Kategorie ausgewählt ist, und gibt gegebenenfalls eine Meldung aus. Im Anschluss daran wird das Ergebnis der Abfrage in ein Recordset geladen (s. Quellcode 8).

    CurrentProject.Connection.Execute ("DELETE * FROM tblSuchergebnisse")

    With rstSuchergebnis

        .ActiveConnection = CurrentProject.Connection

        .CursorLocation = adUseClient

        .CursorType = adOpenDynamic

        .LockType = adLockOptimistic

        .Source = "tblSuchergebnisse"

        .Open

    End With

    Quellcode 10

    While Not rstEinträge.EOF

        Found = False

        If Not IsNull(rstEinträge("Titel")) Then

            If InStr(1, rstEinträge("Titel"), Me.txtSuchtext.Value) <> 0 Then

                TempText = GetFundstellenumgebung(rstEinträge("Titel"), _
                    Me.txtSuchtext.Value)

                rstSuchergebnis.AddNew

                rstSuchergebnis("Text") = TempText

                rstSuchergebnis("KBEintragID") = rstEinträge("KBEintragID")

                rstSuchergebnis("Priorität") = 3

                rstSuchergebnis.Update

                Found = True

            End If

        End If

        If Found = False Then

            If Not IsNull(rstEinträge("Text")) Then

                If InStr(1, rstEinträge("Text"), Me.txtSuchtext.Value) <> 0 Then

                    TempText = GetFundstellenumgebung(rstEinträge("Text"), _
                        Me.txtSuchtext.Value)

                    rstSuchergebnis.AddNew

                    rstSuchergebnis("Text") = TempText

                    rstSuchergebnis("KBEintragID") = rstEinträge("KBEintragID")

                    rstSuchergebnis("Priorität") = 1

                    rstSuchergebnis.Update

                    Found = True

                End If

            End If

        End If

    Quellcode 11 (erster Teil)

    Sollte kein Eintrag gefunden werden, zeigt die Prozedur eine Meldung an (s. Quellcode 9).

        If Found = False Then

            If Not IsNull(rstEinträge("Schlüsselwörter")) _
                Then

                If InStr(1, _
                    rstEinträge("Schlüsselwörter"), _
                    Me.txtSuchtext.Value) <> 0 Then

                    TempText = _
                        GetFundstellenumgebung _
                        (rstEinträge("Schlüsselwörter"), _
                        Me.txtSuchtext.Value)

                    rstSuchergebnis.AddNew

                    rstSuchergebnis("Text") = TempText

                    rstSuchergebnis("KBEintragID") = _
                        rstEinträge("KBEintragID")

                    rstSuchergebnis("Priorität") = 2

                    rstSuchergebnis.Update

                    Found = True

                End If

            End If

        End If

        rstEinträge.MoveNext

    Wend

    Quellcode 11 (Fortsetzung)

    Anschließend wird das Füllen der Tabelle tblSuchergebnisse vorbereitet, indem zuerst alle alten Einträge gelöscht und danach ein leeres Recordset zwecks Anlage neuer Datensätze geöffnet wird (s. Quellcode 10).

    Es folgt eine While Wend-Schleife, in der alle Fundstellen einzeln durchlaufen und in die Tabelle tblSuchergebnisse übertragen werden (s. Quellcode 11).

    Innerhalb der Schleife wird zunächst mit Hilfe der InStr-Funktion geprüft, ob der Suchetext im Titel vorhanden ist. Sollte dies der Fall sein, wird der Eintrag dem Suchergebnis mit der Priorität 1 hinzugefügt. Falls der Eintrag nicht gefunden wurde (die Variable Found also noch den Wert False hat), erfolgt eine Suche im Text und anschließend noch in den Schlüsselwörtern. Hierbei werden jeweils unterschiedliche Prioritäten vergeben.

    Zumindest eine dieser drei Suchen sollte erfolgreich sein, da der KB-Eintrag ansonsten nicht im Suchergebnis der ursprünglichen Abfrage enthalten gewesen wäre.

    Nach Abschluss dieses Vorgangs wird schließlich noch das Suchformular aktualisiert und das Suchergebnis damit angezeigt:

    Me.Requery

    Den vollständigen Aufbau der Prozedur entnehmen Sie der Beispieldatenbank.

    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:

    Suchfunktionen von einfach bis komplex

    Globale Suche

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.