Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.
Für Felder in Tabellen kann man jeweils einen Standardwert im Tabellenentwurf festlegen, der beim Anlegen eines neuen Datensatzes in dieser Tabelle vorbelegt wird. Etwas anspruchsvoller ist es, wenn wir Standardwerte durch den Benutzer festlegen wollen. Noch einen Schritt weiter gehen wir, wenn der Standardwert für ein Fremdschlüsselfeld verwendet werden soll – also zur Auswahl eines Datensatzes aus einer verknüpften Tabelle. Einfache Beispiele sind Anreden, Zahlungsmethoden, Prioritäten oder Kategorien. Hier können wir jeweils einen Eintrag anwendungsweit festlegen. Es geht aber auch noch anspruchsvoller: Wenn wir beispielsweise Adressen für Kunden in einer eigenen Tabelle speichern, wo mehrere Adressen je Kunde angelegt werden können und nur eine als Standard verwendet werden soll. Spätestens hier müssen wir auch beim Datenmodell umdenken. In diesem Beitrag schauen wir uns erst einmal an, wie wir Standardwerte für Nachschlagefelder komfortabel auswählen können.
Einfache Standardwerte
In einem weiteren Beitrag namens Benutzerdefinierte Standardwerte (www.access-im-unternehmen.de/1466) haben wir bereits eine Lösung aufgezeigt, mit der wir für die Felder von Tabellen Standardwerte festlegen können. Normalerweise kann man Standardwerte direkt für die Eigenschaft Standardwert eines Feldes im Tabellenentwurf definieren. Diese werden beim Anlegen von gebundenen Feldern auf Basis dieser Tabelle in Formularen automatisch in die entsprechende Steuerelementeigenschaft übernommen. Allerdings möchten die Benutzer gegebenenfalls ihre eigenen Standardwerte definieren. Das lässt sich jedoch nicht mit der Eigenschaft Standardwert des Tabellenentwurfs realisieren, denn dann müsste man bei jeder Änderung den Entwurf der Tabelle anpassen. Also haben wir in obigem Beitrag eine Lösung gezeigt, wie wir diese Daten in einer eigenen Tabelle speichern und zur Laufzeit beim Verwenden gebundener Formulare abrufen und anwenden können.
Dabei haben wir Zahlen-, Ja/Nein- und Datumsfelder so behandelt, dass man den Wert in einem Popup-Formular eingibt, mit dem wir die als Standardwert eingegebenen Daten noch validieren konnten. Die Standardwerte von Textfeldern geben wir dort einfach so ein. Was noch fehlen würde, wäre eine komfortablere Eingabe von Standardwerten aus Nachschlagefeldern. Hier müsste man aktuell noch den Zahlenwert eingeben, welcher dem Primärschlüsselfeld des zu verknüpfenden Datensatzes entspricht (siehe Bild 1). Das ist recht unpraktisch, daher wollen wir im ersten Teil des vorliegenden Beitrags noch ein Popup-Formular für diesen Zweck hinzufügen und die Lösung zum Verwalten von Standardwerten entsprechend erweitern.
Bild 1: Standardwerte für Nachschlagefelder müssen noch von Hand eingegeben werden.
Standardwerte aus Fremdschlüsselfeldern
Das Endergebnis sieht wie in Bild 2 aus: Der Benutzer klickt auf einen Standardwert, der im Datenmodell als Nachschlagefeld definiert ist und kann im nun erscheinenden Popup die vorhandenen Einträge auswählen und als Standardwert festlegen.
Bild 2: Die Auswahl per Kombinationsfeld wäre wesentlich ergonomischer.
Anpassungen des Datenmodells
Um im Popup das Nachschlagefeld nachzubilden, das im Entwurf der Tabelle mit dem entsprechenden Feld enthaltenen ist, wollen wir ein paar Informationen zusätzlich zu diesem Feld in der Tabelle tblStandardwerte speichern. Diese nimmt bisher hauptsächlich den Namen der Tabelle und des Feldes auf, für das wir einen Standardwert speichern wollen. Hier kommen nun noch die wesentlichen Felder für die Anzeige eines Nachschlagefeldes hinzu, die wir direkt nach den entsprechenden Eigenschaften des Nachschlagefeldes benennen:
- RowSource: Tabelle, Abfrage oder SQL-Ausdruck mit der Datensatzherkunft des Nachschlagefeldes
- BoundColumn: Gebundene Spalte der Datensatzherkunft
- ColumnWidths: Spaltenbreiten, zum Beispiel 0;1440
- ColumnCount: Anzahl der anzuzeigenden Spalten, zum Beispiel 2
Diese Felder fügen wir dem Entwurf der Tabelle tblStandardwerte wie in Bild 3 hinzu.
Bild 3: Zusätzliche Informationen zum Anzeigen von Nachschlagefeldern
Anpassen des Einlesevorgangs
Die Daten zur Konfiguration der Nachschlagefelder wollen wir per Code in die Tabelle tblStandardwerte eintragen. Dazu passen wir die bisher verwendete Prozedur entsprechend an (siehe Listing 1). Wir fügen zunächst Variablen zum Speichern der betroffenen Informationen hinzu.
Public Sub FelderEinlesen(Optional bolStandardwerteUebernehmen As Boolean = False) Dim db As DAO.Database, tdf As DAO.TableDef, fld As DAO.Field, prp As DAO.Property, rst As DAO.Recordset Dim strRowSource As String, lngBoundColumn As Long, strColumnWidths As String, lngColumnCount As Long Dim i As Integer Set db = CurrentDb For Each tdf In db.TableDefs Select Case True Case tdf.Name Like "MSys*", tdf.Name Like "USys*", tdf.Name = "tblStandardwerte", tdf.Name = "tblDatentypen" Case Else For Each fld In tdf.Fields strRowSource = "" lngBoundColumn = 0 strColumnWidths = "" lngColumnCount = 0 Set prp = Nothing On Error Resume Next Set prp = fld.Properties("DisplayControl") On Error GoTo 0 If Not prp Is Nothing Then If prp.Value = acComboBox Then strRowSource = fld.Properties("RowSource") lngBoundColumn = fld.Properties("BoundColumn") strColumnWidths = fld.Properties("ColumnWidths") lngColumnCount = fld.Properties("ColumnCount") End If End If On Error Resume Next If bolStandardwerteUebernehmen Then db.Execute "INSERT INTO tblStandardwerte(Tabellenname, Feldname, Standardwert, DatentypID, " _ &"RowSource, BoundColumn, ColumnWidths, ColumnCount) VALUES(''" & tdf.Name & "'', ''" _ & fld.Name & "'', ''" & fld.DefaultValue & "'', " & fld.Type & ", ''" & strRowSource & "'', " _ & lngBoundColumn & ", ''" & strColumnWidths & "'', " & lngColumnCount & ")", dbFailOnError Else ... End If Select Case Err.Number Case 3022 On Error GoTo 0 If bolStandardwerteUebernehmen Then db.Execute "UPDATE tblStandardwerte SET Tabellenname = ''" & tdf.Name & "'', " _ & "Feldname = ''" & fld.Name & "'', Standardwert = ''" & fld.DefaultValue _ & "'', DatentypID = " & fld.Type & ", RowSource = ''" & strRowSource _ & "'', BoundColumn = " & lngBoundColumn & ", ColumnWidths = ''" & strColumnWidths _ & "'', ColumnCount = " & lngColumnCount & " WHERE Tabellenname = ''" & tdf.Name _ & "'' AND Feldname = ''" & fld.Name & "''", dbFailOnError Else ... End If Case 0 Case Else MsgBox "Fehler " & Err.Number & ":" & vbCrLf & vbCrLf & Err.Description End Select On Error GoTo 0 Next fld End Select Next tdf End Sub
Listing 1: Erweiterung der Prozedur zum Anlegen der Tabellen und Felder für die Standardwerte
Beim Durchlaufen der Tabellen und Felder setzen wir die Variablen strRowSource und strColumnWidths auf eine leere Zeichenkette und lngBoundColumn und lngColumnCount auf den Wert 0 ein, damit diese Werte in die Tabelle eingetragen werden, sollte es sich beim aktuellen Feld nicht um ein Nachschlagefeld handeln.
Danach wollen wir herausfinden, ob es sich beim aktuellen Feld um ein Nachschlagefeld handelt. Dazu versuchen wir experimentell bei ausgeschalteter Fehlerbehandlung auf die Eigenschaft DisplayControl zuzugreifen. Die Fehlerbehandlung schalten wir aus, weil diese Eigenschaft standardmäßig zum Beispiel nur für Ja/Nein-Felder und für Nachschlagefelder gesetzt wird. Ist prp danach nicht leer, ist die Eigenschaft vorhanden. Dann prüfen wir, ob es sich um ein Kombinationsfeld handelt, was wir durch den Vergleich mit der Konstanten acComboBox erreichen. Ist auch diese Bedingung erfüllt, können wir die vier benötigten Eigenschaften aus dem Field-Objekt über die entsprechenden Properties einlesen.
Die folgenden Abschnitte enthalten die SQL-Anweisungen, um die Daten in die Tabelle tblStandardwerte zu schreiben. Dazu ergänzen wir lediglich die entsprechenden Zuweisungen der Felder und Werte in den INSERT INTO und UPDATE-Anweisungen. Nach dem Ausführen der Prozedur, beispielsweise über die Schaltfläche Felder einlesen des Formulars frmStandardwerte, sieht der Inhalt der Tabelle wie in Bild 4 aus.
Bild 4: Daten für die Erfassung der Standardwerte
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
Testzugang
eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel
diesen und alle anderen Artikel mit dem Jahresabo