Color scheme: Riviera
You are here: start » de » Dokumentation » Werkzeuge für Microsoft Access » WKL Forms Object Library » how-to » Mehrere Werte eines Datensatzes als Tokens führen

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 tblBenutzerRolle mit den Feldern BenutzerID und Rolle. 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 Pattern passt, Cancel in TokenAdding – bleibt in der Eingabe; der Grund erscheint unter dem Token-Feld und in ErrorText. 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 TokenRemoving nach, wenn ein Entfernen eine Bestätigung braucht.
  • Fehler des Backends (eine verletzte Einschränkung, eine fehlende Tabelle) werden an DataError gemeldet; setzen Sie Response = 0, um die Meldung zu unterdrücken. Ein fehlgeschlagenes Lesen zeigt überhaupt keine Meldung; das Token-Feld bleibt leer, und DataError ist die einzige Rückmeldung.
  • Code schreibt mit AddToken, RemoveToken oder Text ohne die Benutzerereignisse TokenAdding … Change. Rufen Sie Requery auf, 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.

Verwandte Themen

de/wiki/msaccess/comctl/how-to/keep-several-values-as-tokens.txt · Last modified: by Wolfgang van der Stille