Access 2003 Programmierung mit Visual Basic Autor: Andreas Klein 3. Auflage: 2005 Merkwerk Alle Rechte vorbehalten. Kein Teil des Werkes darf in irgendeiner Form ohne Genehmigung der Firma Merkwerk reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Diese Schulungsunterlage wurde mit Sorgfalt erstellt und geprüft. Trotzdem können Fehler nicht vollkommen ausgeschlossen werden. Für fehlerhafte Angaben und deren Folgen kann daher keine Haftung übernommen werden.
Inhaltsverzeichnis 1 Lernziele 3 2 Namenskonventionen 4 3 Die Mitarbeitertabelle 5 4 Erstellung von Formularen 6 5 Verwaltung der Stammdaten 8 5.1 FORMULAR MITARBEITER...8 5.1.1 EIGENSCHAFTEN DER STEUERELEMENTE...9 5.1.2 PROGRAMMIERUNG...10 5.2 NEUER MITARBEITER...15 5.2.1 EIGENSCHAFTEN DER STEUERELEMENTE...16 5.2.2 PROGRAMMIERUNG...17 5.3 MITARBEITER ANZEIGEN...21 5.3.1 EIGENSCHAFTEN DER STEUERELEMENTE...22 5.3.2 PROGRAMMIERUNG...23 5.4 MITARBEITER BEARBEITEN... 25 5.4.1 EIGENSCHAFTEN DER STEUERELEMENTE...26 5.4.2 PROGRAMMIERUNG...27 6 Die Such-/Sortierfunktion 30 6.1.1 SORTIEREN:... 31 6.1.2 SUCHEN:... 32 7 Fehlerroutine 33 8 Datensätze nach Excel exportieren 34 www.merkwerk.de Seite 2
1 Lernziele Ziel der Schulung ist es, Ihnen verschiedene Möglichkeiten der ACCESS Programmierung zu zeigen. Lernziele sind die Verwendung von Tabellen, die Erstellung von Formularen, die Anbindung an Tabellen, das Anlegen, Bearbeiten und Löschen in Tabellen über ein Formular und die Verwendung von SQL Anweisungen. Basis ist eine Tabelle, mit den notwendigen Feldern für die Stammdatenpflege. Zur Anzeige und zur weiteren Verarbeitung wird ein Startdialog erstellt. Von diesem Startdialog ausgehend, soll die Möglichkeit bestehen, über verschiedene Schaltflächen die jeweiligen Formulare zur Bearbeitung aufzurufen und die Daten über die Formulare einzugeben oder zu verändern. Der Startdialog soll zudem die Möglichkeit bieten, Datensätze nach gewissen Kriterien zu suchen oder innerhalb der Liste zu sortieren. Die Formulare werden einzeln aufgeführt und im jeweiligen Kapitel komplett bearbeitet. Jedes Formular wird von der Erstellung über die Eigenschaften bis hin zum Programmcode durchgesprochen. www.merkwerk.de Seite 3
2 Namenskonventionen Notationen sind Programmierhilfen. Sie geben dem Programmierer zur Entwurfszeit Rückschlüsse auf den Datentyp des Objektes. Der Code wird lesbarer und es werden Fehlerquellen durch implizite Typumwandlungen vermieden. Sie sollen helfen, dass der Code übersichtlicher wird und somit auch Personen, die nicht bei der Entwicklung dabei waren, das Programm zu verstehen. Variablen sollten Präfixe erhalten, die auf den Datentyp verweisen: z.b. ibox = Variable vom Typ Integer ssql = Variable vom Typ String Beispiele am aktuellen Fall: Objekte Textfelder Listenfelder Kombinationsfelder Optionsfelder Formulare Tabellen Bezeichnungsfelder Befehlsschaltflächen Bezeichnung txtbezeichnung lstbezeichnung cbobezeichnung optbezeichnung frmbezeichnung tblbezeichnung lblbezeichnung cmdbezeichnung z.b.: = cmdbearbeiten www.merkwerk.de Seite 4
3 Die Mitarbeitertabelle Erstellen Sie in ACCESS eine neue Tabelle in der Entwurfsansicht. Speichern Sie die Tabelle unter dem Namen tblmitarbeiter. Die zu verwendenden Felder entnehmen Sie der Abbildung. Wenn diese Tabelle erstellt ist wechseln Sie in das Register Formulare. www.merkwerk.de Seite 5
4 Erstellung von Formularen Erstellen Sie ein neues Formular, welches den Namen frmmitarbeiter erhält. Zum Erstellen öffnen Sie die Entwurfsansicht. Sie erhalten eine leere Fläche, auf die Sie nach belieben die benötigten Steuerelemente setzen können. Bezeichnungsfeld Textfeld Optionsgruppe Listenfeld Optionsfeld Kombinationsfeld Befehlsschaltfläche www.merkwerk.de Seite 6
Um die Eigenschaften der Steuerelemente zu verändern klicken Sie mit der rechten Maustaste auf das gewünschte Element und verändern dann die Eigenschaften. Im folgenden werden immer die Wichtigsten genannt. www.merkwerk.de Seite 7
5 Verwaltung der Stammdaten 5.1 Formular Mitarbeiter www.merkwerk.de Seite 8
5.1.1 Eigenschaften der Steuerelemente Formular Beschriftung Datensatzmarkierer Navigationsschaltflächen Trennlinien Rahmenart Mitarbeiter Nein Nein Nein Dialog Listenfeld Name lstmitarbeiter Datensatzherkunft SELECT tblmitarbeiter.memoid, tblmitarbeiter.nachname, tblmitarbeiter.vorname, tblmitarbeiter.pkmitarbeiter FROM tblmitarbeiter; Spaltenzahl 4 Spaltenüberschriften Ja Spaltenbreiten 2,542cm;2,551cm;2,551cm;0cm Gebundene Spalte 4 Schaltflächen Name Beschriftung Reihenfolgenposition Optionsgruppe Name Standardwert Optionsfelder Name Textfeld Name Kombinationsfeld Name Wie gewünscht, beginnt immer mit cmd... Was soll danach ausgeführt werden. Wählen Sie, in welcher Reihenfolge die Elemente angesprochen werden sollen und vergeben die Nummer von 0 bis... frasortieren Hier 3, um MemoID zu aktivieren. Wie gewünscht, beginnend mit opt... txtfilter cbofilter www.merkwerk.de Seite 9
5.1.2 Programmierung Beim Starten des Programms soll der erste Eintrag im Listenfeld markiert werden. Öffnen des Formulars: Private Sub Form_Load() lstmitarbeiter.value = lstmitarbeiter.itemdata(1) Zusatz: Listenfeld per Code formatieren / füllen: Dim ssql As String ssql = "SELECT Vorname, Nachname, MemoID, pkmitarbeiter FROM tblmitarbeiter" lstmitarbeiter.columncount = 4 lstmitarbeiter.columnwidths = "2,5 cm;2,5 cm; 2,5 cm;0 cm" lstmitarbeiter.boundcolumn = 4 lstmitarbeiter.rowsource = ssql : www.merkwerk.de Seite 10
Schaltfläche Neu: Private Sub cmdbearbeiten_click() DoCmd.OpenForm "frmmitarbeiterneu" Schaltfläche Bearbeiten: Private Sub cmdbearbeiten_click() DoCmd.OpenForm "frmmitarbeiterbearbeiten" www.merkwerk.de Seite 11
Schaltfläche Löschen: Private Sub cmdloeschen_click() Dim ssql As String ssql = "DELETE * FROM tblmitarbeiter WHERE pkmitarbeiter =" & lstmitarbeiter.value Dim ocommand As ADODB.Command Set ocommand = New ADODB.Command ocommand.commandtext = ssql ocommand.activeconnection = CurrentProject.AccessConnection ocommand.execute Set ocommand = Nothing lstmitarbeiter.requery lstmitarbeiter = lstmitarbeiter.itemdata(1) www.merkwerk.de Seite 12
Schön wäre es noch, wenn der Benutzer vor dem Löschen gefragt wird, ob er wirklich löschen will. Das Löschen geschieht mit ocommand.execute, die Rückfrage könnte folgendermaßen aussehen: Dim ibox As Integer ibox = MsgBox("Wollen Sie den Datensatz wirklich löschen", vbyesno, "Datensatz löschen") If ibox = vbyes Then ocommand.execute End If www.merkwerk.de Seite 13
Schaltfläche Anzeigen: Private Sub cmdbearbeiten_click() DoCmd.OpenForm "frmmitarbeiteranzeigen" Schaltfläche Schliessen: Private Sub cmdschliessen_click() DoCmd.Close www.merkwerk.de Seite 14
5.2 Neuer Mitarbeiter Lernziele: Verwendung der AddNew Methode des Recordsets. Erstellen Sie ein neues Formular mit dem Namen frmmitarbeiterneu. Das Formular zur Neuanlage soll die Textfelder zur Eingabe der Stammdaten enthalten. www.merkwerk.de Seite 15
5.2.1 Eigenschaften der Steuerelemente Formular Beschriftung Datensatzmarkierer Navigationsschaltflächen Rahmenart Textfelder Name Aktiviert Gesperrt Schaltflächen Name Neu Nein Nein Dialog Wie gewünscht, immer beginnend mit txt... Ja Nein Beginnend mit cmd... www.merkwerk.de Seite 16
5.2.2 Programmierung Öffnen des Formulars: Beim Öffnen des Formulars soll der Speichern Schalter deaktiviert sein (das es zu diesem Zeitpunkt nichts zu speichern gibt). Private Sub Form_Load() cmdspeichern.enabled = False www.merkwerk.de Seite 17
Textfeld MemoID: Es soll nur möglich sein, den Datensatz zu speichern, wenn das Textfeld MemoID mindestens ein Zeichen enthält. Private Sub txtmemoid_change() If (Trim(txtMemoID.Text)) = "" Then cmdspeichern.enabled = False Else cmdspeichern.enabled = True End If www.merkwerk.de Seite 18
Schaltfläche Speichern: Private Sub cmdspeichern_click() Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.activeconnection = CurrentProject.AccessConnection rst.cursortype = adopenkeyset rst.locktype = adlockoptimistic rst.open "tblmitarbeiter" rst.addnew rst("memoid") = txtmemoid rst("vorname") = txtvorname rst("nachname") = txtnachname rst("telefon") = txttelefon rst("kostenstelle") = txtkostenstelle rst("abteilung") = txtabteilung rst.update rst.close Forms!frmMitarbeiter!lstMitarbeiter.Requery www.merkwerk.de Seite 19
Schaltfläche Abbrechen: Private Sub cmdabbrechen_click() DoCmd.Close www.merkwerk.de Seite 20
5.3 Mitarbeiter anzeigen Lernziele: Verwendung von SQL-Strings. Erstellen Sie ein neues Formular mit dem Namen frmmitarbeiteranzeigen. Ein aus der Liste gewählter Datensatz soll angezeigt werden Mit der Schaltfäche BEARBEITEN kann der angezeigte Datensatz geändert werden. Die E-Mail Adresse wird automatisch aus Vor- und Nachnamen erstellt. www.merkwerk.de Seite 21
5.3.1 Eigenschaften der Steuerelemente Formular Beschriftung Datensatzmarkierer Navigationsschaltflächen Rahmenart Textfelder Name Aktiviert Gesperrt Schaltflächen Name Anzeigen Nein Nein Dialog Wie gewünscht, immer beginnend mit txt... Ja Nein Beginnend mit cmd... www.merkwerk.de Seite 22
5.3.2 Programmierung Öffnen des Formulars: Private Sub Form_Load() Dim vpkfromlistbox vpkfromlistbox = Forms!frmMitarbeiter!lstMitarbeiter.Value Dim ssql As String ssql = "SELECT * FROM tblmitarbeiter WHERE pkmitarbeiter = " & vpkfromlistbox Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.open ssql, CurrentProject.AccessConnection, adopenkeyset, adlockreadonly, adcmdtext txtemail = rst("vorname") & "." & rst("nachname") & "@Firma.de" txtmemoid = rst("memoid") txtvorname = rst("vorname") txtnachname = rst("nachname") txttelefon = rst("telefon") txtkostenstelle = rst("kostenstelle") txtabteilung = rst("abteilung") rst.close www.merkwerk.de Seite 23
Schaltfläche Bearbeiten: Private Sub cmdbearbeiten_click() DoCmd.Close DoCmd.OpenForm "frmmitarbeiterbearbeiten" Schaltfläche Abbrechen: Private Sub cmdabbrechen_click() DoCmd.Close www.merkwerk.de Seite 24
5.4 Mitarbeiter bearbeiten Lernziele: Parameterübergabe und verwenden von SQL-Strings, Recordsetmethoden Erstellen Sie ein Formular mit dem Namen frmmitarbeiterbearbeiten. Das Formular soll einen in der Liste gewählten Datensatz auslesen und Änderungen an diesem in der Tabelle speichern. www.merkwerk.de Seite 25
5.4.1 Eigenschaften der Steuerelemente Detailbereich Beschriftung Bildlaufleisten Datensatzmarkierer Navigationsschaltflächen Rahmenart Gebunden Textfelder Name Aktiviert Gesperrt Bearbeiten Nein Nein Nein Dialog Ja Wie gewünscht, immer beginnend mit txt... Ja Nein Schaltflächen Name Beginnend mit cmd... www.merkwerk.de Seite 26
5.4.2 Programmierung Öffnen des Formulars: Private Sub Form_Load() Dim vpkfromlistbox as Variant vpkfromlistbox = Forms!frmMitarbeiter!lstMitarbeiter.Value Dim ssql As String ssql = "SELECT * FROM tblmitarbeiter WHERE pkmitarbeiter = " & vpkfromlistbox Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.open ssql, CurrentProject.AccessConnection, adopenkeyset, adlockreadonly, adcmdtext txtmemoid = rst("memoid") txtvorname = rst("vorname") txtnachname = rst("nachname") txttelefon = rst("telefon") txtkostenstelle = rst("kostenstelle") txtabteilung = rst("abteilung") rst.close www.merkwerk.de Seite 27
Textfeld MemoID: Es soll nur möglich sein, den Datensatz zu speichern, wenn das Textfeld MemoID mindestens ein Zeichen enthält. Private Sub txtmemoid_change() If (Trim(txtMemoID.Text)) = "" Then cmdspeichern.enabled = False Else cmdspeichern.enabled = True End If Schaltfläche Abbrechen: Private Sub cmdabbrechen_click() DoCmd.Close www.merkwerk.de Seite 28
Schaltfläche Speichern: Private Sub cmdspeichern_click() Dim vpkfromlistbox vpkfromlistbox = Forms!frmMitarbeiter!lstMitarbeiter.Value Dim ssql As String ssql = "SELECT * FROM tblmitarbeiter WHERE pkmitarbeiter = " & CStr(vPkFromListbox) Dim rst As ADODB.Recordset Set rst = New ADODB.Recordset rst.open ssql, CurrentProject.AccessConnection, adopenkeyset, adlockoptimistic, adcmdtext rst("memoid") = txtmemoid rst("vorname") = txtvorname rst("nachname") = txtnachname rst("telefon") = txttelefon rst("kostenstelle") = txtkostenstelle rst("abteilung") = txtabteilung rst.update rst.close Forms!frmMitarbeiter!lstMitarbeiter.Requery DoCmd.Close www.merkwerk.de Seite 29
6 Die Such-/Sortierfunktion Lernziele: Textoperation, die Verwendung von SQL-Strings, Funktionen. In diesem Kapitel wird die bereits angesprochene Such- und Sortierfunktion erläutert. Im Formular frmmitarbeiter wurde diese Funktion vorgesehen, um die Liste mit den Stammdaten nach vorgegebenen Kriterien zu Filtern und danach auch zu sortieren. www.merkwerk.de Seite 30
6.1.1 Sortieren: Private Sub frasortieren_click() Const ssql As String = "SELECT MemoID, Vorname, Nachname, pkmitarbeiter FROM tbmitarbeiter ORDER BY " Dim ssort As String Select Case frasortieren.value Case 1 ssort = " Nachname;" Case 2 ssort = " Vorname;" End Select lstmitarbeiter.rowsource = ssql & ssort www.merkwerk.de Seite 31
6.1.2 Suchen: Private Sub cmdsuchen_click() Dim ssuchen As String ssuchen = "SELECT MemoID, Vorname, Nachname, pkmitarbeiter FROM tblmitarbeiter " ssuchen = ssuchen & "WHERE " & cbofilter & " LIKE '" & txtfilter & "*'" lstmitarbeiter.rowsource = ssuchen www.merkwerk.de Seite 32
7 Fehlerroutine Um nicht vorgesehene Fehler abzufangen, bietet Visual Basic das Fehlerobjekt. Private Sub cmdneuermitabeiter_click() On Error GoTo Err_cmdNeuerMitabeiter_Click Hier steht die eigentliche Prozedur Exit_cmdNeuerMitabeiter_Click: Exit Sub Err_cmdNeuerMitabeiter_Click: MsgBox Err.Description Resume Exit_cmdNeuerMitabeiter_Click www.merkwerk.de Seite 33
8 Datensätze nach Excel exportieren Private Sub cmddatennach_excel_click() Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset rs.activeconnection = CurrentProject.AccessConnection rs.cursortype = adopenkeyset rs.locktype = adlockreadonly rs.open "tblmitarbeiter" Dim objexcel As Excel.Application Set objexcel = New Excel.Application objexcel.visible = True objexcel.workbooks.add objexcel.cursor = xlwait objexcel.range("a1").value = rs.fields(1).name objexcel.range("b1").value = rs.fields(2).name objexcel.range("c1").value = rs.fields(3).name objexcel.range("d1").value = rs.fields(4).name objexcel.range("a2").select Do Until rst.eof With objexcel.activecell.value = rs("memoid").activecell.offset(0, 1).Select.ActiveCell.Value = rs("vorname").activecell.offset(0, 1).Select.ActiveCell.Value = rs("nachname").activecell.offset(0, 1).Select.ActiveCell.Value = rs("telefon").activecell.offset(1, -3).Select End With rs.movenext Loop objexcel.cursor = xldefault rs.close Set objexcel = Nothing Set rs = Nothing www.merkwerk.de Seite 34
www.merkwerk.de Seite 35