VBA
Ich bekam den Auftrag in Access mit VBA eine Funktion zu Programmieren, welche auf unsere Zeiterfassungsdatenbank (Dynabase2) zugreift, die Daten im ausgewählten Zeitrahmen ausliest und diese anschliessend auf die Korrektheit überprüft.
Da ich noch keine Ahnung hatte begann ich sehr einfach.
Zuerst suchte ich mir in den Bereits vorhandenen Funktionen den Datenbank-Zugriff und das Select-Statement.
Dabei fand ich folgende Code Zeilen:
Dim Db as Datebase
Dim Rs as Recordset
Set Db = CurrentDb()
Set Rs = Db.OpenRecordset("Select-Statement")
Die ersten beiden Zeilen deklarieren die Variablen Db als Datenbank und Rs als Recordset(Enthält Kopien von Datensätzen).
Mit CurrentDb() wird der Variable Db die aktuell im Access geöffnete DB zugewiesen. Mit OpenRecordset wird der Variable Rs eine Kopie der Daten, welche durch das Select-Statement ausgewählt werden zugewiesen.
Ich musste nun als erstes mein Select-Statement anpassen.
Ich brauchte die MitarbeiterID, das Datum und die beiden Uhrzeiten, welche Start und Beginn einer Arbeitsphase sind, aus der Tabelle Aktivitaet von allen Datensätzen, welche innerhalb des per GUI ausgewählten Datums lagen.
Also musste ich herausfinden, wie ich auf ein Objekt der benutzeroberfläche Zugriff.
Da ich die ganze Funktion per Button in der dazugehörigen Form aufrief, Programmierte ich bereits in der Richtigen Form. Aus diesem Grund konnte ich direkt über Me auf die Objekte zugreifen.
Das Startdatum wurde im Objekt ctlStart gespeichert und das Enddatum in ctlEnde. Da ich nun auf die Werte zugreifen wollte musste ich also die Values abrufen.
Das funktioniert so:
StartDatum = Me.ctlStart.Value
EndDatum = Me.ctlEnde.Value
Wobei StartDatum und EndDatum Date-Variablen darstellen.
Da ich später bemerkte dass das Select-Statement das Datum "Amerikanisch" interpretiert, also die 1 Zahl als Monat nahm, musste ich mir etwas anderes Einfallen lassen.
Dazu brauchte ich nun die Funktionen Year(), Month() und Day(). Als Parameter übergab man diesen Funktionen ein Datum und sie lasen automatisch jeweils Jahr, Monat und Tag heraus. Diese Werte konnte ich anschliessend an Variablen übergeben und das Datum der Select-Statement-Syntax anpassen.
Dabei musste ich es folgendermassen Formatieren: 03/24/2011 also Monat/Tag/Jahr
In der SQL Abfrage musste ich vor und hinter die Daten je noch ein # stellen und die Daten wurden erkannt.
Schlussendlich lautete mein Select-Statement folgendermassen:
"SELECT [MitarbeiterID], [Datum], [Zeit1], [Zeit2] FROM [Aktivitaet] WHERE [Datum] >= #" & Zeit1 & "# ABD [Datum] <= #" & Zeit2 & "# ORDER BY [MitarbeiterID], [Datum], [Zeit1]"
Die Wörter in [] sind dabei Spalten oder Tabellen(Aktivitaet) innerhalb der Datenbank. Zeit1 und Zeit2 beinhalten die ausgewählten Start- und End-Daten. Geordnet wurde die Ausgabe nach Mitarbeiter, dann nach Datum und dann nach Zeit.
Nun musste ich auf die einzelnen ausgegebenen Datensätze zugreifen.
Das funktioniert über folgende While-Schlaufe:
Do While Not Rs.EOF
Rs.MoveNext
Loop
Mit Not Rs.EOF wird die Schlaufe so lange durchlaufen, bis der Zeiger im Recordset ans Ende gelangt ist.
Mit Rs.MoveNext springe ich bei jedem Durchlauf auf den Nächsten Datensatz.
Nun brauchte ich noch den Zugriff auf die einzelnen Zellen des Datensatzes und das funktioniert so:
Variabel = Rs![Datum]
So wird der Variabel den Wert des Feldes Datum zugeordnet.
Zum Schluss muss man den Recordset und die Datenbank schliessen, bzw. die Instanzierung auflösen.
Das funktioniert mit Close.
Rs.Close
Db.Close
Alle Anderen Funktionen welche ich verwendete, sind hier irrelevant, weil sie entweder zu grundlegend waren oder ich sie bereits einmal in einem Anderen Post erwähnt habe. Ebenfalls haben sie nicht direkt etwas mit dem Datenbank-Programmieren zutun, sondern sind bloss normale VB bzw. VBA Funktionen.
Mittwoch, 30. März 2011
Abonnieren
Posts (Atom)