Dynamische Standardwerte

Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

Dynamische Standardwerte

In vielen Fällen können Sie dem Benutzer bei der Nutzung Ihrer Anwendung durch die Vorgabe von Standardwerten Arbeit abnehmen. Oft kristallisiert sich aber erst später heraus, welche die gewünschten Standardwerte sind oder diese unterscheiden sich je nach Benutzer. Dann wäre es praktisch, wenn die Benutzer selbst die Standardwerte für das Anlegen neuer Datensätze vorgeben könnten. Vielleicht möchten Sie sogar, dass der nächste neue Datensatz die Werte des vorherigen Datensatzes als Standardwerte übernimmt? Wie dies gelingt, zeigt der vorliegende Beitrag.

Als Beispielformular nutzen wir ein einfaches Detailformular namens frmArtikel, welches die Daten der Tabelle tblArtikel der Beispieldatenbank anzeigt.

Angenommen, die Datenbank enthält überwiegend Artikel einer bestimmten Kategorie, beispielsweise der Kategorie Getränke mit dem Primärschlüsselwert 1, dann könnte es dem Benutzer einige Arbeit sparen, wenn dieser Wert beim Anlegen eines neuen Datensatzes bereits voreingestellt wird. Dies erledigen Sie über die Eigenschaft Standardwert des Kombinationsfeldes zur Anzeige der Kategorie im Entwurf des Formulars (s. Bild 1).

Formular mit der Standardwert-Eigenschaft im Entwurf

Bild 1: Formular mit der Standardwert-Eigenschaft im Entwurf

Wenn Sie dann in die Formularansicht wechseln und einen neuen Datensatz anzeigen, erscheint im Kombinationsfeld Kategorie bereits der voreingestellte Eintrag (s. Bild 2). Dies ändert sich allerdings auch nicht beim Anlegen weiterer Datensätze.

Kategorie Getränke als Standardwert

Bild 2: Kategorie Getränke als Standardwert

Vorarbeit: Steuerelementname ändern

Da wir die Felder direkt aus der Feldliste in das Formular gezogen haben, hat Access die Namen der Felder als Steuerelementnamen übernommen. Das kann in manchen Situationen zu Problemen führen, wenn Sie per VBA auf das Steuerelement zugreifen wollen – etwa, um die Eigenschaft DefaultValue einzustellen. Diese ist nämlich nur für Steuerelemente verfügbar, nicht aber für die Felder der Datenherkunft des Formulars, die aber – wenn Steuerelement und Feld den gleichen Namen tragen – auf die gleiche Weise referenziert werden. Um Missverständnissen vorzubeugen, sollten Sie also das Steuerelement mit einem Präfix versehen, also etwa txt für Textfelder oder cbo für Kombinationsfelder. Sie können ganz einfach testen, dass DefaultValue für Felder nicht zur Verfügung steht, indem Sie das Kombinationsfeld in cboKategorieID umbenennen und dann versuchen, dem Feld KategorieID die Eigenschaft DefaultValue zuzuweisen. Diese steht dort nicht zur Verfügung, wie Bild 3 zeigt.

DefaultValue steht nur für Steuerelemente zur Verfügung

Bild 3: DefaultValue steht nur für Steuerelemente zur Verfügung

Wert des vorherigen Datensatzes übernehmen

Eine Variante lautet nun, den Wert des zuvor eingegebenen Datensatzes als Standardwert für den folgenden Datensatz zu übernehmen. Dazu ist nicht viel Aufwand nötig: Wir fügen dem Klassenmodul des Formulars lediglich eine Ereignisprozedur hinzu, die durch das Ereignis Nach Aktualisierung des betroffenen Steuerelements ausgelöst wird. Diese Prozedur sieht wie folgt aus:

Private Sub cboKategorieID_AfterUpdate()
     Me!cboKategorieID.DefaultValue = Me!cboKategorieID
End Sub

Wenn Sie nun den Wert des Feldes KategorieID über das Kombinationsfeld ändern und dann einen neuen Datensatz anzeigen, erscheint der zuletzt gewählte Wert bereits als Standardwert dieses Feldes.

Wenn Sie diese Methode nutzen, benötigen Sie für andere Datentypen leicht abgewandelte Varianten der obigen Methode. Für Felder mit dem Datentyp Text etwa müssen Sie den Wert, den Sie der Eigenschaft DefaultValue zuweisen wollen, noch in Anführungszeichen einfassen. Für das Textfeld txtArtikelname sieht dies wie folgt aus:

Private Sub txtArtikelname_AfterUpdate()
     Me!txtArtikelname.DefaultValue = Chr(34) _
         & Me!txtArtikelname & Chr(34)
End Sub

Chr(34) entspricht dem Anführungszeichen ("). Sie können stattdessen auch zwei in zwei weitere Anführungszeichen eingefasste Anführungszeichen angeben:

Me!txtArtikelname.DefaultValue = """" _
     & Me!txtArtikelname & """"

Die Variante mit Chr(34) ist jedoch besser lesbar.

Für andere Felddatentypen wie Datum- oder Ja/Nein-Felder verwenden Sie auch die zuerst genannte Variante mit der direkten Zuweisung des aktuellen Wertes.

Damit findet der Benutzer nun schon einmal jeweils den zuletzt eingegebenen Wert für verschiedene Steuerelemente als Standardwert für neue Datensätze vor.

Nach dem Schließen und Öffnen

Die Lösung hat allerdings einen kleinen Nachteil: Wenn der Benutzer die Datenbank schließt und wieder öffnet, sind die zusammengestellten Standardwerte wieder weg (genau genommen geschieht dies bereits, wenn das Formular geschlossen wird). Das ist klar, denn wenn wir dynamisch per VBA Eigenschaften zuweisen, werden diese ja nicht gespeichert. Dies wäre nur der Fall, wenn Sie die Eigenschaft Standardwert in der Entwurfsansicht festlegen und das Formular dann speichern.

Was tun? Abhilfe schafft eine Tabelle, in welcher wir die Standardwerte für verschiedene Formulare und Steuerelemente speichern können. Die Tabelle heißt tblStandardwerte und sieht im Entwurf wie in Bild 4 aus. Damit die Tabelle nicht nur für ein, sondern gleich für mehrere Formulare Standardwerte speichern kann, legen wir zwei Felder namens Formularename und Steuerelementname an, welche die entsprechenden Daten zum betroffenen Steuerelement speichern. Das Feld Standardwert nimmt dann den zu speichernden Standardwert auf. Damit der Benutzer für keine Kombination aus Formularname und Steuerelementname zwei Standardwerte speichern kann, fügen wir gleich noch einen eindeutigen Index namens UniqueIndex für die beiden Felder Formularname und Steuerelementname hinzu.

Tabelle zum Speichern von Standardwerten

Bild 4: Tabelle zum Speichern von Standardwerten

Um unser Formular mit Funktionen zum Lesen und Schreiben der Standardwerte auszustatten, kopieren wir es zunächst und fügen es unter dem Namen frmArtikel_Standardwerttabelle wieder ein. Werfen Sie dann die bereits angelegten Ereignisprozeduren aus der neuen Version des Formulars heraus.

Standardwerte speichern

Das Speichern eines Wertes als Standardwert soll beim Speichern des jeweiligen Datensatzes erfolgen. Dazu bauen wir uns eine Prozedur, die den Namen des Formulars, den Namen des Steuerelements und den neuen Standardwert als Parameter entgegennimmt und nennen diese StandardwertSpeichern. Die Prozedur sieht wie in Listing 1 aus. Die Prozedur prüft zunächst, ob der Parameter varStandardwert überhaupt einen Wert enthält. Falls das Feld, für das der Standardwert gespeichert werden soll, nämlich den Wert Null hat, ist varStandardwert leer. Ist varStandardwert leer, geschieht Folgendes:

Public Sub StandardwertSpeichern(strFormularname As String, strSteuerelementname As String, varStandardwert As Variant)
     Dim db As DAO.Database
     Set db = CurrentDb
     On Error Resume Next
     If Not IsEmpty(varStandardwert) Then
         db.Execute "INSERT INTO tblStandardwerte(Formularname, Steuerelementname, Standardwert) VALUES('" _
             & strFormularname & "', '" & strSteuerelementname & "', '" & varStandardwert & "')", dbFailOnError
         If Err.Number = 3022 Then
             db.Execute "UPDATE tblStandardwerte SET Standardwert = '" & varStandardwert & "' WHERE Formularname = '" _
                 & strFormularname & "' AND Steuerelementname = '" & strSteuerelementname & "'", dbFailOnError
         End If
     Else
         db.Execute "INSERT INTO tblStandardwerte(Formularname, Steuerelementname, Standardwert) VALUES('" _
             & strFormularname & "', '" & strSteuerelementname & "', NULL)", dbFailOnError
         If Err.Number = 3022 Then
             db.Execute "UPDATE tblStandardwerte SET Standardwert = NULL WHERE Formularname = '" & strFormularname _
                 & "' AND Steuerelementname = '" & strSteuerelementname & "'", dbFailOnError
         End If
     End If
End Sub

Listing 1: Prozedur zum Speichern von Standardwerten

Die Prozedur versucht, einen neuen Datensatz in der Tabelle tblStandardwerte anzulegen. Dabei sollen die mit den drei Parametern strFormularname, strSteuerelementname und varStandardwert übergebenen Werte in die drei Felder Formularname, Steuerelementname und Standardwert der Tabelle tblStandardwerte eingetragen werden. Für den dritten Parameter haben wir den Datentyp Variant gewählt, damit hier auch der Wert Null verarbeitet werden kann.

Da es beim Speichern geschehen kann, dass die Prozedur versucht, einen Datensatz mit einer bereits vorhandenen Kombination aus Formularname und Steuerelementname zu speichern, haben wir zuvor die eingebaute Fehlerbehandlung deaktiviert.

So meldet Access keinen Fehler, wenn das Anlegen des Datensatzes aus dem genannten Grund fehlschlägt. Stattdessen prüft die Prozedur anschließend, ob der Fehler mit der Nummer 3022 aufgetreten ist, was diesem Fehler entspricht. In diesem Fall soll die Prozedur dann den Wert des Feldes Standardwert in dem bereits vorhandenen Datensatz überschreiben.

Sollte varStandardwert leer sein, dann legt die Prozedur auch einen Datensatz in der Tabelle tblStandardwerte an beziehungsweise ändert den Standardwert für einen eventuell vorhandenen Datensatz für diese Konstellation aus Formularname und Steuerelementname. Allerdings trägt die Prozedur dann den Wert NULL für das Feld Standardwert ein.

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Ich habe die Datenschutzbestimmungen zur Kenntnis genommen.