Warum noch ein Access-Buch?
Für wen ist das Buch?
Jetzt bestellen
+ direkter Download des eBooks!
Nur EUR 59,95!
Fehler gefunden?
Bitte melden!
Wünsche an das Buch?
Her damit!
Was denken die Leser über dieses Buch?
Lesen Sie aktuelle Rezensionen!
Kapitel des noch nicht veröffentlichten Buchs zum Downloaden, Probelesen und Kommentieren
Beispieldatenbanken
Zusätzliches Material

Das Buch im HTML-Format

Für unbestimmte Zeit bieten Addison-Wesley und André Minhorst den kompletten Inhalt des Buchs als Download an. Schauen Sie rein und informieren Sie sich über den Inhalt! Und wenn Ihnen das Buch nützlich erscheint und Sie glauben, dass Sie etwas gelernt haben oder durch das Gelesene sogar etwas Zeit und somit Geld bei Ihrer Arbeit einsparen konnten, können Sie sich ja beim Autor und beim Verlag revanchieren - beispielsweise durch den Kauf dieses Buchs.

Am schönsten wäre es natürlich, wenn Sie das Buch direkt hier bestellen - Sie erhalten das Buch dann direkt vom Verlag, und der Autor und Verlag haben dann noch mehr davon, als wenn Sie es anderswo kaufen.

Danke für Ihr Interesse!

15.8.2 Benutzerdefinierte Auflistungsklassen

15.8.3 Nachbildung relationaler Beziehungen per Auflistungsklasse

Solange Anwendungen einen überschaubaren Rahmen haben und nicht allzu viel VBA-Code notwendig ist, um alle Aufgaben zu erledigen, benötigen Sie Techniken wie die nachfolgend vorgestellte sicher nicht.

Unter Umständen müssen Sie aber innerhalb einer Datenbankanwendung beispielsweise Berechnungen durchführen und Daten ermitteln, die über viele Tabellen verteilt sind. In diesem Fall wäre es sicher angenehm, wenn Sie etwa auf verknüpfte Tabellen und ihre Felder über hierarchisch angeordnete Objekte zugreifen könnten - also genau wie im oben genannten Beispiel mit dem Database-Objekt und den enthaltenen Tabellen, die wiederum aus mehreren Feldern bestehen.

Als einfaches Beispiel dienen zwei Tabellen, die Mitarbeiter und ihre Abwesenheitszeiten durch Urlaub, Krankheit oder Fortbildung enthalten. Die beiden Tabellen stehen in einer 1:n-Beziehung zueinander. Zusätzlich sollen zum Mitarbeiterobjekt die Abteilung und zum Abwesenheitsobjekt die Abwesenheitsart aus den jeweiligen Lookup-Tabellen hinzugefügt werden (siehe Abbildung 15.11).

Ziel ist es nun, etwa wie in der folgenden Routine auf die in den Tabellen enthaltenen Daten zugreifen zu können. Dort wird ein Objekt namens Personal mit dem Typ clsPersonal instanziert, das eine Auflistung namens AlleMitarbeiter enthält. Die Auflistung erlaubt genau wie die oben vorgestellten eingebauten Auflistungen das Durchlaufen der einzelnen Elemente und sogar das Ausgeben der Eigenschaften dieser Elemente wie MitarbeiterID, Vorname oder Nachname. Die Ausgabe dieser Routine soll wie in Abbildung 15.12 aussehen:

Public Function AlleMitarbeiterAusgeben()

    Dim Personal As clsPersonal
    Dim Mitarbeiter As clsMitarbeiter
    Dim i As Integer

    Set Personal = New clsPersonal

    For Each Mitarbeiter In Personal.AlleMitarbeiter
        With Mitarbeiter
            Debug.Print "MitarbeiterID: " & .MitarbeiterID
            Debug.Print "Name: " & .Nachname & ", " & .Vorname
            Debug.Print "================"
        End With
    Next Mitarbeiter

    Set Personal = Nothing

End Function

Listing 15.30: Zugriff auf eine Mitarbeiterauflistung

Abbildung 15.11: Diese Tabellen sollen durch Objekte abgebildet werden

Für die Realisierung eines Zugriffs per Objekt auf in der Datenbank gespeicherte Daten benötigen Sie zwei Klassen namens clsPersonal und clsMitarbeiter.

Abbildung 15.12: Ausgabe der Routine aus Listing 15.30

Die erste Klasse enthält lediglich die Deklaration des Collection-Objekts zur Aufnahme der Mitarbeiter-Objekte und eine Property Get-Prozedur zum Zusammenstellen und Zurückgeben des Collection-Objekts.

Dim mAlleMitarbeiter As Collection

Public Property Get AlleMitarbeiter() As Collection

    'Wenn die Auflistung noch nicht existiert ...
    If mAlleMitarbeiter Is Nothing Then

        'Auslistung instanzieren
        Set mAlleMitarbeiter = New Collection
        Dim db As DAO.Database
        Dim rst As DAO.Recordset

        'Mitarbeiterobjekt instanzieren
        Dim objMitarbeiter As clsMitarbeiter

        'Datenbankobjekte instanzieren,
        'um Mitarbeiter in die Objekte zu laden
        Set db = CurrentDb
        Set rst = db.OpenRecordset("SELECT MitarbeiterID " _
            & "FROM tblMitarbeiter", dbOpenDynaset)

        'Für jeden Mitarbeiter ein eigenes Objekt anlegen
        'und an die Auflistung anfügen
        Do While Not rst.EOF
            'Neues Mitarbeiterobjekt erstellen
            Set objMitarbeiter = New clsMitarbeiter
            'Füllen des Objekts mit den Mitarbeitereigenschaften
            objMitarbeiter.Laden rst!MitarbeiterID
            rst.MoveNext
            'Mitarbeiterobjekt zur Auflistung hinzufügen
            mAlleMitarbeiter.Add objMitarbeiter
            Set objMitarbeiter = Nothing
        Loop

        Set rst = Nothing
        Set db = Nothing

    End If

    Set AlleMitarbeiter = mAlleMitarbeiter

End Property

Listing 15.31: Die Klasse clsPersonal liefert eine Collection mit Mitarbeiter-Objekten zurück

Die zweite Klasse, clsMitarbeiter, dient dem Erstellen der einzelnen Mitarbeiter-Objekte. Sie enthält die Property Let- und Propety Set-Methoden für die Eigenschaften MitarbeiterID, Vorname, Nachname und Abteilung sowie die Function-Methode Laden, die den Mitarbeiter mit der angegebenen MitarbeiterID in das Objekt lädt.

Dim mMitarbeiterID As Long
Dim mVorname As String
Dim mNachname As String
Dim mAbteilung As String

Public Property Get MitarbeiterID() As Long
    MitarbeiterID = mMitarbeiterID
End Property

Public Property Let MitarbeiterID(lngMitarbeiterID As Long)
    mMitarbeiterID = lngMitarbeiterID
End Property

Public Property Get Vorname() As String
    Vorname = mVorname
End Property

Public Property Let Vorname(strVorname As String)
    mVorname = strVorname
End Property

Public Property Get Nachname() As String
    Nachname = mNachname
End Property

Public Property Let Nachname(strNachname As String)
    mNachname = strNachname
End Property

Public Property Get Abteilung() As String
    Abteilung = mAbteilung
End Property

Public Property Let Abteilung(strAbteilung As String)
    mAbteilung = strAbteilung
End Property

Public Function Laden(lngMitarbeiterID As Long) As Boolean

    Dim db As DAO.Database
    Dim rst As DAO.Recordset

    Set db = CurrentDb

    'ID des Mitarbeiter zuweisen
    mMitarbeiterID = lngMitarbeiterID

    'Datensatz mit der angegebenen MitarbeiterID öffnen
    '(enthält Mitarbeiterdaten und Abteilung)
    Set rst = db.OpenRecordset("SELECT tblMitarbeiter.*, " _
        & "tblAbteilungen.Abteilung FROM tblMitarbeiter " _
        & "INNER JOIN tblAbteilungen ON tblMitarbeiter.AbteilungID " _
        & "= tblAbteilungen.AbteilungID WHERE MitarbeiterID = " _
        & mMitarbeiterID, dbOpenDynaset)

    'Falls Datensatz vorhanden, Eigenschaften zuweisen
    If Not rst.EOF Then
        mVorname = rst!Vorname
        mNachname = rst!Nachname
        mAbteilung = rst!Abteilung
        Laden = True
    End If

    Set rst = Nothing
    Set db = Nothing

End Function

Listing 15.32: Code der Klasse clsMitarbeiter

Mit diesen beiden Klassen können Sie wie in Listing 15.30 auf die Auflistung aller Mitarbeiter und die Eigenschaften der einzelnen Listeneinträge zugreifen. Der Aufwand hierfür ist gar nicht so hoch, wenn man vom relativ umfangreichen Code absieht. Dieser enthält aber ohnehin fast nur Property-Prozeduren, deren Herstellung keine große Denkleistung erfordert - Sie können ähnliche Klassen mit ein wenig Fleißarbeit leicht selbst nachbauen.

Nächster Abschnitt:

15.8.4 »Echtes« Objekt mit Auflistung

© 2006-2008 André Minhorst Alle Rechte vorbehalten.