16 DAO und andere Objekte
Transcription
16 DAO und andere Objekte
16 DAO und andere Objekte »A buon intenditore poche parole bastano. – Dem Kenner reichen wenige Worte.« Wenn Sie sich mit Objekten auskennen, kommen Sie im Umgang mit Access schneller zum Ziel. Darum jetzt dies Kapitel zum Thema. 16.1 Was ist ein Objekt? VBA ist eine teilweise objektorientierte Programmiersprache. Ich möchte Ihnen eine kurze Einführung in diese Programmiertechnik geben und zunächst einmal klären, was hier unter Objekten verstanden wird. Bei der Arbeit mit Access haben Sie immer mit Objekten zu tun. Beispielsweise ist Ihr Programm selbst, jedes Formular und jedes Steuerelement ein Objekt. 16.1.1 Objekthierarchien Man kann hier eine so genannte Objekthierarchie bilden. Das oberste Objekt, welches alle anderen beinhaltet, ist das Programm selbst. Im Programm können Formularobjekte enthalten sein. Und jedes der Formulare, also der Formularobjekte, kann Steuerelemente enthalten, die selbst Objekte sind. Ein Haus als Objekt vorstellen Zum besseren Verständnis sollten Sie sich einmal ein Objekt aus dem täglichen Leben vorstellen – nehmen wir das Objekt »Haus«. In dem Haus gibt es drei Ferienappartements, die ihrerseits auch wieder als Objekte betrachtet werden können. Diese Ferienappartement-Objekte enthalten weitere Objekte wie Zimmer, Fenster, Lichtschalter usw. Viele Objekte eines Hauses, wie beispielsweise Türen, gibt es an mehreren Stellen. Um vor lauter Objekten nicht den Überblick zu verlieren, bietet es sich an, eine Liste aller Türen zu führen. In der Programmierung werden solche Listen als Auflistung (engl. collection) bezeichnet. 228 Kapitel 16: DAO und andere Objekte Über die Objekthierarchie ist es also möglich, gezielt ein einzelnes Objekt auszuwählen – also z.B. die Tür zwischen Wohnzimmer und Esszimmer im Appartement im Obergeschoss. Diese Tür hat bestimmte Eigenschaften: Sie ist geöffnet oder geschlossen und hat eine bestimmte Farbe und Größe. Nun gibt es Methoden, diese Eigenschaften zu verändern: Sie können die Tür schließen oder mit einer anderen Farbe anstreichen. Übertragen auf Access funktioniert das genauso. 16.1.2 Objekte in Access Auch in Access gibt es Objekte, Eigenschaften und Methoden: Steuerelemente und Formulare sind Objekte, die von verschiedenen Eigenschaften beschrieben werden und die mit Methoden verändert werden können. Im Laufe dieses Buches haben Sie schon viele Erfahrungen gesammelt im Aufrufen von Objekten und im Einsatz von Methoden zum Ändern von Objekteigenschaften. Sie haben beispielsweise die Titelzeile des Formulars frmAppartements mithilfe der Eigenschaft Caption bestimmt, indem Sie frmAdressen.Caption = gstrMotto programmiert haben (wobei gstrMotto das Motto des Tages als String enthält). Wie Sie hier sehen, werden die Eigenschaften und Methoden eines Objekts durch einen Punkt mit dem Objektnamen verbunden. Bei der Arbeit mit Objekten werden Sie in der Form unterstützt, dass sobald Sie einen Punkt hinter einen Objektnamen setzen, sofort in einer Auswahlliste die zur Verfügung stehenden Eigenschaften und Methoden des Objekts gezeigt werden (vorausgesetzt, die Option ELEMENTE AUTOMATISCH AUFLISTEN ist unter EXTRAS OPTIONEN auf dem Registerblatt EDITOR ausgewählt). 16.1.3 Der Objektkatalog Im Visual Basic-Editor steht Ihnen ein Objektkatalog zur Verfügung. Hier finden Sie eine Übersicht über alle Objekte mit ihren Eigenschaften und Methoden. 16.1 Was ist ein Objekt? 229 Den Objektkatalog können Sie über die gleichnamige Schaltfläche, über ANSICHT OBJEKTKATALOG oder 因 aufrufen. Bild 16.1: Der Objektkatalog Die in Access zur Verfügung stehenden Objekte sind in Bibliotheken aufgeteilt. Normalerweise sind <ALLE BIBLIOTHEKEN> angewählt. Sie können die Liste aufklappen und gezielt einzelne Bibliotheken anschauen. ACCESS ist die allgemeine Access-Programmbibliothek, CASA MARIA steht für die aktuell geladene Datenbank und VBA ist die allgemeine VBA-Bibliothek. Im unteren Teil des Bildes ist hier als Beispiel im mittleren Fenster das Objekt APPLICATION selektiert, rechts die Eigenschaft FORMS, die selbst wieder ein Objekt oder genauer: eine Auflistung ist, in der sich alle geöffneten Formulare als Objekt ansprechen lassen. Damit Ihnen nicht vor lauter Objekten in Objekten in Objekten der Kopf schwirrt, noch einmal eine kurze Orientierung. 16.2 Wozu sind Objekte gut? Sie können sich nicht vorstellen, wozu die ganzen Objekte gut sein sollen? Dann betrachten Sie das Ganze doch einmal von der praktischen Seite her: 230 Kapitel 16: DAO und andere Objekte Sie möchten das Textfeld TXTTEXT im Formular frmFormular ändern? Mit Forms!frmFromular!txtText.value="Neuer Eintrag" greifen Sie darauf zu, d.h., Sie nutzen das FORMS-Objekt! Sie möchten den Bericht rptBericht ausdrucken? Dazu geben Sie die Zeile DoCmd.OpenReport "rptBericht" in Ihr Programm ein. Damit nutzen Sie das DoCmd-Objekt! 16.3 Der With-Befehl Ich möchte Ihnen nun das Befehlswort With beschreiben, das die Arbeit mit Objekten vereinfachen, zumindest aber etwas Schreibarbeit ersparen kann. Für das Formular frmObjektTest habe ich folgendes Programm geschrieben, das beim Klick auf die Schaltfläche CMDTEXTFELDERÄNDERN ausgelöst wird: Private Sub cmdTextfelderÄndern_Click() txtEintrag1.BackColor = 65535 txtEintrag1.ForeColor = 8421440 txtEintrag1.FontBold = True txtEintrag1.Value = "Casa Maria" txtEintrag1.TextAlign = 2 ' Zentriert End Sub In jeder Zeile muss wieder der Name des Textfeldes erwähnt werden. Mit With geht es kürzer: Private Sub cmdTextfelderÄndern_Click() With txtEintrag1 .BackColor = 65535 .ForeColor = 8421440 .FontBold = True .Value = "Casa Maria" .TextAlign = 2 ' Zentriert End With End Sub Wichtig ist, dass jede der Eigenschaften mit einem Punkt eingeleitet wird. So ist eindeutig, dass es sich um eine Objekteigenschaft oder -methode handelt. 16.3 Der With-Befehl 231 16.4 Auflistungen Eine Auflistung ist ein Spezialfall eines Feldes mit Objekten. Am einfachsten kann ich das an einem Beispiel erläutern: Alle Steuerelemente eines Formulars gehören automatisch zu der Auflistung Controls, die wiederum eine Eigenschaft des Formulars ist. Mit MsgBox frmForm.Controls(0).Name würde der Name des ersten Steuerelements des geöffneten Formulars frmForm in einer MessageBox ausgegeben werden. Sie könnten aber auch durch frmForm.Controls("txtEintrag1").Value = "Dies ist ein Text" den Text des Textfelds mit dem Namen Eintrag1 setzen. Das geht ebenso, nur kürzer, mit frmForm.Controls!txtEintrag1.Value = "Dies ist ein Text" Oder Sie schreiben für das gerade aktive Formular Me.Controls("txtEintrag1").Value = "Dies ist ein Text" Mehrere Textfelder unsichtbar machen Hier ein kleiner Zaubertrick, wie Sie mehrere Textfelder eines Formulars unsichtbar machen können. Zum Ausprobieren binden Sie folgende For...Next-Schleife in die oben für das Formular frmObjektTest erstellte Prozedur. Dim strSpeicher As String Dim intZähler As Integer For intZähler = 1 To 3 ' Feldname aus Text und Ziffer bilden strSpeicher = "txtEintrag" & intZähler Forms("frmObjektTest").Controls(strSpeicher).Visible _ = False Next Die Textfelder des Formulars frmObjektTest haben die Namen TXTTXTEINTRAG2 und TXTEINTRAG3. Deshalb lassen sie sich mit der obigen For...Next-Schleife nacheinander unsichtbar machen. EINTRAG1, 232 Kapitel 16: DAO und andere Objekte 16.5 Makroaktionen über DoCmd-Objekt nutzen Mithilfe des DoCmd-Objekts können Sie bis auf wenige Ausnahmen alle Access-Aktionen ausführen, die sich mit Makros auslösen lassen. Um den Bericht rptAppartements in der Seitenansicht zu öffnen, schreiben Sie: DoCmd.OpenReport "rptAppartements", acViewPreview Wie gewohnt werden Sie im Visual Basic-Editor durch die Eingabehilfen unterstützt. Neben der Seitenansicht erhalten Sie zur Auswahl angeboten: ACVIEWNORMAL (Ausdruck), ACVIEWDESIGN (Entwurf). Außerdem stehen die Pivot-Ansichten zur Verfügung. Bild 16.2: Konstanten anzeigen als Eingabeunterstützung Eine Auflistung aller DoCmd-Methoden finden Sie im Objektkatalog. Tippen Sie einfach DoCmd in das Suchfeld des Objektkatalogs und starten Sie die Suche mit Klick auf das SUCHEN-Symbol. Bild 16.3: Elemente des DoCmdObjekts anzeigen lassen 16.5 Makroaktionen über DoCmd-Objekt nutzen 233 Wenn Sie ein Element der Liste markieren, können Sie mit Klick auf das Fragezeichen einen Hilfetext zur jeweiligen DoCmd-Methode anzeigen lassen. Manchmal gibt es Alternativen zu DoCmd Zu einer Reihe von DoCmd-Methoden gibt es VBA-Befehle, die Sie als Alternative einsetzen können. Achten Sie in den Hilfetexten auf entsprechende Hinweise. So nutzen Sie z.B. statt DoCmd.GoToControl "txtAnreise" besser txtAnreise.SetFocus. 16.6 Datenbankzugriff mit DAO Manchmal kann es praktisch sein, die Daten einer Datenbank direkt zu ändern oder zu ergänzen. 16.6.1 Unterschiedliche Wege zu den Daten Microsoft hat für den Zugriff auf die Daten einer Datenbank im Laufe der Zeit mehrere Zugriffsprogrammmodule entwickelt. Die beiden wichtigsten sind DAO und ADO. DAO DAO, Data Access Objects, ist eine Sammlung von Objekten, die Methoden und Eigenschaften bereitstellen, um auf Access- und andere Datenbanken zuzugreifen. DAO wurde für Access entwickelt, beim Zugriff auf andere Datenbanken kann es zu Einschränkungen kommen. Mit DAO können alle Möglichkeiten des Access-Datenbankkerns, der so genannten Jet-Engine, genutzt werden. ADO Seit Access 2000 liefert Microsoft die Datenbankzugriffsschnittstelle ADO, Active Data Objects. Ebenso wie DAO stellt ADO Ob- 234 Kapitel 16: DAO und andere Objekte jekte, Methoden und Eigenschaften zum Zugriff auf Datenbanken bereit, allerdings nicht mehr auf Access spezialisiert. ADO ist die neuere und leistungsfähigere Zugriffsvariante, deren Verwendung von Microsoft empfohlen wird. DAO oder ADO? Nun stellt sich die Frage: DAO oder ADO? Formulieren wir es einmal so: die Zukunft gehört (zumindest bis Microsoft etwas Neues einfällt) ADO, aber wenn Sie nicht komplexe Programmsysteme erstellen möchten, ist DAO für den Einstieg besser geeignet. Einsatz von DAO ermöglichen Sie können DAO nur verwenden, wenn Sie einen Verweis auf die entsprechende Objektbibliothek aktiviert haben. Rufen Sie über EXTRAS VERWEISE das Dialogfeld VERWEISE im VISUAL BASIC-EDITOR auf und wählen Sie den Eintrag MICROSOFT DAO 3.6 OBJECT LIBRARY. 16.6.2 Recordset-Objekte Bei dem Einsatz von DAO wird mit so genannten Recordsets gearbeitet. Was ist ein Recordset? In einem Recordset-Objekt wird die Ergebnismenge eines Zugriffs auf Daten der Datenbank zurückgegeben. Mithilfe der Methoden des Objekts kann die Sortierung der Daten geändert werden, es kann nach bestimmten Werten gesucht und Daten können geändert werden. Ein Recordset kann man sich als eine Tabelle von Daten vorstellen, die mithilfe eines SQL-Befehls zusammengestellt wurden. Der SQL-Befehl bestimmt die Spalten der Tabelle. Ein Datensatzzeiger zeigt intern auf den aktuellen Datensatz. Sollen die Inhalte eines Datensatzes bearbeitet werden, muss der Datensatzzeiger mithilfe der Move-Methoden des Recordsets zum entsprechenden Datensatz verschoben werden. 16.6 Datenbankzugriff mit DAO 235 Die Eigenschaften BOF und EOF ermöglichen die Kontrolle des Datensatzzeigers. Hat BOF den Wert True, steht der Datensatzzeiger vor dem ersten Datensatz. Ist die Position des Datensatzzeigers hinter dem letzten Datensatz des Recordsets, ist EOF wahr. Die Methode AddNew fügt dem Recordset einen neuen, leeren Datensatz hinzu. Mit Edit bearbeiten Sie den aktuellen Datensatz. Die Methode Delete löscht den aktuellen Datensatz. Voraussetzung dafür ist allerdings, dass die Ergebnismenge bearbeitbar ist, d.h. die Eigenschaft Updatable wahr ist. Tabelle 16.1: Eigenschaften eines Recordsets Tabelle 16.2: Methoden eines Recordsets 236 Eigenschaften Bemerkung BOF (Begin Of File) ist dann wahr, wenn der Datensatzzeiger vor dem ersten Datensatz steht. EOF (End Of File) ist dann wahr, wenn der Datensatzzeiger hinter dem letzten Datensatz steht. NoMatch ist wahr, wenn eine Suche mit den Find-Methoden ohne Ergebnis war. RecordCount gibt die Anzahl der Datensätze im Recordset zurück; bei Recordsets vom Dynaset ist der Wert erst aktuell, wenn zuvor die Methode MoveLast ausgeführt wurde. Updatable Die Daten des Recordsets können geändert werden bzw. Datensätze können gelöscht und hinzugefügt werden, wenn die Eigenschaft Updatable wahr ist. Methode Bemerkung MoveNext bewegt den Datensatzzeiger zum nächsten Datensatz. MovePrevious bewegt den Datensatzzeiger zum vorhergehenden Datensatz. MoveFirst bewegt den Datensatzzeiger zum ersten Datensatz. MoveLast bewegt den Datensatzzeiger zum letzten Datensatz. FindFirst Kriterien sucht den ersten Datensatz, der den Kriterien entspricht. FindNext Kriterien sucht den nächsten Datensatz, der den Kriterien entspricht. FindLast Kriterien sucht den letzten Datensatz, der den Kriterien entspricht. Kapitel 16: DAO und andere Objekte Tabelle 16.2 (Forts.): Methoden eines Recordsets Methode Bemerkung FindPrevious Kriterien sucht den vorhergehenden Datensatz, der den Kriterien entspricht. Edit schaltet einen Datensatz in den Bearbeitungsmodus. AddNew hängt einen neuen, leeren Datensatz an das Recordset. Update schreibt einen neuen oder aktualisierten Datensatz in die Datenbank. Um auf die Werte in den Tabellenspalten des Recordsets zuzugreifen, verwenden Sie die Feldnamen in der Form DAO.Recordset("Feldname") oder besser DAO.Recordset!Feldname. Mit Recordsets arbeiten Jetzt möchte ich Ihnen zeigen, wie Sie mit Recordsets in Ihrer Datenbank Daten verändern, hinzufügen oder löschen können. Wenn Sie auf die Tabelle tblAdressenDeutschland zugreifen möchten, schreiben Sie am Anfang Ihrer Prozedur: Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset("tblAdressenDeutschland") Damit deklarieren Sie die Variable rst als Recordset, das Sie dann mit Set öffnen, wobei CurrentDb für die aktuelle Datenbank steht. Um auf die Werte in den Tabellenspalten des Recordsets zuzugreifen, verwenden Sie die Feldnamen in der Form DAO.Recordset("Feldname") oder besser DAO.Recordset!Feldname Mit der Variablen rst brauchen Sie dann einfach nur rst.Nachname zu schreiben, um das zugehörige Feld anzusprechen. 16.6 Datenbankzugriff mit DAO 237 Daten verändern Um den aktuellen Datensatz zu ändern, kopieren Sie mit Edit die Daten in einen internen Puffer. Sind die Daten bearbeitet, wird die Änderung mit Update geschrieben. Erst danach sind die Bearbeitungen dauerhaft gespeichert. Public Sub DatensatzÄndern_DAO() Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset("tblAdressenDeutschland") ' Alle Datensätze durchlaufen (bis EOF -End of File) Do Until rst.EOF ' Recordset bearbeiten rst.Edit ' Allen Nachnamen 'von' voranstellen rst!Nachname = "von " & rst!Nachname ' Datensatzänderungen speichern rst.Update ' Zum nächsten Datensatz gehen rst.MoveNext Loop rst.Close End Sub Mit dieser Prozedur machen Sie alle Casa-Maria-Gäste zu Adeligen. Wenn Sie das von vor den Namen wieder entfernen wollen, ändern Sie die Programmzeile für den nächsten Durchlauf einfach wie folgt: rst!Nachname = Right(rst!Nachname, Len(rst!Nachname) - 4) Neue Datensätze hinzufügen Mithilfe von AddNew wird dem Recordset ein neuer Datensatz hinzugefügt. Dem zunächst leeren Datensatz können dann Felder zugeordnet werden. Nach Update werden die Daten in die zugrunde liegende Tabelle geschrieben. Private Sub DatensatzHinzufügen_DAO() Dim rst As dao.Recordset Set rst = CurrentDb.OpenRecordset("tblBuchungen") With rst ' Neuen Datensatz anlegen .AddNew 238 Kapitel 16: DAO und andere Objekte ' Mit Daten füllen !Appartementnummer = 12 !Buchungsnummer = 200300301 ' Datum in englischer Schreibweise !Anreise = #3/13/2003# !Abreise = #3/21/2003# ' Neuen Datensatz speichern .Update End With rst.Close End Sub Datensätze löschen Sie können den aktuellen Datensatz mit Delete löschen. Es bietet sich an, dafür ein Recordset für eine Abfrage zu erstellen. Dazu wird bei der Definition des Recordsets einfach der Name der Abfrage eingetragen. Public Sub DatensatzLöschen_DAO() Dim rst As dao.Recordset Set rst = CurrentDb.OpenRecordset("qryAlteBuchungen") ' qryAlteBuchungen zeigt Buchungen, ' deren Abreisedatum mehr als 400 Tage zurück liegt. ' Ist das Recordset bearbeitbar? If rst.Updatable = False Then MsgBox "Recordset kann nicht aktualisiert werden" Exit Sub End If ' Alle Datensätze durchlaufen Do Until rst.EOF ' Datensatz löschen rst.Delete ' Zum nächsten Datensatz gehen rst.MoveNext Loop rst.Close End Sub Schluss mit dem DAOismus Genug der Theorie. Im nächsten Kapitel geht es um die praktische Umsetzung des neu gewonnenen Wissens um VBA, DAO und Co. 16.6 Datenbankzugriff mit DAO 239