vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
SEPA-Dateien erstellen inkl. IBAN-, BLZ-/Kontonummernprüfung  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Datenbanken   |   VB-Versionen: VB5, VB601.04.01
Einführung in die Datenbankprogrammierung mit VB Teil 2

Im zweiten Teil unseres DB-Workshops lernen Sie verschiedene Möglichkeiten kennen, um Datensätze schnell aufzufinden (Datenfeld-Indizierung). Außerdem erfahren Sie, wie eine Datenbank-Tabelle nach bestimmten Datenfeldern sortiert werden kann.

Autor:  Dieter OtterBewertung:     [ Jetzt bewerten ]Views:  26.158 

Im zweiten Teil dieses Workshops lernen Sie verschiedene Möglichkeiten kennen, um Datensätze schnell aufzufinden. Hierzu werden bestimmte Datenfelder indiziert, d.h. es werden Indexes angelegt, mit deren Hilfe Datensätze in einem Bruchteil einer Sekunde gesucht werden können. Außerdem erfahren Sie, wie eine Datenbank-Tabelle nach bestimmten Datenfeldern sortiert werden kann. Am Ende dieses Workshops sollten Sie in der Lage sein, zu entscheiden, wann und wie sich Indexfelder einsetzen lassen und selbständig entsprechende Suchroutinen in Ihre Datenbank-Anwendung zu integrieren.

Was sind Indexfelder und wann lassen sich diese sinnvoll einsetzen?

Indexfelder spiegeln eine bestimmte Sortierfolge der Datensätze innerhalb der Datenbank wieder. Die Art und Weise der Sortierung lässt sich fast beliebig festlegen. So kann für ein Indexfeld ein einzelnens Datenfeld oder eine Kombination aus mehreren Datenfeldern festgelegt werden. Auch die Sortierfolge lässt sich individuell einstellen (auf- oder absteigende Sortierung). Indexfelder dienen in erster Linie der Perfomance des Datenbanksystems. So erfolgt die Suche eines bestimmten Datensatzes auch bei großen Datenmengen in sekundenschnelle. Als Beispiel sei hier eine Kunden-Datenbank mit 25.000 gespeicherten Kunden-Datensätze genannt. Die Suche eines ganz bestimmten Kunden anhand des Namens erfolgt in der Regel in weniger als einer Sekunde.

Wie Sie jetzt bereits erahnen, lassen sich also Indexfelder immer dann sinnvoll einsetzen, wenn es um die Suche nach Inhalten bestimmter Datenbankfelder geht. Ein weiterer sehr vorteilshafter Aspekt ist das sortierte Blättern innerhalb des Datenbank-Bestandes. Ohne Indexfelder erfolgt das Blättern immer in der Reihenfolge, in der die Datensätze auch erfasst wurden. Soll jedoch das Blättern sortiert nach dem Kundennamen erfolgen, benötigen Sie ein Indexfeld auf das Datenfeld "Namen". Das Blättern innerhalb der Datensätze erfolgt dann alphabetisch nach Namen- ganz ohne zusätzlichen Quellcode.

An dieser Stelle soll noch gleich ein dritter wichtiger Aspekt vorweggenommen werden, welcher bei sehr großen Datenbeständen eine nicht unerhebliche Perfomance-Rolle spielt. Gerade bei umfangreicheren SQL-Abfragen (SQL=enngl. "Structured Query Language") spielen Indexfelder in Sachen Geschwindigkeit eine große Rolle. Um beim obigen Beispiel zu bleiben (Suche nach Kundennamen), sind durchaus Differenzen von bis zu 30 Sekunden möglich. Mehr zur Datenbank-Abfragesprache "SQL" erfahren Sie im nächsten (dritten) Teil des Datenbank-Workshops.

Der vierte Aspekt für den Einsatz von Indexfeldern ist das Herstellen von Relationen (Beziehungen) zweier oder mehrerer Datenbanktabellen miteinander. So lassen sich z.B. in der einen Tabelle alle Kunden-Stammdaten speichern, in einer weiteren Tabelle alle Aufträge der einzelnen Kunden. Um nun alle Aufträge eines bestimmten Kunden anzuzeigen, muß mindestens ein gemeinsames Datenfeld existieren, und zwar in allen in Relation zueinanderstehenden Tabellen. Hierfür eignet sich besonders die Kundennummer, da es jeden Kunden-Datensatz eindeutig kennzeichnet. Der Index wird in diesem Zusammenhang auch als Primärschlüssel bezeichnet (engl. primary key). Primärschlüssel besitzen die Eigenschaft, daß ihr Inhalt pro Tabelle nur einmal vorkommen darf, was bei der Kundennummer ja gegeben ist - im Gegensatz zum Kundennamen, welcher ja durchaus mehrfach vorkommen kann. In der Tabelle der gespeicherten Aufträge spricht man dann nicht von Primärschlüssel, sondern von Fremdschlüssel. Der Inhalt der Kundennummer ist in der Auftragstabelle ja auch nicht eindeutig, da für einen Kunden durchaus mehrere Aufträge gespeichert sein können, d.h. jeder kundenbezogene Auftrags-Datensatz hat ein und dieselbe Kundennummer. Bei dieser Art von Relation spricht man von einer 1:n - Beziehung, d.h. für einen Datensatz der Kundentabelle existieren 1...n Datensätze in der Auftragstabelle. Mehr zu Datenbank-Relationen in einem unserer nächsten Teile des Datenbank-Workshops.

Erstellen von Indexes

So viel zur Theorie, nun zur Praxis. Anhand der kleinen Adress-Datenbank aus Teil 1 des Workshops wird nachfolgend der Einsatz und die Programmierung von Indexfeldern Schritt für Schritt erläutert.

Für welche Felder sollen Indexes erstellt werden?

Die Antwort auf die Frage liegt ganz bei Ihnen:
"Welche Such- und Sortiermöglichkeiten benötigen Sie?" - genau: Namen und die Kombination aus PLZ und Ort

Erstellen eines Indexfeldes für "Namen"
Das Erstellen eines neuen Indexes ist relativ einfach.

Zunächst muß jedoch die Datenbank-Datei geöffnet werden. Wichtig ist, daß die Datenbanktabelle, für welche ein neuer Index erstellt werden soll, hierbei nicht geöffnet ist. Ggf. muss die Datenbanktabelle zunächst geschlossen werden (Tabelle.Close).

' Datenbank öffnen
Dim Db As Database
Dim dbFile As String
 
dbFile = App.Path + "\ADRESS.MDB"
Set Db = Workspaces(0).OpenDatabase(dbFile, False, False)

Index erstellen:

Dim Index As New Index
 
Index.Name = "Name"
Index.Primary = False
Index.Unique = False
Index.Fields = "Name"
 
' Hinzufügen zur Indexes-Auflistung
Db.TableDefs("Adressen").Indexes.Append Index
Set Index = Nothing

Erläuterungen:
Um einen Index erstellen zu können müssen Sie eine Objekt-Variable vom Typ New Index deklarieren. Diese Objekt-Variable besitzt mehrere Eigenschaften, wie Name, Primary, Unique und Fields.

Die Name-Eigenschaft ist selbsterklärend und gibt den Namen des Indexes an. Zu beachten ist, daß jeder Index innerhalb der Datenbank-Tabelle einen eindeutigen Namen besitzen muss.

Die Primary-Eigenschaft gibt an, ob es sich um einen Primärschlüssel handelt. Ein Primärschlüssel besteht aus einem oder mehreren Datenbankfeldern, die alle Datensätze innerhalb der Tabelle eindeutig kennzeichnen. Wird die Primary-Eigenschaft auf True gesetzt, wird der Index als Primärindex festgelegt. Die Unique-Eigenschaft legt ebenfalls fest, ob das indizierte Datenfeld oder die Kombination aus mehreren Datenfeldern eindeutig sein muss. Wird für Unique der Wert True angegeben, lassen sich keine Datensätze speichern, bei denen das indidzierte Datenfeld nicht eindeutig ist. Wird Primary auf True gesetzt, so wird automatisch auch Unique auf True festgelegt.

Im Falle des Namens setzen Sie also weder Primary noch Unique auf True, da ja der Name durchaus mehrfach vorkommen kann.

Nun muss noch festgelegt werden, welches Datenfeld indiziert werden soll. Die Zuweisung erfolgt über die Fields-Eigenschaft. Zu beachten ist, daß der exakte Feldname des Datenfeldes innerhalb der Tabelle angegeben werden muss. Ein Index kann auch aus mehreren Datenfeldern bestehen. Die Angabe der Datenfelder erfolgt dann durch Trennung mit dem Semikolon-Zeichen (;). Ein Beispiel für solch ein Kombinations-Indexfeld finden Sie gleich im Anschluß bei der Erstellung des Indexes für die Felder PLZ und Ort. Als Voreinstellung erfolgt die Sortierung immer in aufsteigender Reihenfolge (A-Z oder 0-100). Möchten Sie eine Sortierung in absteigender Reihenfolge geben Sie einfach vor dem Feldnamen ein Minuszeichen ein (-).

...
' Sortierung in absteigender Sortierfolge
'Z-A oder 100-0)
Index.Fields = "-Name"
...

Jetzt muss nur noch das Index-Objekt der Datenbank-Tabelle (besser gesagt der Indexes-Auflistung der Tabelle) hinzugefügt werden. Dies geschieht über den Befehl:

Db.TableDefs("Adressen").Indexes.Append Index

Das war's dann auch schon. Mit Hilfe dieser paar Codezeilen haben Sie einen neuen Index erstellt.

Neben dem Namen soll noch ein Index für die PLZ und den Ort erstellt werden. Hierbei handelt es sich um ein Kombinations-Index, d.h. der Index besteht aus der Kombination mehrerer einzelner Datenfelder.

Dim Index As New Index
 
Index.Name = "PlzOrt"
Index.Primary = False
Index.Unique = False
Index.Fields = "PLZ;Ort"
 
' Hinzufügen zur Indexes-Auflistung
Db.TableDefs("Adressen").Indexes.Append Index
Set Index = Nothing

Wie Sie sehen, erfolgt die Angabe mehrere Datenfelder getrennt durch das Semikolon-Zeichen (;). Dies ist dann auch schon die einzige Änderung gegenüber dem Erstellen von Indexes über ein einzelnes Datenfeld. Die Sortierung erfolgt bei Kombinationsfeldern zunächst nach dem ersten Datenfeld. Innerhalb gleicher Datenfeld-Inhalte erfolgt die Sortierung dann nach dem zweiten Datenfeld. Im obigen Beispiel werden die Datensätze also zunächst nach den Postleitzahlen sortiert. Innerhalb gleichlautender Postleitzahlen erfolgt die Sortierung dann nach Orten (A-Z).

Beispiel:

97616;Bad Neustadt
97618;Hohenroth
97618;Leutershausen
97618;Windshausen
97708;Bad Bocklet
usw.

Primärindex (Primärschlüssel)

Für die bisher erstellten Indexes wurde dir Primary-Eigenschaft immer auf False gesetzt. Zur Vollständigkeit soll nun noch ein Index als sogenannter Primärschlüssel erstellt werden, d.h. die Inhalte dieses Schlüssels müssen eindeutig sein - oder anders gesagt, es dürfen keine Datensätze gespeichert werden, mit doppelten Feldinhalten. Hierfür eignet sich eigentlich nur das Feld AdressNr, welches durch seine Eigenschaften so definiert ist, daß der Inhalt selbständig von der JET-Datenbank aktualisiert wird. Alternativ ließe sich auch eine Kombination aus Namen und Telefon-Nr. festlegen, wobei dann darauf zu achten ist, daß bei gleichlautenden Namen in jedem Falle unterschiedliche Telefon-Nummern gespeichert sein müssen.

Dim Index As New Index
 
' Primärschlüssel (eindeutiger Index)
Index.Name = "Nr"
Index.Primary = True
Index.Unique = True
Index.Fields = "AdressNr"
 
' Hinzufügen zur Indexes-Auflistung
Db.TableDefs("Adressen").Indexes.Append Index
Set Index = Nothing

Der Primärschlüssel spielt für den momentanigen Stand der Adressdatenbank keine wesentliche Rolle, könnte also auch weggelassen werden. In Hinsicht auf den weiteren Verlauf des Datenbank-Workshops soll jedoch die Möglichkeit bestehen, zu jeder Adresse unbestimmt viele Kontakte speichern zu können, welche in einer eigenen Datenbank-Tabelle "abgelegt" werden. Als Kontakt kommen Telefonanrufe, Briefverkehr, Emails oder auch Faxe in Frage. Mehr dazu in den nächsten Teilen des Workshops.

Festlegen des aktiven Index für das Blättern und Anzeigen von Datensätzen

Nachdem alle benötigten Indexes erstellt sind, kann die Datenbank-Tabelle (wieder) geöffnet werden. Nach dem Öffnen der Datenbank-Tabelle ist standardmäßig kein Index gesetzt, d.h. die Anzeige der Datensätze erfolgt in der Reihenfolge der Eingabe (ohne Berücksichtigung einer Sortierung).

Das Festlegen des aktiven Indexes erfolgt durch eine einzige Codezeile:

' ggf. Tabelle öffnen
Set Tabelle = Db.OpenRecordset("Adressen")
 
' Festlegen des aktiven Indexes
Tabelle.Index = "Name"

Nachdem Sie den aktiven Index über die Index-Eigenschaft des Tabellen-Objektes festgelegt haben, befindet sich der Datensatz-Zeiger auf den ersten Datensatz innerhalb der für den Index festgelegten Sortierfolge. Im obigen Beispiel erfolgt die Sortierung demnach alphabetisch (Ziffern, A-Z) nach Namen.

Über die Methoden MoveFirst, MoveNext, MovePrevious und MoveLast kann die Datenbank also jetzt sortiert nach Namen "durchgeblättert" werden.

Hinweis:
Im ersten Teil des Workshops haben Sie erfahren, wie man einen neuen Datensatz speichern kann. Anzumerken ist, daß der neue Datensatz dann automatisch an die durch die Sortierfolge festgelegte korrekte Position innerhalb des gesamten Datenbestandes einsortiert wird. Eine "Umsortierung" eines Datensatzes erfolgt auch, wenn das indizierte Datenfeld eines bestehenden Datensatzes verändert wird.

Beispiel:
Die Sortierfolge der Adress-Datenbank ist auf Namen festgelegt. In der Bildschirmmaske wird die Adresse Meier Hans angezeigt, welche z.B. den 17. Datensatz wiedergibt. Nun erfolgt eine Änderung am Datensatz, und zwar wird als neuer Name 1. FC Musterverein eingetragen. Nach dem Speichern der Änderung(en) befindet sich der Datensatz-Zeiger nicht mehr an 17. Position, sondern an der ersten Position.

Und noch eine Anmerkung zur Sortierung:
Die Sortierfolge alphanumerischer Feldinhalte erfolgt nach dem ASCII-Zeichensatz. D.h. ein Name, welcher mit einer Zahl beginnt wird in jedem Fall vor einem Namen mit dem Buchstaben A einsortiert, da die Zahlen im ASCII-Zeichensatz an Position 48 bis 57, Buchstaben erst ab Position 65 (A) zu finden sind.

Gezielte und schnelle Suche nach indizierten Datenfeldern

Wie bereits eingangs erwähnt, ist ein wesentlicher Vorteil von Indexes die hervorragende Performance bei der Suche nach bestimmten Datensätzen (genauer gesagt: bei der Suche nach bestimmten Feldinhalten). So lassen sich Datensätze auch bei großen Datenmengen in sekundenschnelle (meist sogar in einem Bruchteil einer Sekunde) auffinden.

Die Suche erfolgt hierbei über die eigens hierfür von der JET-Datenbank bereitgestellte Methode Seek.

' Festlegen des aktiven Indexes
Tabelle.Index = "Name"
 
' Suchen nach "Meier"
Tabelle.Seek "=", "Meier"

Nach jedem Suchvorgang sollte geprüft werden, ob auch tatsächlich ein entsprechender Datensatz gefunden wurde:

' Prüfen, ob Suche erfolgreich
If Not Tabelle.NoMatch Then
  ' Datensatz gefunden
  DatensatzAnzeigen
Else
  ' kein Datensatz vorhanden
  MsgBox "Kein entsprechender Datensatz gespeichert."
End If

Die Erfolgs-Abfrage erfolgt über die Eigenschaft NoMatch, was soviel bedeutet, wie keine Übereinstimmung. Die Eigenschaft NoMatch gibt hierbei True zurück, wenn kein Datensatz gefunden wurde und dementsprechend False, falls ein entsprechender Datensatz existiert.

Existiert ein entsprechender Datensatz, so befindet sich der Datensatz-Zeiger automatisch auf den gefundenen Datensatz, d.h. der Datensatz könnte. sofort in der Bildschirmmaske angezeigt werden. Dies erledigt die Prozedur DatensatzAnzeigen aus Teil 1 des Workshops.

Erweiterte Suche und Erfolgskontrolle

Wichtig
War die Suche hingegen erfolglos, so befindet sich der Datensatz-Zeiger immer am Ende der Datenbank-Tabelle, genauer gesagt auf die Position nach dem letzten Datensatz (Null-Zeiger). Sie sollten sich deshalb stets vor einer Suchaktion den aktuellen Datensatz-Zeiger zwischenspeichern und diesen nach erfolgloser Suche wieder auf den ursprünglichen zurücksetzen.

Hierfür stellen wir Ihnen die nachfolgenden zwei Prozeduren vor, welche sich universell einsetzen lassen.

Public Sub GetBookmark(Tabelle As Recordset, _
  CurRec As String, CurIdx As String)
  ' Datensatz-Zeiger merken
  On Local Error Resume Next
  CurIdx = Tabelle.Index
  CurRec = Tabelle.Bookmark
  If Err Then CurRec = ""
  On Local Error GoTo 0
End Sub
Public Function SetBookmark(Tabelle As Recordset, _
  CurRec As String, CurIdx As String) As Integer
  ' Datensatz-Zeiger zurücksetzen
  Dim Result As Integer
 
  On Local Error Resume Next
  Result = True
  Tabelle.Index = CurIdx
  If CurRec <> "" Then
    Tabelle.Bookmark = CurRec
    If Err <> 0 Then Result = False
  Else
    Tabelle.MoveLast
    Tabelle.MoveNext
  End If
  On Local Error GoTo 0
 
  SetBookmark = Result
End Function

Die erweiterte Suche nach einem Datensatz sieht dann folgendermaßen aus:

Dim CurRec As String
Dim CurIdx As String
 
' zunächst aktuellen Datensatz-Zeiger merken
GetBookmark Tabelle, CurRec, CurIdx
 
' Suchen nach "Meier"
Tabelle.Seek "=", "Meier"
 
' Prüfen, ob Suche erfolgreich
If Not Tabelle.NoMatch Then
  ' Datensatz gefunden
  DatensatzAnzeigen
Else
  ' kein Datensatz vorhanden
  MsgBox "Kein entsprechender Datensatz gespeichert."
 
  ' Datensatz-Zeiger auf ursprünglichen Datensatz zurücksetzen
  SetBookmark Tabelle, CurRec, CurIdx
End If

Beschreibung und Erläuterung der möglichen Suchvarianten

In den bisherigen Beispielen wurde immer gezielt nach einer exakten Übereinstimmung gesucht. Im nachfolgenden lernen Sie alle Suchvarianten kennen, die Ihnen das JET-Datenbankmodul in Verbindung mit dem Seek-Befehl bereitstellt.

Exakte Übereinstimmung (=)
Das Gleichheitszeichen gibt an, daß nach dem exakten Suchbegriff gesucht werden soll.

Tabelle.Seek "=", "Meier"

Es wird nach einer Adressen mit dem exakten Namen Meier gesucht, nicht auch Meier Hugo oder Meierrich.

Größer gleich (>=)Es wird nach einer Adresse gesucht, die entweder mit dem Suchbegriff übereinstimmt oder laut Sortierfolge hinter dem Suchbegriff eingereiht wird.

Tabelle.Seek ">=", "Meier"

Der Datensatz-Zeiger befindet sich entweder auf eine Adresse mit dem Namen oder Teilnamen Meier oder auf den in der Sortierfolge darauffolgenden Datensatz (z.B. Müller, Niebaum, Otter). Ggf. kann der Datensatz-Zeiger natürlich auch wieder auf einen NULL-Datensatz zeigen.

Größer (>)
Es wird nach einer Adresse gesucht, die laut Sortierfolge hinter dem Suchbegriff eingereiht wird.

Tabelle.Seek ">", "Meier"

Der Datensatz-Zeiger befindet sich entweder auf einen hinter der Adresse Meier einsortierten Datensatz (z.B. Meier Hugo, Niebaum, Otter, ...) oder ggf. wieder auf einen NULL-Datensatz.

Kleiner gleich (<=)
Es wird nach einer Adresse gesucht, die entweder mit dem Suchbegriff übereinstimmt oder laut Sortierfolge vor dem Suchbegriff eingereiht wird.

Tabelle.Seek "<=", "Meier"

Der Datensatz-Zeiger befindet sich entweder auf eine Adresse mit dem Namen oder Teilnamen Meier oder auf den in der Sortierfolge voranstehenden Datensatz (z.B. Ludwig oder Hintermeier). Ggf. kann der Datensatz-Zeiger natürlich auch wieder auf einen NULL-Datensatz zeigen.

Kleiner (<)
Es wird nach einer Adresse gesucht, die laut Sortierfolge vor dem Suchbegriff eingereiht wird.

Tabelle.Seek "<", "Meier"

Der Datensatz-Zeiger befindet sich entweder auf einen vor der Adresse Meier einsortierten Datensatz (z.B. Ludwig Georg, Hintermeier Artur, ...) oder ggf. wieder auf einen NULL-Datensatz.

Gerade bei der Suche nach Namen ist die zweite Suchvariante zu empfehlen, da hier auch Teilnamen gefunden werden. Was jedoch vorkommen kann, ist daß nach Meier gesucht wurde, aber die Adresse von Otto Heinz angezeigt wird, da keine einzige Adresse mit dem Namen oder Teilnamen Meier gespeichert ist. Es ist nun also Ihre Entscheidung entweder eben die Adresse von Otto Heinz anzuzeigen oder einen entsprechenden Hinweis auszugeben. Für letztere Entscheidung, hier der entsprechende Quellcode:

GetBookmark Tabelle, CurRec, CurIdx
Tabelle.Seek ">=", "Meier"
If Not Tabelle.NoMatch Then
  If Tabelle("Name") Like "Meier*" Then
    DatensatzAnzeigen
  Else
    MsgBox "Kein entsprechender Eintrag!"
    SetBookmark Tabelle, CurRec, CurIdx
  End If
Else
  MsgBox "Kein entsprechender Eintrag!"
  SetBookmark Tabelle, CurRec, CurIdx
End If

Suche nach Kombinations-Indexfeldern

Alle bisherigen Beispiele haben sich auf die Suche nach einem "einfachen" einzelnen Datenfeld bezogen. Handelt es sich bei dem aktiven Index jedoch um einen Kombinations-Index mehrerer Datenfelder, muss dies in der Syntax entsprechend korrekt angegeben werden.

' Festlegen des aktiven Indexes
Tabelle.Index = "PlzOrt"
 
' Suchen nach "Müller"
Tabelle.Seek "=", "97618", "Leutershausen"

Praktischer Einsatz der Indexfelder und Suchroutinen in der Beispiels-Adressdatenbank

Alle bisherigen Beispiele haben sich auf die Suche nach einem "einfachen" einzelnen Datenfeld bezogen. Handelt es sich bei dem aktiven Index jedoch um einen Kombinations-Index mehrerer Datenfelder, muss dies in der Syntax entsprechend korrekt angegeben werden.

Nachfolgend soll nun eine entsprechende Suchroutine in die kleine Adress-Datenbank-Anwendung integriert werden. Hierzu wird ein Formular benötigt, welches sowohl die Auswahl des Suchfeldes als auch die Eingabe des Suchbegriffs selbst ermöglicht.

Das Suchforumlar
Über zwei Option-Buttons lässt sich das Suchfeld einstellen (Name oder PLZ Ort). Darunter befindet sich ein Eingabefeld (Textbox), in welches dann der Suchbegriff eingegeben wird.

Anmerkung:
Die Eingabe von PLZ und Ort muß direkt hintereinander, nur durch ein Leerzeichen voneinader getrennt erfolgen.

Bsp.: 97618 Leutershausen

Und hier der Quellcode für das Suchen-Formular frmSearch.frm:

Option Explicit
 
Private Sub Form_Load()
  ' Voreinstellung Suchauswahl
  Option1(0).Value = True
End Sub
 
Private Sub Form_QueryUnload(Cancel As Integer, _
  UnloadMode As Integer)
  If UnloadMode <> 1 Then
    Cancel = True
    Command1_Click 1
  End If
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
  Set frmSearch = Nothing
End Sub
 
Private Sub Command1_Click(Index As Integer)
  ' Befehlsbuttons
  Select Case Index
    Case 0
      Me.Tag = True
      Me.Hide
    Case 1
      Me.Tag = False
      Me.Hide
  End Select
End Sub

Und jetzt der Aufruf des Suchenformulars aus der Adress-Anwendung heraus:

Private Sub DatensatzSuchen()
  Static SuchText As String
  Static sIndex As Integer
 
  Dim Result As Boolean
  Dim CurRec As String
  Dim CurIdx As String
  Dim Feld As String
 
  ' Suchenformular aktivieren
  Load frmSearch
  With frmSearch
    .Option1(sIndex).Value = True
    .Text1.Text = SuchText
    .Show 1
    Result = (.Tag = True)
    If Result Then
      sIndex = IIf(.Option1(0).Value = True, 0, 1)
      SuchText = .Text1.Text
    End If
  End With
  Unload frmSearch
 
  ' Suchvorgang starten
  If Result Then
    ' aktuellen Datensatz merken
    GetBookmark Tabelle, CurRec, CurIdx
 
    ' Index setzen
    Tabelle.Index = Choose(sIndex + 1, "Name", "PlzOrt")
 
    ' Suchen
    Tabelle.Seek ">=", SuchText
    Result = (Not Tabelle.NoMatch)
    If Result Then
      ' etwas gefunden...vergleichen ob übereinstimmt
      If sIndex = 0 Then
        Feld = Tabelle("Name")
      Else
        Feld = RTrim$(Tabelle("PLZ") + " " + Tabelle("Ort"))
      End If
      If Not (Feld Like SuchText + "*") Then
        Result = False
      End If
    End If
 
    ' Such-Auswertung
    If Result Then
      ' Datensatz anzeigen
      DatensatzAnzeigen
    Else
      MsgBox "Kein entsprechender Eintrag gespeichert!"
 
      ' Datensatzzeiger auf ursprünglichen Datensatz zurücksetzen
      SetBookmark Tabelle, CurRec, CurIdx
    End If
  End If
End Sub

Die Suchroutine kann natürlich noch erweitert werden. So ist es denkbar, daß nicht der erste gefundene Datensatz sofort in der Bildschirmmaske angezeigt, sondern zunächst eine Art Auswahlliste erstellt wird. Die Auswahlliste sollte alle Datensätze enthalten, die mit dem Suchbegriff übereinstimmen. Raffiniert wäre natürlich die Auswahlliste nur dann anzuzeigen, wenn mindestens zwei Suchtreffer vorliegen - bei nur einem Suchtreffer ist es sinnvoll den Datensatz sofort anzuzeigen. Ein weiterer Verbesserungspunkt der Suchroutine ist das Berücksichtigen oder auch Nicht-Berücksichtigen der exakten Groß-/Kleinschreibung...

Sie sehen, die Suchabfrage lässt noch um einige Features erweitern. Probieren Sie es doch einfach aus (z.B. die zuvor erwähnte Auswahlliste).

Zusammenfassung

Ziel des zweiten Teils des Datenbank-Workshops war es Ihnen zu vermitteln, was Indexes sind und wie man diese für eine Datenbank-Tabelle erstellt und sinnvoll einsetzt. Sie sollten jetzt also in der Lage sein, Indexes gezielt einzusetzen, um zum einen eine sortierte Ausgabe der Datensätze zu erhalten und zum anderen entsprechende Suchroutinen zu integrieren.

Nochmals zur Erinnerung:
.Index = ...Index setzen (aktivieren)
 
.Seek "=", Inhaltexakte Suche nach einem Feldinhalt
.Seek ">=", InhaltSuche größer oder gleich
.Seek ">", InhaltSuche größer als "Inhalt"
.Seek "<=", InhaltSuche kleiner oder gleich
.Seek "<", InhaltSuche kleiner als "Inhalt"
 
NoMatchPrüfen, ob Suche erfolgreich oder keine Übereinstimmung
 
GetBookmarkUniversalroutine, welche sich den aktuellen Datensatz merkt
SetBookmarkUniversalroutine, welche den Datensatzzeiger zurücksetzt

Vorschau Teil 3

Im dritten Teil dieses Workshops werden Sie einige der zahlreichen Möglichkeiten der SQL-Abfragesprache kennenlernen. SQL (engl. "Structured Query Language") ist ein Bestandteil der JET-Datenbank-Engine, und eignet sich hervorragend für das Filtern (Suchen) mehrerer Datensätze einer Datenbanktabelle anhand ganz bestimmter Selektionskriterien (Abfragekriterien). So lassen sich z.B. mit einem einzigen Befehl alle Datensätze der Adressdatenbank heraussuchen, bei denen keine EMail-Adresse eingetragen ist oder alle Adressen in einem bestimmten PLZ-Gebiet.

Dieser Workshop wurde bereits 26.158 mal aufgerufen.

Über diesen Workshop im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Workshop, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Workshops finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel