vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Datenbanken   |   VB-Versionen: VB5, VB615.05.01
Einführung in die Datenbankprogrammierung mit VB Teil 3

Im dritten Teil unseres Datenbank-Workshops lernen Sie einige der zahlreichen Möglichkeiten der SQL-Abfragesprache kennen. 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).

Autor:  Dieter OtterBewertung:  Views:  28.512 

Im dritten Teil dieses Workshops lernen Sie einige der zahlreichen Möglichkeiten der SQL-Abfragesprache kennen. 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.

Was versteht man unter SQL?

Wie bereits eingangs erwähnt handelt es sich hierbei um eine sehr komfortable Datenbank-Abfragesprache mit einer eigens hierfür bereitgestellten Syntax. SQL steht für "Structured Query Language" und bedeutet übersetzt so viel wie "strukturierte Abfragesprache". SQL ist keine Programmiersprache, sondern vielmehr eine Beschreibungssprache. Sie "sagen" der Datenbank-Engine einfach nur, welche Daten Sie ermittelt haben möchten oder welche Daten verändert oder gelöscht werden sollen. Der eigentliche Vorgang wird dann vom DBMS (Datenbank-Management-System) ausgeführt.

Neben dem Erstellen von Suchabfragen (Ermitteln von bestimmten Daten) bietet SQL jedoch noch zahlreiche weitere Möglichkeiten. So lassen sich z.B. mehrere Tabellen einer Datenbank oder sogar mehrere Datenbanken in die Suche einbeziehen. Außerdem können alle oder nur eine bestimmte Gruppe von Datensätzen quasi mit einer einzigen SQL-Anweisung verändert, gelöscht oder in eine andere Tabelle kopiert werden. Oder: Stellen Sie sich vor, sie müssen die Summe aller offenen Beiträge einer Mitglieder-Tabelle ermitteln. Die "normale" Vorgehensweise (weil bisher nicht anders bekannt) wäre doch die, daß Sie die Tabelle Datensatz für Datensatz "durchblättern" und den Inhallt des entsprechenden Datenfeldes einer Summevariable hinzuaddieren. Bei einer geringen Anzahl von Datensätzen mag dies noch "vertretbar" sein. Handelt es sich hingegen um eine große Datenmenge würde die eben geschilderte Vorgehensweise einen enormen Zeitanspruch bedeuten. Für solche oder ähnliche Aktionen hält die SQL-Sprache sogenannte Aggregat-Funktionen bereit, mit deren Hilfe sich das Summieren von Datenfeldern ebenfalls wiederum mit nur einer einzigen Anweisung realisieren lässt. Sie sehen also, die SQL-Abfragesprache lässt sich in mehreren Bereichen für die verschiedensten Vorhaben sinnvoll einsetzen.

Da der Datenbank-Workshop Ihnen die Datenbank-Programmierung Schritt für Schritt näher bringen soll, werden im dritten Teil zunächst die grundlegenden SQL-Befehle erläutert. Mit den hier vorgestellten SQL-Anweisungen lassen sich jedoch schon viele, und vor allem häufig benötigte, Abfragen realisieren.

Ein paar einführende Beispiele

Der nachfolgende Abschnitt widmet sich den bereits erwähnten Grundanweisungen und Befehlen. Es wird erklärt, mit welchen einfachen Mitteln sich Suchabfragen - bezogen auf eine Datenbank-Tabelle - erstellen lassen.

Eine einfache SQL-Anweisung sieht z.B. so aus:

SELECT * FROM Adressen

Übersetzt bedeutet das: Selektiere (SELECT) alle Datenfelder (*) aus der Tabelle Adressen (FROM Adressen).

Um nun nur die Namen (also nicht alle Datenfelder) aus der Adressen-Tabelle zu ermitteln geben Sie einfach folgendes an:

SELECT Name FROM Adressen

Ebenso können auch nur zwei oder drei Datenfelder selektiert. Diese werden einfach durch ein Komma voneinander getrennt.

SELECT Name, Plz, Ort FROM Adressen

Diese einfache SQL-Anweisung gibt die Namen, die PLZ und den Ort aller gespeicherten Adressaten der Tabelle Adressen zurück.

Sollen z.B. alle Personen ermittelt werden, deren Name mit "A" beginnen, sieht die SQL-Anweisung folgendermaßen aus:

SELECT * FROM Adressen WHERE Name Like 'A*'

Bisher wurden die Datensätze ohne Berücksichtigung einer bestimmten Sortierfolge selektiert. Mit einem einfachen Zusatz in der SQL-Anweisung kann die Sortierfolge ebenso einfach angegeben werden.

SELECT * FROM Adressen ORDER BY Name

Es werden alle Datenfelder aller gespeicherten Datensätze der Adressen-Tabelle ermittelt, wobei diese nach dem Datenfeld "Name" sortiert sind.

Die einzelnen vorgestellten SQL-Anweisungen lassen sich natürlich auch kombinieren. So ist es natürlich möglich zwei oder drei Datenfelder einer bestimmten Tabelle zu selektieren, wobei ein oder auch mehrere Kriterien für die Suchabfrage berücksichtigt werden sollen - und das Ergebnis nach einem oder mehreren Datenfeldern sortiert ist.

SELECT Name, EMail FROM Adressen WHERE 
  Plz Like '97708' And EMail <> '' ORDER BY Name

Es werden die Datenfelder "Name" und "EMail" derjenigen Datensätze ermittelt, bei denen im Feld "Plz" der Eintrag 97708 steht und das Datenfeld "EMail" nicht leer ist. Das Ergebnis wird sortiert nach Namen zurückgegeben.

WHERE-Abschnitt

Der WHERE-Abschnitt gibt an, welche Datensätze in der durch FROM angegebenen Tabelle berücksichtigt werden sollen. Hierbei können verschiedene Ausdrücke verwendet werden (maximal jedoch 40), um zu bestimmen, welche Datensätze die SQL-Anweisung zurückgibt. Mehrere Ausdrücke lassen sich mit AND (und) oder OR (oder) verknüpfen. Der WHERE-Abschnitt ist vergleichbar mit einer IF-Abfrage. Innerhalb eines Ausdrucks lassen sich auch Funktionen wie Left(...), Mid(...) oder Not verwenden.

Hier ein paar Beispiele:

' alle Adressen mit dem exakten Namen "Müller"
' oder dem Namen "Mueller"
SELECT * FROM Adressen WHERE Name = 'Müller' Or 
  Name = 'Mueller'
' alle Adressen, die mit dem Namen "Müller" beginnen, 
' also "Müller" und "Müllermann" usw.)
SELECT * FROM Adressen WHERE Name Like 'Müller*'
' alle Adressen im Plz-Gebiet 9000 bis 99999
SELECT * FROM Adressen WHERE Plz >= '90000' And 
  Plz <= '99999'
' alle Adressen deren ersten 5 Stellen der EMail-Adresse
' mit info@ beginnen
SELECT * FROM Adressen WHERE Left(EMail, 5) = 'info@'
' alle Adressen, bei denen im Name "schmitt" oder "schmidt"
' vorkommt UND gleichzeitig als Wohnort "Hamburg" oder
' "München" oder "Berlin" eingetragen ist
SELECT * FROM Adressen WHERE (Name Like '*schmitt*' Or 
  Name Like '*schmidt*') And (Ort = 'Hamburg' Or 
  Ort = 'München' Or Ort = 'Berlin')

Wie Sie sehen, lassen sich im WHERE-Abschnitt ebenso einfache wie komplexe Ausdrücke verwenden. Zu beachten ist, daß Vergleichsinhalte bei Datenfeldern vom Typ "Text" immer in Hochkomma zu setzen sind. Jetzt kann es natürlich vorkommen, daß das Hochkomma selbst Bestandteil des Vergleichsinhaltes ist. Dann muss das Hochkomma innerhalb der Inhaltsangabe doppelt verwendet werden:

' Suche alle Adressen mit dem Namen "Sabine's Blumenladen"
SELECT * FROM Adressen WHERE Name = 'Sabine''s Blumenladen'

Handelt es sich bei dem Datenfeld um ein Wertfeld, z.B. Integer, Long, Double oder auch Boolean, so darf der Vergleichsinhalt NICHT in Hochkomma gesetzt werden.

ORDER BY-Abschnitt

Der ORDER BY-Abschnitt legt die Sortierfolge der Ergebnisliste einer SQL-Abfrage fest. Die Sortierung kann nach nur einem oder auch nach mehreren Feldern sowohl in aufsteigender als auch absteigender Reihenfolge erfolgen. Die voreingestellte Sortierfolge ist aufsteigend. Um in absteigender Reihenfolge zu sortieren, geben Sie nach dem Feldnamen einfach das reservierte Wort DESC an.

' Die Ergebnisliste ist in aufsteigender Reigenfolge
' nach Namen sortiert
SELECT * FROM Adressen ORDER BY Name
' Die Ergebnisliste ist in absteigender Reigenfolge
' nach Namen sortiert
SELECT * FROM Adressen ORDER BY Name DESC

Werden mehrere Datenfelder als Sortiermerkmal angegeben, so müssen diese durch ein Komma voneinander getrennt werden. Die Sortierung erfolgt dann zunächst nach dem zuerst angegebenen Datenfeld (aufsteigend oder absteigen - je nach Angabe). Innerhalb gleichlautender Datenfelder erfolgt die Sortierung dann nach dem zweiten Datenfeld.

' Die Ergebnisliste ist in aufsteigender Reigenfolge nach
' "Plz" sortiert und innerhalb gleichlautender Plz'en
' zusätzlich noch alphabetisch nach "Namen"
SELECT * FROM Adressen ORDER BY Plz, Name

Kurze Zusammenfassung

Das sind zunächst einmal die grundlegenden "SQL-Befehle", um Datenfelder bestimmter Datensätze einer Tabelle zu ermitteln. Wie Sie den aufgeführten Beispielen entnehmen können, erfolgt die Angabe der SQL-Anweisung immer nach dem gleichen Schema:

SELECT ... FROM ... [WHERE ...] [ORDER BY]

Merken Sie sich also für Ihre SQL-Suchabfragen immer diese Struktur. Die beiden ersten Befehle müssen immer angegeben werden. WHERE und ORDER BY sind optional und können einzeln, gemeinsam oder auch weggelassen werden.

Desweiteren ist es empfehlenswert, wenn Sie Ihre Suchabfrage zunächst im Kopf oder auch auf einem Blatt Papier "formulieren":

SELECT:Welche Datenfelder sollen selektiert werden?
FROM:In welcher Datenbank-Tabelle sind die Daten gespeichert?
WHERE:Welche Kriterien müssen die Datensätze erfüllen?
ORDER BY:Nach welchem Datenfeld soll das Ergebnis sortiert sein?

Anmerkung

Enthält der Feldname eines Datenfeldes Leer- oder Sonderzeichen, so muss der Feldname innerhalb der SQL-Anweisung immer in eckige Klammern gesetzt werden. Wurde z.B. für ein Datenfeld die Bezeichnung "Name Vorname" gewählt, so lautet die SQL-Anweisung:

SELECT [Name Vorname], Plz FROM Tabelle
  WHERE [Name Vorname] ...

Sie sollten jedoch bereits beim Datenbank-Entwurf darauf achten, für die Feldbezeichnungen keine Leer- oder Sonderzeichen zu wählen, da die Gefahr die Feldnamen in eckige Klammern zu setzen zu vergessen gleich Null ist und somit auch eine der möglichen Fehlerursachen bei SQL-Abfragen von vornherein ausgeschlossen wird.

Wie kann man auf das Ergebnis der Suchabfrage zugreifen?

Nach so viel Theorie, nun aber zur Praxis. Bisher haben Sie nur die reine SQL-Abfrage-Formulierung kennengelernt. Es wurde noch nicht gezeigt, wie man auf die Datensätze der Suchabfrage zugreifen kann. Das ist aber auch nicht allzu kompliziert. Wie Sie aus den beiden vorigen Teilen des Workshops bereits wissen, handelt es sich bei einer Datenbank-Tabelle, welche alle Datensätze enthält, um einen Recordset. Das Ergebnis einer SQL-Abfrage wird ebenfalls in einem Recordset gespeichert.

' Datenbank öffnen
Dim Db As Database
Dim dbFile As String
 
dbFile = App.Path + "\ADRESS.MDB"
Set Db = Workspaces(0).OpenDatabase(dbFile, False, False)
 
' Recordset auf Basis einer SQL-Abfrage erstellen und öffnen
Dim SQL As String
Dim rs As Recordset
 
SQL = "SELECT * FROM Adressen"
Set rs = Db.OpenRecordset(SQL)

Sie können also auch hier mit den bekannten Methoden MoveNext, MovePrevious, MoveFirst, MoveLast innerhalb des Recordset "blättern" oder über die Methoden Edit/AddNew und Update einen Datensatz ändern bzw. hinzufügen. Was allerdings nicht geht, ist das Suchen eines bestimmten Datensatzes innerhalb des Recordset über die im Datenbank-Workshop Teil 2 vorgestellte Seek-Methode. Als Ersatz stehen Ihnen jedoch vier andere Suchmethoden zur Verfügung: FindFirst, FindNext, FindPrevious und FindLast. Mehr dazu erfahren Sie später - im Laufe des Workshops.

Für das Erstellen eines Recordsets auf Basis einer SQL-Abfrage stellt die JET-Engine noch ein paar spezielle Möglichkeiten zur Verfügung, welche als Parameter in der OpenRecordset angegeben werden.

So lässt sich als optionaler Parameter der Typ des Recordsets festlegen. Folgende Typen sind möglich:

dbOpenDynaset
Sobald es sich bei der Quelle um einen Abfragestring (SQL-Anweisung) handelt, kann dieser Parameter auch weggelassen werden. Die Jet-Engine erstellt dann immer automatisch ein Recordset vom Typ Dynaset.

Set rs = Db.OpenRecordset(SQL, dbOpenDynaset)

dbOpenSnapshot
Wird das Recordset als "Snapshot" erstellt, können die enthaltenen Datensätze weder bearbeitet, noch gelöscht werden. Auch ein Hinzufügen von neuen Datensätzen ist nicht möglich. Dafür erfolgt das Erstellen des Recordsets um einiges schneller als bei einem Recordset vom Typ "Dynaset". Recordsets vom Typ "Snapshot" eignen sich vor allem dann, wenn innerhalb der Datensätze nur "geblättert" werden soll.

Set rs = Db.OpenRecordset(SQL, dbOpenSnapshot)

dbOpenForwardOnly
Wird als Typ "dbOpenForwardOnly" angegeben, so wird ebenfalls ein Recordset vom Typ "Snapshot" erstellt, mit noch einer weiteren zusätzlichen Einschränkung: Innerhalb der Datensätze kann nur vorwärts geblättert werden. Der Zeitaufwand für das Erstellen des Recordsets ist dann aber nochmals um einiges niedriger, was sich vor allen Dingen bei sehr großen Datenmengen deutlich bemerkbar macht.

Set rs = Db.OpenRecordset(SQL, dbOpenForwardOnly)

Die Anzahl der Datensätze innerhalb des Recordsets lässt sich wie gewohnt über die RecordCount-Eigenschaft abfragen - außer, das Recordset ist vom Typ dbOpenForwardOnly. In diesem Fall liefert RecordCount immer die aktuelle Position des Datenbankzeigers innerhalb des Recordsets.

Um das Ergebnis einer SQL-Abfrage z.B. in einem gewöhnlichen Listbox-Steuerelement anzuzeigen, kann man einen der beiden nachfolgenden Codes verwenden.

' Anzeige des Ergebnisses in einer Listbox, wobei einzelne 
' Datensätze des Recordsets bearbeitet werden können.
SQL = "SELECT * FROM Adressen"
Set rs = Db.OpenRecordset(SQL)
 
' wenn die Ergebnisliste Datensätze enthält
If rs.RecordCount > 0 Then
  While Not rs.EOF
    List1.AddItem rs("Name")
    Rs.MoveNext
  Wend
End If

oder

' Anzeige des Ergebnisses in einer Listbox, wobei das Recordset
' einmalig durchlaufen werden soll (sehr schnelle Methode)
SQL = "SELECT * FROM Adressen"
Set rs = Db.OpenRecordset(SQL, dbOpenForwardyOnly)
 
' wenn die Ergebnisliste Datensätze enthält
If rs.RecordCount > 0 Then
  While Not rs.EOF
    List1.AddItem rs("Name")
    Rs.MoveNext
  Wend
End If

Wie Sie sehen, sind die beiden Vorgehensweise nahezu identisch (bis auf die Typen-Angabe im OpenRecordset-Befehl). Wird das Recordset wie in Beispiel 1 erstellt, so kann jederzeit mit den Move-Methoden innerhalb des Recordsets geblättert oder mittels Edit/AddNew und Update ein Datensatz bearbeitet oder hinzugefügt werden. Auch das Löschen von einzelnen Datensätzen (Delete-Methode) ist möglich. Probieren Sie hingegen im Beispiel 2 ruhig einmal die MovePrevious oder Delete-Methode aus. Sie erhalten dann immer einen Laufzeitfehler, da beim Erstellen des Recordsets explizit angegeben wurde, daß nur ein Vorwärtsblättern möglich sein soll.

Suchen und Filtern von Daten in der Beispiels-Adressdatenbank

Der Datenbank-Workshop wäre kein richtiger Workshop, wenn hier nicht immer wieder Bezug auf die Beispiels-Adressdatenbank genommen werden würde. Im zweitel Teil haben Sie bereits die Möglichkeit kennengelernt nach einem einzelnen Datensatz zu suchen. Dies ist in der Praxis eine sehr häufig benötigte Funktion. Leider hatte diese Suchfunktion einen großen Nachteil. Sind in der Adress-Datenbank mehrere Datensätze gespeichert, die der Suchanfrage entsprechen, so wurde immer zunächst der erste Treffer in der Adressmaske angezeigt. Handelt es sich hierbei nicht um den tatsächlich gesuchten Datensatz, musste man solange vorwärtsblättern, bis der "richtige" Datensatz in der Maske stand. Da erscheint es doch sinnvoller, alle Treffer zunächst in einer Auswahlliste anzuzeigen. Genau dieser Vorgang soll nachfolgend in Zusammenhang mit einer SQL-Abfrage realisiert werden.

Voraussetzungen
Um das Ergebnis der SQL-Abfrage übersichtlich in einer Auswahlliste darstellen zu können, wird ein Steuerelement benötigt, welches nicht nur zeilenweise, sondern auch spaltenweise mit den Datenfeldern gefüllt werden kann. Hierzu eignet sich das Standard Listenfeld eher weniger, da sich keine festen Spaltenbreiten festlegen lassen. Visual-Basic bietet jedoch noch ein weiteres Steuerelement, welches für diesen Zweck sehr flexible verwendet und angepasst werden kann - das DBGrid-Steuerlement. Sie finden dieses im Windows\System-Verzeichnis unter dem Namen DBGRID32.OCX. Fügen Sie also zunächst die DBGrid-Komponente Ihrem Projekt hinzu (Menü "Projekt - Komponenten").

Erstellen des Formulars für die Anzeige der Auswahlliste
Öffnen Sie eine neue Form (Menü Projekt - Formular hinzufügen), klicken dann in der Werkzeugleiste auf das DBGrid-Symbol und plazieren das DBGrid-Element auf die neue Form. Zusätzlich wird noch ein Data-Steuerelement benötigt.

frm_Auswahlliste

Eigenschaften von Data1
DatabaseName:Wählen Sie hier die Beispiels-Adressendatei (ADRESSEN.MDB)
RecordsetType:1 - Dynaset
RecordsetSource:  Adressen
VisibleFalse

Eigenschaften von DBGrid1
AllowAddNew:  False
AllowDelete:False
AllowUpdate:False
DataMode:0 - Bound
DataSource:Dezail

Über den DBGrid1-Eigenschaften-Dialog (Benutzerdefiniert) können nun die Spaltenbreiten der Liste an die eigenen Bedürfnisse angepasst werden. So lassen sich z.B. auch bestimmte Spalten der Tabelle ausblenden (Registerkarte Layout...).

Jetzt werden noch zwei Schaltflächen cmdDisplay und cmdCancel benötigt. Beschriften Sie diese mit "Anzeigen" und "Abbrechen" (Caption-Eigenschaften).

Private Sub cmdDisplay_Click()
  ' Datensatz anzeigen
  Me.Tag = Data1.Recordset("AdressNr")
  Me.Hide
End Sub
 
Private Sub cmdCancel_Click()
  ' Abbrechen wirde gewählt
  Me.Tag = 0
  Me.Hide
End Sub

Wird auf die Schaltfläche "Anzeigen" geklickt wird das Fenster geschlossen und über die Tag-Eigenschaft der Form die interne AdressNr des ausgewählten Datensatzes zurückgegeben. Klickt der Anwender auf "Abbrechen" wird der Wert 0 an die aufrufende Prozedur zurückgegeben./p>

Das war eigentlich schon alles, was für das Anzeigen der Auswahlliste benötigt wird.

Der SUCHEN-Eingabedialog

Um den Anwender eine freie Suchanfrage zu ermöglichen, fügen Sie Ihrem Projekt eine neue Form hinzu und plazieren alle in der nachfolgenden Abbildung beschriebenen Steuerelemente darauf.

frm_Suchanfrage

Die Form selbst soll frm_Suchanfrage genannt werden. Im Form_Load-Ereignis werden zunächst die Combo-Boxen mit den Feldnamen gefüllt.

Private Sub Form_Load()
 
  ' Comboboxen mit Feldnamen füllen
 
  ' Suchen nach
  With cmbFeld
    .AddItem "Name"
    .AddItem "Straße"
    .AddItem "Plz"
    .AddItem "Ort"
    .AddItem "EMail"
    .AddItem "Telefon"
 
    ' Voreinstellung: Suchen nach Name
    .ListIndex = 0
  End With
 
  ' Sortieren nach
  With cmbSort
    .AddItem "Name"
    .AddItem "Plz"
    .AddItem "Ort"
 
    ' Voreinstellung: Sortieren nach Name
    .ListIndex = 0
  End With
End Sub
 
Private Sub Form_QueryUnload(UnloadMode As Integer, _
  Cancel As Integer)
 
  If UnloadMode <> 1 Then
    Cancel = True
    CmdCancel.Value = True
  End If
End Sub

Wird auf den OK-Knopf geklickt wird der SQL-Abfragestring erstellt und an die aufrufende Prozedur über die Form.Tag - Eigenschaft zurückgegeben. Klickt der Anwender auf Abbrechen, wird ein Leerstring zurückgegeben.

Private Sub cmdOK_Click()
  ' SQL-Abfragestring erstellen
  Dim SQL As String
 
  ' SELECT..FROM - Abschnitt
  ' Alle Datenfelder aus Tabelle ADRESSEN selektieren
  SQL = "SELECT * FROM Adressen WHERE "
 
  ' WHERE - Abschnitt (Bedingung)
  ' Hier wird der Operator LIKE verwendet, so daß
  ' alle Datensätze, welche mit dem angegebenen Inhalt
  ' beginnen, gefunden werden
  ' Wichtig ist das Sternchen (*) am Ende!
  SQL = SQL + Choose(cmbFeld.ListIndex + 1, "Name", _
    "Strasse", "Plz", "Ort", "Telefon", "EMail")
  SQL = SQL + " Like '" + txtSuch.Text + "*'"
 
  ' ORDER BY - Abschnitt
  SQL = SQL + " ORDER BY "
  SQL = SQL + Choose(cmbSort.ListIndex + 1, "Name", _
    "Plz", "Ort")
 
  ' SQL-Abfragestring in der Form.Tag-Eigenschaft
  ' "zwischenspeichern" und Dialogfenster schließen
  Me.Tag = SQL
  Me.Hide
End Sub

Jetzt müssen Sie nur noch den Aufruf des Suchen-Dialog in Ihrer Anwendung einbeziehen. Dies kann z.B. über eine Schaltfläche "Suchen" erfolgen:

Private Sub cmdSearch_Click()
  Dim SQL As String
  Dim AdrNr As Long
 
  ' Suchen-Dialog anzeigen
  Load frm_Suchanfrage
  With frm_Suchanfrage
    .Show 1
    SQL = .Tag
  End With
  Unload frm_Suchanfrage
 
  ' Wenn nicht auf "Abbrechen" geklickt wurde
  If SQL <> "" Then
    ' Auswahlliste anzeigen
    Load frm_Auswahlliste
    With frm_Auswahlliste
      .Data1.Recordsource = SQL
      .Data1.Refresh
 
      ' Ergebnis prüfen
      If .Data1.Recordset.RecordCount = 0 Then
        ' kein Eintrag gefunden
        AdrNr = 0
        MsgBox "In der Datenbank ist kein entsprechender " & _
          "Eintrag gespeichert!", 64, "SUCHEN"
      ElseIf .Data1.Recordset.RecordCount = 1 Then
        ' exakt 1 Eintrag, d.h. sofort anzeigen
        AdrNr = .Data1.Recordset("AdressNr")
      Else
        ' mehrere Treffer, d.h. Liste anzeigen
        .Show 1
        AdrNr = .Tag
      End If
    End With
    Unload frm_Auswahlliste
 
    ' wenn ein Eintrag aus der Liste ausgewählt wurde
    ' oder sowieso nur ein Treffer vorhanden war
    If AdrNr > 0 Then
      ' Adresse zur Bearbeitung anzeigen
      Tabelle.Index = "AdressNr"
      Tabelle.Seek "=", AdrNr
      Datensatz_Anzeigen
    End If
  End If
End Sub

Aktivieren der Suchroutine mit autom. Auswahlliste

Jetzt müssen Sie nur noch den Aufruf des Suchen-Dialog in Ihrer Anwendung einbeziehen. Dies kann z.B. über eine Schaltfläche "Suchen" erfolgen:

Private Sub cmdSearch_Click()
  Dim SQL As String
  Dim AdrNr As Long
 
  ' Suchen-Dialog anzeigen
  Load frm_Suchanfrage
  With frm_Suchanfrage
    .Show 1
    SQL = .Tag
  End With
  Unload frm_Suchanfrage
 
  ' Wenn nicht auf "Abbrechen" geklickt wurde
  If SQL <> "" Then
    ' Auswahlliste anzeigen
    Load frm_Auswahlliste
    With frm_Auswahlliste
      .Data1.Recordsource = SQL
      .Data1.Refresh
 
      ' Ergebnis prüfen
      If .Data1.Recordset.RecordCount = 0 Then
        ' kein Eintrag gefunden
        AdrNr = 0
        MsgBox "In der Datenbank ist kein entsprechender " & _
          "Eintrag gespeichert!", 64, "SUCHEN"
      ElseIf .Data1.Recordset.RecordCount = 1 Then
        ' exakt 1 Eintrag, d.h. sofort anzeigen
        AdrNr = .Data1.Recordset("AdressNr")
      Else
        ' mehrere Treffer, d.h. Liste anzeigen
        .Show 1
        AdrNr = .Tag
      End If
    End With
    Unload frm_Auswahlliste
 
    ' wenn ein Eintrag aus der Liste ausgewählt wurde
    ' oder sowieso nur ein Treffer vorhanden war
    If AdrNr > 0 Then
      ' Adresse zur Bearbeitung anzeigen
      Tabelle.Index = "AdressNr"
      Tabelle.Seek "=", AdrNr
      Datensatz_Anzeigen
    End If
  End If
End Sub

Ein paar Erläuterungen und Anmerkungen zu der Vorgehensweise:
Zunächst wird der Suchen-Dialog angezeigt, in welchem man das Feld, den gesuchten Inhalt und das Sortiermerkmal (für eine evtl. notwendige Auswahlliste) festlegen kann. Danach wird dem Data1-Steuerelement im Dialog "Auswahlliste" der SQL-Abfragestring übergeben. Die Anweisung Data1.Refresh ist notwendig und bewirkt das Ausführen der Anweisung in der Data1.Recordsource Eigenschaft. Über die Eigenschaft Data1.Recordset.RecordCount wird dann die Anzahl gefundener Übereinstimmungen abgefragt. Sind keine Übereinstimmungen vorhanden, erscheint eine MsgBox, bei nur einer Übereinstimmung wird der entsprechende Datensatz sofort angezeigt. Nur bei mehreren Übereinstimmungen wird die Auswahlliste angezeigt. Wählt man in der Liste nun einen Eintrag aus und klickt dann auf OK, wird der ausgewählte Eintrag in der Adress-Eingabemaske angezeigt.

Weitere SQL-Anweisungen

Neben der eben vorgestellten sehr flexiblen Suchanfrage, kommt es oft vor, daß man schon vordefinierte fertige Suchabfragen in seiner Anwendung benötigt. Möchten Sie z.B. per Knopfdruck alle Adressen in eine Auswahlliste anzeigen, bei denen KEINE EMail-Adresse eingetragen ist, so gehen Sie folgendermaßen vor:

SQL = "SELECT * FROM Adressen WHERE " & _
  "EMail Is Null OR EMail = '' ORDER BY Name"
 
Load frm_Auswahlliste
With frm_Auswahlliste
  .Data1.RecordSource = SQL
  .Data1.Refresh
 
  ' Ergebnis prüfen
  ...
End With
Unload frm_Auswahlliste
 
' wenn ein Eintrag aus der Liste ausgewählt wurde
' oder sowieso nur ein Treffer vorhanden war
If AdrNr > 0 Then
  ...
End If

Die Code für die Ergebnisprüfung und Anzeige der gefundenen Datensätze entspricht exakt dem, wie bereits vorher ausführlich beschrieben.

Es lassen sich hier noch sehr viel weitere Beispiele für SQL-Suchanfragen aufführen, doch das würde den Rahmen dieses Workshops sprengen. Mit Hilfe des bisherigen Anschauungsmaterials sollten Sie jetzt aber in der Lage sein, einfache SQL-Suchanfrage ganz speziell für Ihre Bedürfnisse zu realisieren.

Auf die abschließende Zusammenfassung des dritten Teils soll diesmal verzichtet werden, da es ja schon eine Kurz-Zusammenfassung nach dem theoretischen Abschnitt zur SQL-Abfragesprache gab.



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.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle 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.