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!

3.3.4 Datensatzquelle per VBA zuweisen

3.3.5 Parameter statt Zusammensetzen von SQL-Ausdrücken

Auch in anderen, einfacheren Fällen, in denen eine Abfrage lediglich aus einer einzigen Tabelle besteht und nur ein Parameter eingesetzt werden muss, verwenden viele Entwickler VBA, um einen SQL-String zusammenzusetzen und diesen als Datensatzquelle zu verwenden. Das sieht dann beispielsweise so aus:

Private Sub ListenfeldAktualisieren()

    Dim strSQL As String
    Dim strSQLSelect As String
    Dim strSQLWhere As String

    'Basisabfrage (SELECT-Teil)
    strSQLSelect = "SELECT AbwesenheitID, StartDatum, EndDatum, " _
        & " Abwesenheitsart FROM tblAbwesenheitsarten " _
        & "INNER JOIN tblAbwesenheiten " _
        & "ON tblAbwesenheitsarten.AbwesenheitsartID = " _
        & "tblAbwesenheiten.Abwesenheitart "

    'Erstes Kombinationsfeld auswerten
    If Not Nz(Me!cboMitarbeiter, 0) = 0 Then
        strSQLWhere = "MitarbeiterID = " & Me!cboMitarbeiter
    End If

    'Zweites Kombinationsfeld auswerten
    If Not Nz(Me!cboJahr, 0) = 0 Then
        If Len(strSQLWhere) > 0 Then
            strSQLWhere = strSQLWhere & " AND "
        End If
        strSQLWhere = strSQLWhere _
            & "Year(tblAbwesenheiten.StartDatum) = " _
            & Me!cboJahr.Column(1)
    End If

    'SELECT-Teil zum SQL-Ausdruck hinzufügen
    strSQL = strSQLSelect

    'Falls WHERE-Bedingung vorhanden,
    'WHERE-Teil zum SQL-Ausdruck hinzufügen
    If Len(strSQLWhere) > 0 Then
        strSQL = strSQL & " WHERE " & strSQLWhere
    End If

    'Neue Datensatzherkunft zuweisen und Listenfeld aktualisieren
    Me!lstAbwesenheiten.RowSource = strSQL
    Me!lstAbwesenheiten.Requery

End Sub

Listing 3.1: Datensatzherkunft für ein Listenfeld per zusammengesetztem SQL-Ausdruck ermitteln

Die Prozedur wird von den beiden Prozeduren aufgerufen, die durch die Ereigniseigenschaft Nach Aktualisierung der beiden Kombinationsfelder cboMitarbeiter und cboJahr ausgelöst werden. Die hier ermittelte SQL-Anweisung ist bei keiner Ausführung kompiliert.

Eine Alternative ist die Verwendung einer gespeicherten Abfrage mit Parametern. Die Parameter, die normalerweise die Anzeige eines Dialogs zum Eingeben des Parameters hervorrufen, füllen Sie ebenfalls per VBA. Beim späteren Aufruf weisen Sie dem Listenfeld ein Recordset zu, das auf der kompilierten Abfrage inklusive Parametern basiert.

Dies funktioniert übrigens erst ab Access XP. Unter Access 2000 und älteren Versionen von Access haben Kombinations- und Listenfelder noch keine Recordset-Eigenschaft.

Die Abfrage sieht wie in Abbildung 3.7 aus. Die ersten vier Felder der Abfrage werden angezeigt, die letzten beiden sind lediglich Kriterienfelder. Als Kriterien dienen die per VBA zu füllenden Parameter [cboMitarbeiter] und [cboJahr]. Ersterer wird direkt mit dem Inhalt des Feldes MitarbeiterID verglichen, Letzterer mit dem Ausdruck, der durch die Anwendung der Jahr-Funktion auf dem Inhalt des Feldes StartDatum erzeugt wird. Dabei handelt es sich um die dem Datum entsprechende Jahreszahl.

Nun fehlt noch die Prozedur, mit der die Parameter per Code gefüllt werden und das Ergebnis der Abfrage dem Listenfeld zugewiesen wird. Diese Prozedur erstellt ein QueryDef-Objekt auf Basis der Abfrage qryFrmAbwesenheitenLstAbwesenheitParameter. Dieses Objekt enthält eine Auflistung namens Parameters, mit der Sie die in der Abfrage gespeicherten Parameter referenzieren und die gewünschten Werte zuweisen können. Der Parameter [cboMitarbeiter] soll mit dem gebundenen Feld der Datensatzherkunft des Kombinationsfeldes cboMitarbeiter gefüllt werden, der Parameter [cboJahr] wird mit dem im Kombinationsfeld cboJahr angezeigten Wert bestückt. Beachten Sie, dass der angezeigte Wert nicht mit dem Wert des gebundenen Feldes übereinstimmt, sondern das Jahr und nicht dessen ID enthält!

Abbildung 3.7: Abfrage mit Parametern

Nach dem Füllen der Parameter wird die Abfrage mit der OpenRecordset-Methode ausgeführt und das Ergebnis in ein Recordset-Objekt geschrieben, das schließlich der entsprechenden Eigenschaft des Listenfeldes zugewiesen wird.

Die Prozedur verwendet einige Objekte, Methoden und Eigenschaften der DAO-Bibliothek von Access. Detaillierte Informationen finden Sie in Kapitel 9, »DAO«.

Private Sub ListenfeldAktualisierenParameter()

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

    'Database- und Querydef-Objekt festlegen
    Set db = CurrentDb
    Set qdf = db.QueryDefs("qryFrmAbwesenheitenLstAbwesenheitenParameter")

    'Parameter [cboMitarbeiter] mit der im Kombinationsfeld
    'cboMitarbeiter ausgewählten MitarbeiterID füllen
    qdf.Parameters("cboMitarbeiter").Value = Me!cboMitarbeiter
    'Parameter [cboJahr] mit dem im Kombinationsfeld angezeigten
    'Jahr füllen
    qdf.Parameters("cboJahr").Value = Me!cboJahr.Column(1)

    'Abfrage ausführen und Ergebnis in Recordset-Objekt ablegen
    Set rst = qdf.OpenRecordset

    'Recordset der gleichnamigen Eigenschaft des Listenfelds zuweisen
    Set Me!lstAbwesenheiten.Recordset = rst
    Set rst = Nothing
    Set qdf = Nothing
    Set db = Nothing

End Sub

Listing 3.2: Listenfeld mit Parameterabfrage füllen

Der erste Test mit dieser Routine läuft nur zufrieden stellend, wenn in beiden Kombinationsfeldern ein Wert ausgewählt ist. Eigentlich soll das Listenfeld beim Öffnen des Formulars alle Abwesenheiten anzeigen, beim Auswählen eines Mitarbeiters ohne Jahr alle Abwesenheiten dieses Mitarbeiters für alle Jahre, um beim Auswählen lediglich eines Jahres alle Abwesenheiten dieses Jahres für alle Mitarbeiter zu berücksichtigen.

Das funktioniert deshalb nicht, weil die Abfrage beispielsweise bei fehlender Auswahl des Mitarbeiters den Wert Null als Parameter übergibt. Und da es keine Mitarbeiter mit der MitarbeiterID Null gibt, werden auch keine Abwesenheiten angezeigt. Das Gleiche gilt für die Auswahl des Jahres.

Die Verwendung von Null als Standardwert bei fehlender Eingabe eines Parameters ist übrigens nicht zwingend, sondern in diesem Fall durch die Verwendung des Standarddatentyps Variant bedingt. Sie können für einen Parameter in der Abfragedefinition durchaus andere Datentypen angeben; folglich werden dann auch die entsprechenden Standardwerte bei fehlendem Wert verwendet (etwa 0 bei Zahlentypen oder eine leere Zeichenkette bei String-Variablen).

Sie müssen also dafür sorgen, dass die Parameter im Falle einer fehlenden Auswahl neutralisiert werden. Folgender Trick hilft dabei weiter: Fügen Sie in die Kriterienspalte der betroffenen Felder die folgenden abgewandelten Ausdrücke ein. Ein Datensatz wird angezeigt, wenn das Kriterium wahr ist - und das ist entweder bei passendem Parameterwert oder bei der Übergabe des Wertes Null der Fall:

[cboMitarbeiter] Oder [cboMitarbeiter] Ist Null

[cboJahr] Oder [cboJahr] Ist Null

Interessant ist, was Access nach dem Schließen und erneuten Öffnen aus den Kriterien macht (siehe Abbildung 3.8).

Abbildung 3.8: Zwei harmlose Kriterienausdrücke nach der Überarbeitung durch Access

Nächster Abschnitt:

3.3.6 Abfragen mit Parameter oder zusammengesetzte SQL-Ausdrücke?

© 2006-2008 André Minhorst Alle Rechte vorbehalten.