Zur Hauptseite ... Zum Onlinearchiv ... Zum Abonnement ... Zum Newsletter ... Zu den Tools ... Zum Impressum ... Zum Login ...

Gedrucktes Heft

Diesen Beitrag finden Sie in Ausgabe 1/2002.

Unser Angebot für Sie!

Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'!

Diesen Beitrag twittern

Mitarbeiterverwaltung mit der MSDE (Teil 2)

Autor: André Minhorst und Michael Kessel, Duisburg

Eine Datenbank ist prädestiniert für die Pflege der Informationen über Ihre Mitarbeiter. Sie dient der Speicherung der Mitarbeiterdaten sowie der Daten über deren Beschäftigungsverhältnisse und weiterer Informationen - wie z. B. der Projekte, an denen sie beteiligt sind. In der Ausgabe 7/2001 haben Sie im ersten Teil des vorliegenden Beitrags erfahren, wie Sie mit Access Tabellen und deren Beziehungen auf der Basis der MSDE aufbauen können, und einige Beispiele für gespeicherte Prozeduren und Trigger kennen gelernt. Nun geht es an das Frontend - und damit an die Programmierung der Formulare und Berichte.

Hinweis

Der vorliegende Beitrag setzt das Vorhandensein von Access 2000 sowie die Installation der MSDE bzw. des SQL Servers voraus. Wie das funktioniert, erfahren Sie im Beitrag Die Microsoft Data Engine der Ausgabe 1/2000 von Access im Unternehmen. Sie finden den Beitrag im PDF-Format auf der Heft-CD. (

Formulare der
Mitarbeiterverwaltung

Die Mitarbeiterverwaltung benötigt fünf Formulare, von denen zwei allerdings Unterformulare eines weiteren Formulars sind.

Das erste Formular namens frmMitarbeiterAuswahl (s. Abb. 1) dient zur Auswahl des anzuzeigenden Mitarbeiters aus einem Listenfeld. Dabei gibt es noch einige Optionen, mit denen die Auswahl der angezeigten Mitarbeiter eingeschränkt werden kann. Von diesem Formular aus kann man Detailinformationen zu dem ausgewählten Mitarbeiter aufrufen.

Die Detailinformationen werden in dem Formular frmMitarbeiterDetail angezeigt (s. Abb. 8). Das Formular ist gleichzeitig Hauptformular für zwei Unterformulare.

Das Unterformular sfmMitarbeiterBeschaeftigungen zeigt das aktuelle und ggf. vorherige Beschäftigungsverhältnis des jeweiligen Mitarbeiters an. Das Unterformular namens sfmMitarbeiterProjekte zeigt die aktuellen Projekte eines Mitarbeiters.

Hinweis

Regelmäßigen Lesern von Access im Unternehmen und des Praxishandbuchs Access sind die meisten der nachfolgend beschriebenen Techniken zur Erstellung von Formularen, Unterformularen und deren Steuerelementen bekannt. Daher wird verstärkt auf solche Techniken eingegangen, bei denen es Unterschiede zwischen herkömmlichen Access-Datenbanken und Access-Projekten gibt. (

Das Formular zur Auswahl der
Mitarbeiter

Das Formular zur Anzeige der Mitarbeiterdetails soll wie in Abb. 1 aussehen. Es beinhaltet vier Schaltflächen, ein Kontrollkästchen, zwei Textfelder und ein Listenfeld.

Legen Sie am besten zunächst ein neues Formular mit den entsprechenden Steuerelementen an und bezeichnen Sie die Steuerelemente wie in Tab. 1 angegeben. Speichern Sie es anschließend unter dem Namen frmMitarbeiterAuswahl.

Abb. 1: Das fertige Formular zur Verwaltung der Mitarbeiter

Steuerelementname

Steuerelement bezeichnung

cmdNeuerMitarbeiter

Neuer Mitarbeiter

cmdMitarbeiterLoeschen

Mitarbeiter löschen

cmdBeschaeftigungLoeschen

Beschäftigung löschen

cmdListeDrucken

Aktuelle Liste drucken

ctlAlle

?

txtEintrittVon

Eintritt von:

txtEintrittBis

Eintritt bis:

lstMitarbeiter

?

Tab. 1: Steuerelemente des Formulars frmMitarbeiterAuswahl

Die Steuerelemente zur Filterung der Datensatzherkunft des Listenfeldes

Um den Rahmen des vorliegenden Beitrags nicht zu sprengen, soll der Inhalt des Listenfeldes nur nach zwei Kriterien gefiltert werden. Das erste Argument liefert das Kontrollkästchen ctlAlle. Es soll festlegen, ob alle Beschäftigungsverhältnisse aller Mitarbeiter oder nur aktuelle Beschäftigungsverhältnisse angezeigt werden sollen.

Außerdem soll der Benutzer den Zeitraum des Starts des Beschäftigungsverhältnisses eingeben können. Dazu dienen die beiden Textfelder txtEintrittVon und txtEintrittBis.

Die Schaltflächen zum Auslösen weiterer Aktionen

Das Formular enthält vier Schaltflächen. Die Schaltflächen dienen zum Anlegen eines neuen Mitarbeiters, zum Löschen eines Mitarbeiters oder eines Beschäftigungsverhältnisses sowie zum Drucken einer Liste mit den aktuell ausgewählten Mitarbeitern bzw. Beschäftigungsverhältnissen.

Die Beschreibung der Funktionalität der Schaltflächen folgt im Anschluss an die Beschreibung des Listenfeldes.

Das Listenfeld lstMitarbeiter

Kernstück des Formulars ist das Listenfeld. Es dient primär zur Anzeige der Mitarbeiter. Außerdem kann der Benutzer per Doppelklick auf einen Eintrag des Listenfeldes die Detailinformationen eines Mitarbeiters in einem weiteren Formular anzeigen.

Während es bei Access-Datenbanken leicht ist, den Inhalt eines Listenfeldes entsprechend bestimmter Auswahlkriterien zu filtern, ist dies bei Access-Projekten in Zusammenarbeit mit der MSDE oder dem SQL Server etwas komplizierter.

Sie können zwar einfach eine entsprechende SQL-Anweisung zusammensetzen und als Datensatzherkunft des Listenfeldes angeben. Dies geht allerdings zu Lasten der Performance, da die Abfrage jedes Mal neu kompiliert und an den SQL Server geschickt werden muss.

Um die Performance bei der Abfrage der gewünschten Daten zu erhöhen, sollten Sie die Abfrage möglichst auf dem SQL Server ausführen. Für einfache Abfragen verwenden Sie einfach eine Sicht. Diese hilft aber nicht mehr weiter, wenn die Abfrage die Verwendung von Parametern erfordert. Daher verwenden Sie eine gespeicherte Prozedur.

Abb. 2: Die gespeicherte Prozedur procLstMitarbeiter

Abb. 3: Ergebnis einer gespeicherten Prozedur

Datensatzherkunft des Listenfeldes

An das Listenfeld sollen drei Parameter übergeben werden: Der Wert des Kontrollkästchens ctlAlle sowie die Inhalte der beiden Textfelder txtEintrittVon und txtEintrittBis.

Eine gespeicherte Prozedur (s. Abb. 2) soll die übergebenen Parameter auswerten und das Ergebnis als Datensatzherkunft des Listenfeldes zurückgeben.

Die gespeicherte Prozedur verwendet drei Parameter. Der Parameter @Alle hat den Datentyp Integer. Der Hintergrund ist die unterschiedliche Anwendung von Ja/Nein-Werten in Access-Datenbanken und im SQL Server. Während es in Access-Datenbanken die Werte 0 (Falsch), -1 (Wahr) und NULL gibt, verwendet der Datentyp BIT des SQL Servers lediglich die Werte 1 (Wahr) und 0 (Falsch).

Die gespeicherte Prozedur besteht aus einer IF-Abfrage, die den Inhalt der Variablen @Alle überprüft. Falls vom Formular der Wert 0 übergeben wird, sollen nur diejenigen Beschäftigungsverhältnisse zurückgegeben werden, deren Austrittsdatum den Wert NULL hat.

Die beiden Parameter @EintrittVon und @EintrittBis dienen der Einschränkung der Datensätze nach dem Eintrittsdatum.

Sie enthalten jeweils einen Standardwert. Die Standardwerte kommen zum Einsatz, falls die entsprechenden Textfelder keinen Inhalt haben und damit keine Parameter übergeben werden.

Testen der Datensatzherkunft

Nachdem Sie die gespeicherte Prozedur eingegeben haben, können Sie direkt mit einem Test beginnen (vorausgesetzt, Sie haben bereits einige Daten für die beiden Tabellen tblMitarbeiter und tblBeschaeftigungen eingegeben): Starten Sie einfach einmal die Prozedur per Doppelklick auf ihren Namen im Datenbankfenster.

Daraufhin erscheinen nacheinander drei Eingabefenster, die zur Abfrage der drei Parameter dienen. Nach der Eingabe der Parameter erscheint das Ergebnis der Abfrage (s. Abb. 3).

Sub ListeAktualisieren()

    Dim Parameter As String

    Parameter = "@Alle = " & Me.ctlAlle

    Parameter = Parameter & IIf(IsNull(Me.txtEintrittVon), "", ", @EintrittVon = '" _
        & Me.txtEintrittVon & "'")

    Parameter = Parameter & IIf(IsNull(Me.txtEintrittBis), "", ", @EintrittBis = '" _
        & Me.txtEintrittBis & "'")

    Me.lstMitarbeiter.RowSource = "EXEC procLstMitarbeiter " & Parameter

    Me.lstMitarbeiter.Requery

End Sub

Quellcode 1

Funktionalität der Steuerelemente

In den nächsten Abschnitten erfahren Sie, wie Sie das Listenfeld mit den Ergebnissen der gespeicherten Prozedur füllen und wie Sie der gespeicherten Prozedur die erforderlichen Parameter übergeben.

Die Prozedur ListeAktualisieren

Die Prozedur aus Quellcode 1 dient der Aktualisierung des Listenfeldes. Sie setzt einen String zusammen, der den Namen der gespeicherten Prozedur procLstMitarbeiter sowie die entsprechenden Parameter enthält.

Die Parameter enthalten die Werte der Steuerelemente ctlAlle, txtEintrittVon und txtEintrittBis. Die Parameter @EintrittVon und @EintrittBis fallen weg, wenn die entsprechenden Textfelder leer sind. In dem Fall verwendet die gespeicherte Prozedur die im Deklarationsteil angegebenen Standardwerte (s. Abb. 2).

Die Prozedur legen Sie im Modul des Formulars frmMitarbeiterAuswahl an. Um das Modul zu öffnen, aktivieren Sie die Entwurfsansicht des Formulars und verwenden den Menübefehl Ansicht/Code. Daraufhin öffnet sich das entsprechende Modul.

Anschließend müssen Sie dafür sorgen, dass diese Prozedur auch ausgelöst wird. Das soll beim Öffnen des Formulars sowie nach der Aktualisierung der drei Steuerelemente ctlAlle, txtEintrittVon und txtEintrittBis passieren.

Dazu legen Sie jeweils eine neue Prozedur für das Ereignis Beim Öffnen des Formulars sowie für das Ereignis Nach Aktualisierung der drei anderen Steuerelemente an und geben als einzigen Befehl den folgenden Ausdruck an:

ListeAktualisieren

Weitere Informationen zum Anlegen einer Ereignisprozedur finden Sie im Beitrag Anlegen von Ereignisprozeduren im vorliegenden Heft. (

Geben Sie außerdem für die Eigenschaft Standardwert des Kontrollkästchens den Wert 0 an.

Anschließend können Sie direkt die neuen Funktionen ausprobieren, indem Sie das Formular speichern und anschließend in der Formularansicht öffnen. Das Ergebnis sieht nun wie in Abb. 4 aus. Leider entspricht dies aber nicht dem gewünschten Ergebnis.

Sie können jedoch mit drei kleinen Änderungen am Listenfeld nachhelfen:

  • Geben Sie für die Eigenschaft Spaltenanzahl den Wert 8 ein.
  • Stellen Sie in der Eigenschaft Spaltenbreiten die gewünschte Breite der Spalten ein, z. B. auf den Wert 1cm; 2cm; 2cm; 2cm; 2cm; 2cm; 2cm; 0cm.
  • Setzen Sie die Eigenschaft Spaltenüberschriften auf den Wert Ja.
  • Ein erneuter Wechsel in die Formularansicht lässt das Ergebnis direkt freundlicher aussehen (s. Abb. 5).

    Funktionalität der Schaltflächen

    Abb. 4: Das Listenfeld zeigt nicht die erwarteten Daten an.

    Abb. 5: Das Listenfeld mit funktionierender Anzeige

    Nun widmen Sie sich der Funktionalität der Schaltflächen. Dazu legen Sie für jede Schaltfläche eine eigene Ereignisprozedur an, die in den folgenden Abschnitten beschrieben wird.

    Private Sub cmdNeuerMitarbeiter_Click()

        DoCmd.OpenForm "frmMitarbeiterDetail", , , , acFormAdd, acDialog

        Me.lstMitarbeiter.Requery

    End Sub

    Quellcode 2

    Neuer Mitarbeiter

    Die Schaltfläche cmdNeuerMitarbeiter soll das Formular frmMitarbeiterDetail öffnen, das weiter unten beschrieben wird. In Quellcode 2 finden Sie die dazu notwendige Ereignisprozedur.

    Sie verwenden in der Prozedur die Konstante acFormAdd für den Parameter DataMode, damit das aufgerufene Formular nur zur Eingabe verwendet werden kann.

    Der Wert acDialog für den Parameter WindowMode bewirkt, dass die Ausführung aller anderen Aktivitäten unterbrochen wird, bis der Anwender das aufgerufene Formular wieder schließt.

    Um die Schaltfläche zu testen, können Sie auf die Schnelle ein leeres Formular namens frmMitarbeiterDetail erstellen.

    Durch Betätigen der Schaltfläche können Sie das neue Formular öffnen. Nach dem Schließen des Formulars kehren Sie automatisch wieder zum aufrufenden Formular zurück.

    Mitarbeiter löschen

    Die Schaltfläche cmdMitarbeiterLoeschen soll das Löschen des aktuell im Listenfeld markierten Mitarbeiters bewirken. Dazu legen Sie für die Ereigniseigenschaft Beim Klicken die Prozedur aus Quellcode 3 an.

    Private Sub cmdMitarbeiterLoeschen_Click()

        If MsgBox("Mitarbeiter und verknüpfte Beschäftigungen löschen?", _

            vbExclamation + vbOKCancel, "Mitarbeiter löschen") = vbOK Then

            Dim con As ADODB.Connection

            Set con = CurrentProject.Connection

            con.Execute "procMitarbeiterLoeschen " & Me.lstMitarbeiter

            Set con = Nothing

            Me.lstMitarbeiter.Requery

        Else

            Exit Sub

        End If

    End Sub

    Quellcode 3

    Die Prozedur fragt zunächst ab, ob der ausgewählte Datensatz auch tatsächlich gelöscht werden soll. Falls ja, führt die Abfrage eine gespeicherte Prozedur zum Löschen des Datensatzes durch. Der Text der gespeicherten Prozedur zum Löschen des gewünschten Datensatzes ist in Quellcode 4 enthalten.

    Alter Procedure procMitarbeiterLoeschen (@Mitarbeiternummer INT)

    As

        set nocount on

        DELETE FROM dbo.tblMitarbeiter

        WHERE MitarbeiterID = 
            @Mitarbeiternummer

        return

    Quellcode 4

    Die VBA-Prozedur übergibt dabei die Datensatznummer des entsprechenden Mitarbeiters an die gespeicherte Prozedur.

    Möglicherweise fragen Sie sich, was mit den Einträgen der Tabelle tblBeschaeftigungen passiert, die mit dem gelöschten Mitarbeiter verknüpft sind. Diese können ja eigentlich ebenfalls entfernt werden, da keine passenden Mitarbeiterdaten mehr vorhanden sind.

    Im ersten Teil des vorliegenden Beitrags in Ausgabe 7/2001 haben Sie bereits einen Trigger erstellt, der dieses Problem löst. Dieser Trigger löscht alle Datensätze der Tabelle tblBeschaeftigungen, die zum gelöschten Mitarbeiter gehören.

    Beschäftigung löschen

    Möglicherweise möchten Sie einmal nicht die kompletten Mitarbeiterdaten, sondern nur die Daten zu einem Beschäftigungsverhältnis löschen. In dem Fall verwenden Sie die Schaltfläche mit der Beschriftung Beschäftigung löschen.

    Die Vorgehensweise ist prinzipiell mit der beim Löschen eines Mitarbeiters vergleichbar. Allerdings kann es vorkommen, dass Sie auf diese Weise alle Beschäftigungsverhältnisse eines Mitarbeiters löschen und dieser dann nicht mehr im Listenfeld angezeigt wird.

    Daher soll die Anwendung - falls nur ein Beschäftigungsverhältnis für den Mitarbeiter vorhanden ist - den Benutzer fragen, ob der Mitarbeiter direkt mitgelöscht werden soll.

    Der Nebeneffekt dieser Mehrarbeit ist, dass Sie direkt lernen, eine gespeicherte Prozedur mit Rückgabeparameter zu erstellen.

    Der Ablauf beim Löschen der Beschäftigung sieht folgendermaßen aus: Zunächst wählt der Benutzer das zu löschende Beschäftigungsverhältnis aus und betätigt die entsprechende Schaltfläche.

    Die dadurch ausgelöste Prozedur überprüft, ob es noch weitere Beschäftigungsverhältnisse zu dem entsprechenden Mitarbeiter gibt. Falls ja, fragt sie den Benutzer, ob direkt der komplette Mitarbeiterdatensatz gelöscht werden soll.

    Gespeicherte Prozedur mit Rückgabeparameter

    Alter Procedure procBeschaeftigungenZaehlen (@BeschaeftigungID INT, 

    @AnzahlBeschaeftigungen INT OUTPUT)

    As

    DECLARE @MitarbeiterID INT

    SELECT @MitarbeiterID = MitarbeiterID 

    FROM tblBeschaeftigungen 

    WHERE BeschaeftigungID = @BeschaeftigungID

    SELECT * 

    FROM tblBeschaeftigungen 

    WHERE MitarbeiterID = @MitarbeiterID

    SELECT @AnzahlBeschaeftigungen = @@ROWCOUNT

    return 

    Quellcode 5

    Public Function AnzahlBeschaeftigungen _
        (BeschaeftigungID As Integer)

        Dim cnn As ADODB.Connection

        Dim cmd As ADODB.Command

        Dim prm As ADODB.Parameter

        Set cnn = CurrentProject.Connection

        Set cmd = New ADODB.Command

        cmd.CommandText = "procBeschaeftigungenZaehlen"

        cmd.CommandType = adCmdStoredProc

        cmd.ActiveConnection = cnn

        Set prm = cmd.CreateParameter("@BeschaeftigungID", _
            adInteger, adParamInput)

        prm.Value = BeschaeftigungID

        cmd.Parameters.Append prm

        Set prm = cmd.CreateParameter _
            ("@AnzahlBeschaeftigungen", adInteger, _
            adParamOutput)

        cmd.Parameters.Append prm

        cmd.Execute

        AnzahlBeschaeftigungen = _
            cmd.Parameters("@AnzahlBeschaeftigungen")

    End Function

    Quellcode 6

    Sie benötigen eine gespeicherte Prozedur zur Ermittlung der Anzahl der Beschäftigungen des Mitarbeiters (s. Quellcode 5). Die Prozedur enthält die zwei Parameter @Beschaeftigung und @AnzahlBeschaeftigungen. Der zweite Parameter wird durch das angehängte Schlüsselwort OUTPUT als Rückgabeparameter deklariert.

    Nach der Deklaration des Hilfsparameters @MitarbeiterID wird diesem in einer Abfrage die MitarbeiterID des Mitarbeiters zugewiesen, zu dem das zu löschende Beschäftigungsverhältnis gehört.

    In einer zweiten Abfrage werden alle Datensätze der Tabelle tblBeschaeftigungen ermittelt, die zu diesem Mitarbeiter gehören. Hinter dem Ausdruck @@ROWCOUNT verbirgt sich eine der vielen eingebauten SQL-Funktionen. Diese ermittelt die Anzahl der Datensätze des aktuellen Abfrageergebnisses und weist sie dem Rückgabeparameter @AnzahlBeschaeftigungen zu.

    Aufruf einer gespeicherten Prozedur mit
    Rückgabeparametern

    Die Funktion zum Aufruf der gespeicherten Prozedur und zum Auslesen des Rückgabeparameters finden Sie in Quellcode 6.

    Um der gespeicherten Prozedur den Eingabeparameter zu übergeben und den Rückgabeparameter zu ermitteln, verwenden Sie ein Command-Objekt mit einer Parameters-Auflistung.

    Nach der Deklaration und dem Erstellen der Objekte werden zunächst die Eigenschaften des Command-Objektes wie die auszuführende Prozedur und ihre Art festgelegt. Anschließend erstellt man die zwei benötigten Parameter und fügt sie der Parameters-Auflistung des Command-Objektes zu. Nach der Ausführung des Command-Objektes kann der Rückgabeparameter leicht aus der Parameters-Auflistung ausgelesen werden.

    Private Sub cmdBeschaeftigungLoeschen_Click()

        If MsgBox("Löschen bestätigen mit OK.", vbExclamation + vbOKCancel, _
            "Beschäftigung löschen") = vbOK Then

            Dim con As ADODB.Connection

            Set con = CurrentProject.Connection

            If AnzahlBeschaeftigungen(Me.lstMitarbeiter.Column(7)) = 1 Then

                If MsgBox("Es gibt keine weiteren Beschäftigungsverhältnisse. " _
                & "Möchten Sie, dass auch die Mitarbeiterdaten gelöscht werden?", _
                vbExclamation + vbOKCancel, "Mitarbeiter löschen") = vbOK Then

                    con.Execute "procMitarbeiterLoeschen " & Me.lstMitarbeiter

                    Set con = Nothing

                    Me.lstMitarbeiter.Requery

                Else

                    con.Execute "procBeschaeftigungLoeschen " & _
                        Me.lstMitarbeiter.Column(7)

                    Set con = Nothing

                    Me.lstMitarbeiter.Requery

                End If

            Else

                con.Execute "procBeschaeftigungLoeschen " & Me.lstMitarbeiter.Column(7)

                Set con = Nothing

                Me.lstMitarbeiter.Requery

            End If

        Else

            Exit Sub

        End If

    End Sub

    Quellcode 7

    Private Sub cmdMitarbeiterliste_Click()

        DoCmd.OpenReport "repMitarbeiterliste", acViewPreview

    End Sub

    Quellcode 8

    Schließlich fehlt noch die Ereignisprozedur für die Schaltfläche cmbBeschaeftigungLoeschen (s. Quellcode 7). Die Prozedur fragt zunächst, ob die Beschäftigung auch wirklich gelöscht werden soll. Falls ja, überprüft sie die Anzahl der vorhandenen Beschäftigungen für den aktuellen Mitarbeiter. Falls es nur eine Beschäftigung gibt, fragt die Prozedur zusätzlich, ob der komplette Mitarbeiterdatensatz gelöscht werden soll, und führt die gewünschte Aktion durch.

    Mitarbeiterliste drucken

    Das Drucken der Mitarbeiterliste soll durch Betätigung der Schaltfläche cmdListeDrucken ausgelöst werden. Dazu ist die Ereignisprozedur aus Quellcode 8 erforderlich.

    Private Sub lstMitarbeiter_DblClick(Cancel As Integer)

        DoCmd.OpenForm "frmMitarbeiterDetail", acNormal, , "[MitarbeiterID] = " _
            & Me.lstMitarbeiter, acFormEdit

        Me.lstMitarbeiter.Requery

    End Sub

    Quellcode 9

    Hinweis

    Die Erstellung eines entsprechenden Berichts erfolgt erst in einer der folgenden Ausgaben von Access im Unternehmen. Sie sollten die Schaltfläche trotzdem schon erstellen, um zu gegebener Zeit den entsprechenden Bericht anzeigen zu können. (

    Anzeigen der Mitarbeiterdetails

    Eine der wichtigsten Funktionen ist die Anzeige der Details des ausgewählten Mitarbeiters. Die Anzeige soll durch einen Doppelklick auf den gewünschten Mitarbeiter im Listenfeld erfolgen. Dazu hinterlegen Sie die Prozedur aus Quellcode 9 für die Ereigniseigenschaft Beim Doppelklicken des Listenfeldes. Die Anzeige erfolgt in einem weiteren Formular namens frmMitarbeiterDetail. Damit das Formular den richtigen Datensatz anzeigt, übergeben Sie als Filterkriterium die Mitarbeiternummer des im Listenfeld ausgewählten Mitarbeiters.

    Alternative zum Listenfeld:
    Mitarbeiter per Unterformular

    Bei fast allen Dingen, die Sie mit Access erledigen können, gibt es unterschiedliche Vorgehensweisen. Für die Anzeige und Auswahl der Mitarbeiter haben Sie in den vorhergehenden Abschnitten mit dem Listenfeld sicher eine recht komplizierte Methode kennen gelernt. Die Aktualisierung des Inhalts eines Listenfeldes ist auch keinesfalls trivial - zumindest nicht in einem Access-Projekt und mit einer gespeicherten Prozedur als Datensatzherkunft.

    Technisch ist es einfacher, wenn Sie statt eines Listenfeldes ein Unterformular verwenden würden. Allerdings verzichten Sie damit auf einige Vorteile des Listenfeldes:

    Es verleitet den Benutzer z. B. nicht dazu, direkt an Ort und Stelle Daten verändern zu wollen, anstatt den Datensatz im Detailformular anzuzeigen. Das ist nämlich in Access-Projekten nicht so einfach möglich - zumindest, wenn die Datenherkunft aus mehr als einer Tabelle besteht. Außerdem ermöglicht es die einfache Anzeige der Datensätze im Detailformular per Doppelklick und es sieht in vielen Fällen übersichtlicher aus.

    Dennoch soll hier kurz die alternative Verwendung eines Unterformulars beschrieben werden. Dazu erstellen Sie zunächst unter dem Namen frmMitarbeiterAuswahl2 eine Kopie des Formulars frmMitarbeiterAuswahl. Löschen Sie anschließend das Listenfeld aus dem Formular.

    Erstellen Sie ein neues Unterformular namens sfmMitarbeiterAuswahl2. Legen Sie als Datenherkunft genau wie beim Listenfeld die gespeicherte Prozedur procLstMitarbeiter fest.

    Das Formular soll als Standardansicht den Wert Datenblatt erhalten. Ziehen Sie die Felder wie in Abb. 6 in den Detailbereich des Formulars.

    Abb. 6: Das Unterformular sfmMitarbeiterAuswahl2

    Der wichtigste Schritt steht allerdings noch bevor: Sie müssen festlegen, woher die gespeicherte Prozedur ihre Parameter bezieht. Im Falle des Listenfeldes haben Sie die gespeicherte Prozedur direkt mit angehängten Parametern aufgerufen.

    @Alle =forms!frmMitarbeiterAuswahl2!ctlAlle,

    @EintrittVon = IIf(IsNull(Forms!frmMitarbeiterAuswahl2!txtEinstellungVon);
    '1.1.1950';Forms!frmMitarbeiterAuswahl2!txtEinstellungVon),

    @EintrittBis = IIf(Isnull(Forms!frmMitarbeiterAuswahl2!txtEinstellungBis);
    '1.1.2050';Forms!frmMitarbeiterAuswahl2!txtEinstellungBis)

    Quellcode 10

    Wenn Sie eine gespeicherte Prozedur als Datenherkunft eines Formulars oder Berichtes verwenden, geht dies noch einfacher: Benutzen Sie einfach die Eigenschaft Eingabeparameter des Formulars. Hier können Sie den Parametern die entsprechenden Steuerelemente des Hauptformulars zuweisen, aus denen die benötigten Werte zu entnehmen sind. Im vorliegenden Fall sieht das beispielsweise wie in Quellcode 10 aus.

    Wie Sie sehen, erfolgt an einigen Stellen eine Abfrage, ob die Steuerelemente den Wert NULL haben. Ist das der Fall, wird statt des Steuerelementinhalts ein alternatives Datum übergeben, z. B. 01.01.1950 als @EintrittVon.

    Abb. 7: Die Mitarbeiterauswahl per Unterformular

    Damit übergehen Sie die in der gespeicherten Prozedur angegebenen Standardwerte. Diese werden nämlich nur verwendet, wenn die entsprechenden Parameter nicht im Aufruf der gespeicherten Prozedur enthalten sind.

    Wenn Sie nun das Unterformular in das Hauptformular ziehen und noch einige Schönheitsoperationen vornehmen, erhalten Sie ein Formular wie in Abb. 7.

    Um das Unterformular statt des Listenfeldes zu verwenden, müssten Sie nun noch einige Prozeduren anpassen. Da dies den Rahmen sprengen würde und die Verwendung des Listenfeldes ohnehin sinnvoller ist, soll hier auf die Beschreibung der notwendigen Schritte verzichtet werden.

    Das Formular zur Anzeige der Mitarbeiterdetails

    Das Formular zur Anzeige der Mitarbeiterdetails hat zwei Aufgaben: Die Eingabe neuer Mitarbeiter sowie das Anzeigen und Bearbeiten bestehender Mitarbeiter.

    Es besteht aus einigen Text- und Kombinationsfeldern zur Charakterisierung des Mitarbeiters sowie aus einem Registersteuerelement, in dem sich zwei Registerseiten zur Aufnahme zweier Unterformulare befinden.

    Das Unterformular sfmMitarbeiterBeschaeftigungen zeigt alle vorhergehenden und aktuellen Beschäftigungen des ausgewählten Mitarbeiters an. Hier kann der Benutzer bestehende Daten einsehen und bearbeiten sowie die Daten zu neuen Beschäftigungsverhältnissen eingeben. Es handelt sich hierbei um die Realisierung einer 1:n-Beziehung zwischen den Tabellen tblMitarbeiter und tblBeschaeftigungen.

    Abb. 8: Das Formular zur Detailansicht von Mitarbeitern

    Das Unterformular sfmMitarbeiterProjekte dient der Anzeige aller Projekte eines Mitarbeiters.

    Im Gegensatz zur Beziehung zwischen Mitarbeitern und Beschäftigungen können Sie hier nicht nur jedem Mitarbeiter n verschiedene Projekte zuweisen. Jedes dieser n Projekte können Sie auch jedem der m vorhandenen Mitarbeiter zuordnen. Daher ist hier die Verwendung einer m:n-Beziehung erforderlich.

    Das Hauptformular
    frmMitarbeiterDetail

    Das Aussehen des Hauptformulars können Sie Abb. 8 entnehmen. Die Tabelle tblMitarbeiter dient als Datenherkunft. Normalerweise sollten Sie hier auch eine gespeicherte Prozedur zur Übertragung des ausgewählten Datensatzes verwenden, anstatt die komplette Tabelle vom Server zu übertragen. Im vorliegenden Fall soll die Performance aber ausnahmsweise einmal vernachlässigt werden.

    In Access-Tabellen können Sie Nachschlagefelder für die Auswahl von Daten verknüpfter Tabellen verwenden. Wenn Sie ein solches Feld in einem Formular benutzen, erstellt Access automatisch ein Kombinationsfeld. In Access-Projekten im Zusammenspiel mit dem SQL Server gibt es keine Nachschlagefelder.

    Daher müssen Sie selbst Hand anlegen, um beispielsweise aus dem Feld Geschlecht ein Kombinationsfeld zur Auswahl des gewünschten Eintrags aus der Tabelle tblGeschlecht zu ermöglichen. Gehen Sie dazu folgendermaßen vor:

  • Klicken Sie mit der rechten Maustaste auf das Textfeld, um das Kontextmenü zu öffnen.
  • Wählen Sie aus dem Kontextmenü den Eintrag Ändern zu ( Kombinationsfeld aus.
  • Wählen Sie als Datenherkunft des Kombinationsfeldes die Tabelle tblGeschlecht aus.
  • Stellen Sie die Eigenschaften Spaltenanzahl auf den Wert 2 und die Eigenschaft Spaltenbreite auf den Wert 0cm ein.
  • Fertig! Wiederholen Sie den Vorgang für die anderen verknüpften Felder Titel, Briefanrede und Textanrede und verwenden Sie die entsprechenden Tabellen als Datenherkunft.

    Private Sub cmdZurueckZurAuswahl_Click()

        If Nz(Me.Nachname, "") = "" Or Nz(Me.Vorname, "") = "" Then

            MsgBox "Sie müssen zumindest den Vor- und den Nachnamen angeben.", _
                vbExclamation + vbOKOnly, "Fehlende Daten"

            Exit Sub

        End If

        DoCmd.RunCommand acCmdSaveRecord

        Dim cnn As ADODB.Connection

        Dim rstBeschaeftigungen As New ADODB.Recordset

        Set cnn = CurrentProject.Connection

        rstBeschaeftigungen.Open "tblBeschaeftigungen", cnn, adOpenDynamic, _
            adLockOptimistic

        rstBeschaeftigungen.Filter = "[MitarbeiterID] = " & Me.MitarbeiterID

        If rstBeschaeftigungen.RecordCount = 0 Then

            MsgBox "Bitte geben Sie die Daten für die aktuelle Beschäftigung an."

            Exit Sub

        End If

        DoCmd.Close acForm, Me.Name

    End Sub

    Quellcode 11

    Das Registersteuerelement

    Legen Sie im unteren Bereich des Formulars ein Registersteuerelement mit zwei Seiten an. Geben Sie den beiden Seiten die Namen Angaben zum Beschäftigungsverhältnis und Projekte des Mitarbeiters.

    Hinweis

    Weitere Informationen zu Registersteuerelementen finden Sie in [Access im Unternehmen, Ausgabe 3/2001]. (

    In den Abschnitten 3.2 und 3.3 erfahren Sie, wie die einzufügenden Unterformulare sowie die weiteren Steuerelemente aussehen.

    Schaltfläche zum Übernehmen der Änderungen

    Im oberen Bereich des Formulars legen Sie zwei Schaltflächen an: eine zum Übernehmen der Änderungen und eine zum Abbrechen.

    Die erste erhält die Beschriftung Zurück zur Auswahl und den Namen cmdZurueckZurAuswahl, die zweite die Beschriftung Abbrechen und den Namen cmdAbbrechen.

    Legen Sie für die Schaltfläche cmdZurueckZurAuswahl die Prozedur aus Quellcode 11 an.

    Die Prozedur überprüft zunächst, ob zumindest der Vor- und der Nachname des Mitarbeiters angegeben sind. Weitere Pflichtfelder können Sie nach Belieben vorsehen.

    Anschließend speichert sie den Datensatz und überprüft, ob ein Beschäftigungsverhältnis für den Mitarbeiter vorhanden ist bzw. angelegt wurde. Falls dies nicht der Fall ist, muss der Benutzer zunächst ein neues Beschäftigungsverhältnis anlegen.

    Schaltfläche zum Abbrechen der Eingabe

    Eine weitere Schaltfläche dient dem Abbrechen eines Eingabevorgangs. Bezeichnen Sie die Schaltfläche mit Abbrechen und geben Sie ihr den Namen cmdAbbrechen. Legen Sie für die Ereigniseigenschaft Beim Klicken die Prozedur aus Quellcode 12 an.

    Private Sub cmdAbbrechen_Click()

        If IsNull(Me.MitarbeiterID) Then

            Me.Undo

        End If

        DoCmd.Close acForm, Me.Name

    End Sub

    Quellcode 12

    Die Prozedur überprüft, ob das Feld MitarbeiterID noch den Wert NULL hat. Das würde bedeuten, dass der Datensatz noch nicht gespeichert wurde. Per Me.Undo werden anschließend alle Eingaben rückgängig gemacht und mit der DoCmd.Close-Anweisung das Formular geschlossen.

    Der Datensatz wird prinzipiell erst gespeichert, wenn eines der Unterformulare aktiviert wird oder wenn der Anwender den Datensatz auf eine andere Art speichert. Weiter unten finden Sie eine Möglichkeit, die Abbrechen-Schaltfläche zu deaktivieren, wenn ein Unterformular aktiviert und damit der Datensatz des Hauptformulars gespeichert wird.

    Abb. 9: Das Unterformular sfmMitarbeiterBeschaeftigungen

    Wenn der Eingabevorgang dann rückgängig gemacht werden soll, muss der Anwender die entsprechenden Daten im Formular frmMitarbeiterAuswahl löschen.

    Wenn Sie umfangreiche Eingaben, die sich über Formulare und Unterformulare erstrecken, rückgängig machen möchten, sollten Sie die Daten der Formulare in temporären Tabellen speichern und erst nach dem Schließen des Hauptformulars in die eigentlichen Tabellen schreiben. (

    Das Unterformular sfmMitarbeiterBeschaeftigungen

    Weisen Sie der Datenherkunft eines neuen Unterformular namens sfmMitarbeiterBeschaeftigungen die Tabelle tblBeschaeftigungen zu.

    Ziehen Sie die Felder wie in Abb. 9 in den Detailbereich des Formulars. Stellen Sie dann die Eigenschaft Standardansicht auf den Wert Datenblatt ein.

    Fügen Sie das Formular anschließend als Unterformular in die erste Registerseite des Registers ein.

    Hinweis

    Weitere Informationen hierzu finden Sie im Beitrag Einbinden von Unterformularen in Hauptformulare im vorliegenden Heft. (

    Damit direkt nach dem Neuanlegen eines Beschäftigungsverhältnisses auch automatisch das durch den Insert-Trigger angelegte Austrittsdatum eines eventuell bestehenden und nicht abgeschlossenen Beschäftigungsverhältnisses angezeigt wird, legen Sie noch eine Ereignisprozedur für die Eigenschaft Nach Aktualisierung des Unterformulars an:

    Private Sub Form_AfterUpdate()

        Me.Requery

    End Sub

    Private Sub sfmMitarbeiterBeschaeftigungen_Enter()

        Me.cmdAbbrechen.Enabled = False

    End Sub

    Quellcode 13

    SELECT tblMitarbeiterProjekte.MitarbeiterID, 

        tblMitarbeiterProjekte.ProjektID, 

        tblProjekte.Projektbezeichnung, 

        tblProjekte.ProjektStart, 

        tblProjekte.ProjektEnde

    FROM tblProjekte INNER JOIN

        tblMitarbeiterProjekte ON 

        tblProjekte.ProjektID = 

        tblMitarbeiterProjekte.ProjektID

    Quellcode 14

    Abb. 10: Das Unterformular sfmMitarbeiterProjekteDetail

    Wenn der Benutzer das Unterformular aktiviert, speichert er automatisch den Datensatz des Hauptformulars ab.

    Ein Abbruch der Eingabe durch den Benutzer kann dann nicht mehr ohne Weiteres erfolgen. Legen Sie daher für die Ereigniseigenschaft Beim Hingehen des Unterformularsteuerelements (nicht des Unterformulars selbst!) die Prozedur aus Quellcode 13 an.

    Die Prozedur deaktiviert die Abbrechen-Schaltfläche des Hauptformulars. Legen Sie eine solche Prozedur auch für das Unterformular sfmMitarbeiterProjekteDetail an.

    Das Unterformular
    sfmMitarbeiterProjekteDetail

    Weisen Sie der Datenherkunft des Unterformulars zur Anzeige der Projekte eines Mitarbeiters die SQL-Abfrage aus Quellcode 14 zu.

    Ziehen Sie anschließend die Felder aus der Feldliste wie in Abb. 10 in den Detailbereich und stellen Sie auch hier die Eigenschaft Standardansicht auf den Wert Datenblatt ein.

    Speichern Sie das Formular und fügen Sie es der zweiten Seite des Registers im Hauptformular hinzu.

    Im Gegensatz zum ersten Unterformular wird diesmal keine automatische Verknüpfung zwischen Haupt- und Unterformular hergestellt. Tragen Sie also manuell den Wert MitarbeiterID für die Eigenschaften Verknüpfen Von und Verknüpfen Nach des Unterformularsteuerelements ein.

    Das Problem der eindeutigen
    Tabelle

    Unter Access bedeutet es kein Problem, die Datenherkunft aus mehreren Tabellen zu verwenden und auch noch deren Inhalte zu verändern.

    In Access-Projekten ist dies nicht mehr so einfach. Hier kann maximal der Inhalt einer Tabelle geändert werden.

    In den bisherigen Beispielen bestand die Datenherkunft jeweils aus nur einer Tabelle, aber im Unterformular sfmMitarbeiterProjekteDetail besteht die Datenherkunft aus zwei Tabellen.

    Private Sub cmdNeuesProjekt_Click()

        DoCmd.OpenForm "frmNeuesProjekt", , , , acFormAdd, acDialog

        Me.sfmMitarbeiterProjekteDetail.Requery

    End Sub

    Quellcode 15

    Um einem Mitarbeiter eines der bestehenden Projekte zuordnen zu können, müssen Sie die Eigenschaft Eindeutige Tabelle des Formulars auf den Namen der Tabelle einstellen, die Sie verändern möchten.

    In dem Fall handelt es sich um die Tabelle tblMitarbeiterProjekte, denn Sie möchten neue Datensätze hinzufügen, um dem ausgewählten Mitarbeiter neue Projekte zuordnen zu können. Sie können allerdings keine Details des Projektes ändern.

    Damit Sie über das Feld ProjektID komfortabel weitere Projekte für den Mitarbeiter auswählen können, wandeln Sie es in ein Kombinationsfeld mit der Tabelle tblProjekte als Datensatzherkunft um.

    Außerdem legen Sie für die Ereigniseigenschaft Nach Aktualisierung des neuen Kombinationsfeldes die folgende Prozedur an:

    Private Sub ProjektID_AfterUpdate()

        Me.Requery

    End Sub

    Die Prozedur dient lediglich der Aktualisierung der übrigen Felder des Unterformulars.

    Zum Anlegen komplett neuer Projekte benötigen Sie ein weiteres Formular, dessen Aufbau Sie bitte der Beispieldatenbank entnehmen.

    Um dieses Formular anzuzeigen, verwenden Sie eine weitere Schaltfläche, die Sie im Kopf der zweiten Seite des Registers oberhalb des Unterformulars sfmMitarbeiterProjekteDetail anlegen. Beschriften Sie die Schaltfläche mit Neues Projekt anlegen und geben Sie ihr den Namen cmdNeuesProjekt.

    Für die Ereigniseigenschaft Beim Klicken hinterlegen Sie die Prozedur aus Quellcode 15.

    Die Prozedur öffnet das Formular frmNeuesProjekt zum Anlegen neuer Projekte und aktualisiert nach dem Schließen dieses Formulars das Unterformular zur Auswahl der Projekte eines Mitarbeiters.

    Zusammenfassung und Ausblick

    Der vorliegende Beitrag kann auf keinen Fall einen kompletten Überblick über die Verwendung von Formularen in Access-Projekten bieten.

    Er soll vielmehr einige der Techniken vorstellen, die für die Gestaltung von Formularen in Datenbanken auf MSDE- oder SQL-Server-Basis verwendet werden.

    Nachdem Sie nun im ersten Teil einiges über das Erstellen von Tabellen, Sichten, gespeicherte Prozeduren und Datenbankdiagramme erfahren und im vorliegenden Beitrag Informationen zum Umgang mit Formularen in Access-Projekten erhalten haben, werden Sie in den folgenden Ausgaben Gelegenheit bekommen, die Mitarbeiterverwaltung weiter auszubauen.

    Der nächste Schritt wird in einem der folgenden Hefte die Erstellung von Berichten zur Ausgabe von Mitarbeiterlisten und von Datenblättern einzelner Mitarbeiter sein.

    In Ausgabe 7/2001 von Access im Unternehmen finden Sie eine Anleitung zur Installation der Beispieldateien des vorgestellten Access-Projekts.

    Sie können diese Anleitung auch für die aktuelle Version der Dateien verwenden.

    Kompletten Artikel lesen?

    Einfach für den Newsletter anmelden, dann lesen Sie schon in einer Minute den kompletten Artikel und erhalten die Beispieldatenbanken.

    E-Mail:

    Download

    Download

    Die .zip-Datei enthält folgende Dateien:

    Skript.sql

    Mitarbeiterverwaltung00.mdb

    Beispieldateien downloaden

    © 2003-2015 André Minhorst Alle Rechte vorbehalten.