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":
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 Set rs = Db.OpenRecordset(SQL, dbOpenDynaset) dbOpenSnapshot Set rs = Db.OpenRecordset(SQL, dbOpenSnapshot) dbOpenForwardOnly 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. VoraussetzungenUm 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 Eigenschaften von Data1
Eigenschaften von DBGrid1
Ü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. 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: 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. Dieser Workshop wurde bereits 28.888 mal aufgerufen.
Anzeige
![]() ![]() ![]() (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. |
vb@rchiv CD Vol.6 ![]() ![]() Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats ![]() Dieter Otter sevTabStrip: Rechtsklick auf Reiter erkennen Eine Funktion, mit der sich prüfen lässt, auf welchen Tab-Reiter ein Mausklick erfolgte sevWizard für VB5/6 ![]() Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) |
|||||||||||||||||||||||||||||||||||||||
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. |