Mehrere Werte eines Datensatzes als Tokens führen
Mit WklTokenBox zeigen und bearbeiten Sie in einem Formular die kurze Liste von Werten, die zu einem Datensatz gehören
(etwa die Rollen eines Benutzers oder die Schlagwörter eines Dokuments), als Tokens mit einer Schaltfläche zum
Entfernen; bei der Eingabe helfen Vorschläge. In einer Liste zeigen Sie dieselben Werte als schreibgeschützte Spalte von
WklGrid oder WklTreeList.
Voraussetzungen: WKL Forms Object Library 1.33 oder höher.
Lösungsüberblick
- Eine untergeordnete Tabelle enthält die Werte, eine Zeile je Token, wie bei einem Unterformular: zum Beispiel
tblBenutzerRollemit den FeldernBenutzerIDundRolle. Verwenden Sie sie statt eines mehrwertigen Felds: Mehrwertige Felder gibt es nur in Access-Tabellen, nicht in SQL Server und nicht über ODBC. - In einem Formular: Fügen Sie WKL Token Box (ein ActiveX-Steuerelement) ein. Legen Sie auf der Designerseite Daten die untergeordnete Tabelle (
RecordSource), ihr Wertfeld (ValueField) und die Verknüpfung mit dem Datensatz des Formulars (LinkChildFields,LinkMasterFields) fest, wie bei einem Unterformular-Steuerelement. - Dem Datensatz folgen: Setzen Sie Steuerelementinhalt (
ControlSource) des Steuerelements auf das Schlüsselfeld des Formulars. Access meldet dem Token-Feld dann jeden Datensatzwechsel, und das Token-Feld lädt die Tokens dieses Datensatzes. - Vorschläge und Regeln: Legen Sie auf der Seite Vorschläge und Regeln eine Werteliste (
SuggestionList) oder eine Tabelle, Abfrage oder SQL-Anweisung (SuggestionSource) fest, lassen Sie bei Bedarf nur vorgeschlagene Werte zu (AllowFreeText= aus) und hinterlegen Sie einen regulären Ausdruck mit seiner Meldung (Pattern,ValidationText). - Speichern: Sie müssen nichts tun. Jedes Token, das der Benutzer hinzufügt, fügt sofort seine untergeordnete Zeile ein, jedes entfernte Token löscht sofort seine Zeile; der Datensatz des Formulars bleibt unverändert.
- In einer Liste: Eine Spalte mit
Editor = wedTokensüber einem Feld, das die untergeordneten Werte zu einem Text verbindet (Separator, standardmäßig;), zeigt dieselben Chips schreibgeschützt.
Umsetzung
Die Tabellen des Beispiels, einmalig angelegt (führen Sie die Prozedur im Direktbereich aus):
Public Sub CreateTokenSample()
With CurrentDb
.Execute "CREATE TABLE tblBenutzer (ID LONG CONSTRAINT PK_Benutzer PRIMARY KEY, Name TEXT(50))"
.Execute "CREATE TABLE tblRolle (Rolle TEXT(30) CONSTRAINT PK_Rolle PRIMARY KEY)"
.Execute "CREATE TABLE tblBenutzerRolle (BenutzerID LONG NOT NULL, Rolle TEXT(30) NOT NULL, " & _
"CONSTRAINT PK_BenutzerRolle PRIMARY KEY (BenutzerID, Rolle))"
.Execute "INSERT INTO tblBenutzer VALUES (1, 'Meier')"
.Execute "INSERT INTO tblRolle VALUES ('Leser')"
.Execute "INSERT INTO tblRolle VALUES ('Autor')"
.Execute "INSERT INTO tblRolle VALUES ('Admin')"
.Execute "INSERT INTO tblBenutzerRolle VALUES (1, 'Leser')"
End With
End Sub
Ein Formular frmBenutzer, gebunden an tblBenutzer (Schlüssel ID), mit einem Token-Feld tokRollen; die
wählbaren Rollen stehen in tblRolle:
' Once, in design view (or on the designer's pages); saved with the form.
With Forms!frmBenutzer!tokRollen
.ControlSource = "ID"
.Object.RecordSource = "tblBenutzerRolle"
.Object.ValueField = "Rolle"
.Object.LinkChildFields = "BenutzerID"
.Object.LinkMasterFields = "ID"
.Object.SuggestionSource = "SELECT Rolle FROM tblRolle ORDER BY Rolle"
.Object.AllowFreeText = False
.Object.Caption = "Rollen"
End With
' Form module of frmBenutzer: ask before the last role goes.
Private Sub tokRollen_TokenRemoving(ByVal Value As String, Cancel As Integer)
If Me!tokRollen.Object.Count = 1 Then
Cancel = (MsgBox("Ohne Rolle kann sich der Benutzer nicht anmelden. Trotzdem entfernen?", _
vbYesNo + vbQuestion) = vbNo)
End If
End Sub
Eine Liste der Benutzer mit ihren Rollen als Spalte, über einer Abfrage, die die Rollen jedes Benutzers zu einem Text
verbindet (zum Beispiel mit STRING_AGG in einer SQL Server-Sicht):
With Me!lstBenutzer.Object
.RecordSource = "vwBenutzerMitRollen"
.KeyField = "ID"
.Columns.Add "Name", "Benutzer"
.Columns.Add("Rollen", "Rollen").Editor = wedTokens
End With
Hinweise
- Eingabe: Der Benutzer tippt einen Wert und bestätigt ihn mit der Eingabetaste, einem einstelligen Trennzeichen oder durch Auswahl eines Vorschlags (Nach-unten öffnet die Liste, die Eingabetaste übernimmt den markierten); verlässt er das Token-Feld mit Text, wird dieser ebenfalls hinzugefügt. Das erste Esc schließt eine geöffnete Liste, wie in einem Access-Kombinationsfeld, das nächste leert die Eingabe. Die Rücktaste in einer leeren Eingabe markiert das letzte Token, eine zweite entfernt es.
- Ein abgelehnter Wert – ein Duplikat, ein Wert außerhalb der Vorschläge, ein Wert, der nicht zu
Patternpasst,CancelinTokenAdding– bleibt in der Eingabe; der Grund erscheint unter dem Token-Feld und inErrorText. Es öffnet sich kein Meldungsfenster. - Ein neuer Datensatz, der noch nicht gespeichert ist, hat keinen Schlüssel: Das Token-Feld zeigt keine Tokens, und seine Eingabe ist schreibgeschützt, bis der Datensatz gespeichert ist, so wie ein Unterformular auf seinen übergeordneten Datensatz wartet.
- Nicht bearbeitbar: Gesperrt (
Locked) = Ja am Steuerelement oder Bearbeitungen zulassen (AllowEdits) = Nein am Formular: Das Token-Feld zeigt die Tokens ohne Schaltflächen zum Entfernen und lehnt Eingaben ab; auch Sprachausgaben finden keine Schaltflächen zum Entfernen. - Kein Rückgängig. Ein entferntes Token ist eine gelöschte Zeile, wie in einem Unterformular. Fragen Sie in
TokenRemovingnach, wenn ein Entfernen eine Bestätigung braucht. - Fehler des Backends (eine verletzte Einschränkung, eine fehlende Tabelle) werden an
DataErrorgemeldet; setzen SieResponse = 0, um die Meldung zu unterdrücken. Ein fehlgeschlagenes Lesen zeigt überhaupt keine Meldung; das Token-Feld bleibt leer, undDataErrorist die einzige Rückmeldung. - Code schreibt mit
AddToken,RemoveTokenoderTextohne die BenutzerereignisseTokenAdding…Change. Rufen SieRequeryauf, nachdem Sie die untergeordnete Tabelle am Token-Feld vorbei geändert haben. - Mehrere Token-Felder in einem Formular lesen die untergeordnete Tabelle unabhängig voneinander: Ein Token-Feld zeigt eine Änderung, die ein anderes geschrieben hat, nach dem nächsten Datensatzwechsel oder
Requery. - Nicht im Detailbereich eines Endlosformulars: Access legt dort eine einzige Instanz eines ActiveX-Steuerelements an, die nur den aktuellen Datensatz zeigt. Für Tokens je Datensatz verwenden Sie die Listenspalte.