Standardwerte für Fremdschlüsselfelder pflegen

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.

Standardwerte für Nachschlagefelder müssen noch von Hand eingegeben werden.

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.

Die Auswahl per Kombinationsfeld wäre wesentlich ergonomischer.

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.

Zusätzliche Informationen zum Anzeigen von Nachschlagefeldern

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.

Daten für die Erfassung der Standardwerte

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

Schreibe einen Kommentar