Hranjenje več vrednosti zapisa kot žetonov
S kontrolnikom WklTokenBox na obrazcu prikažete in urejate kratek seznam vrednosti, ki pripadajo zapisu (na primer
vloge uporabnika ali oznake dokumenta), kot žetone z gumbom za odstranitev; pri vnosu pomagajo predlogi. V seznamu iste
vrednosti prikažete kot stolpec samo za branje v WklGrid ali WklTreeList.
Zahteva WKL Forms Object Library 1.33 ali novejšo različico.
Pregled rešitve
- Vrednosti hrani podrejena tabela, po ena vrstica za vsak žeton, tako kot pri podobrazcu: na primer
tblUporabnikVlogas poljemaUporabnikIDinVloga. Uporabite jo namesto polja z več vrednostmi: polja z več vrednostmi obstajajo samo v tabelah Access, ne v SQL Serverju ali prek ODBC. - Na obrazcu: vstavite WKL Token Box (kontrolnik ActiveX). Na strani oblikovalnika Podatki nastavite podrejeno tabelo (
RecordSource), njeno polje z vrednostmi (ValueField) in povezavo z zapisom obrazca (LinkChildFields,LinkMasterFields), tako kot pri kontrolniku podobrazca. - Sledenje zapisu: Vir kontrolnika (
ControlSource) nastavite na ključno polje obrazca. Access nato polju z žetoni sporoči vsako menjavo zapisa, polje pa naloži žetone tega zapisa. - Predlogi in pravila: na strani Predlogi in pravila nastavite seznam vrednosti (
SuggestionList) ali tabelo, poizvedbo ali stavek SQL (SuggestionSource), po potrebi dovolite samo predlagane vrednosti (AllowFreeText= izklopljeno) in dodajte regularni izraz s sporočilom (Pattern,ValidationText). - Shranjevanje: ni vam treba storiti ničesar. Vsak žeton, ki ga uporabnik doda, takoj vstavi svojo podrejeno vrstico, vsak odstranjen žeton takoj izbriše svojo vrstico; zapis obrazca ostane nespremenjen.
- V seznamu: stolpec z
Editor = wedTokensnad poljem, ki podrejene vrednosti združi v eno besedilo (Separator, privzeto;), prikaže iste žetone samo za branje.
Izvedba
Tabele primera, ustvarjene enkrat (proceduro zaženite iz okna Immediate):
Public Sub CreateTokenSample()
With CurrentDb
.Execute "CREATE TABLE tblUporabnik (ID LONG CONSTRAINT PK_Uporabnik PRIMARY KEY, Ime TEXT(50))"
.Execute "CREATE TABLE tblVloga (Vloga TEXT(30) CONSTRAINT PK_Vloga PRIMARY KEY)"
.Execute "CREATE TABLE tblUporabnikVloga (UporabnikID LONG NOT NULL, Vloga TEXT(30) NOT NULL, " & _
"CONSTRAINT PK_UporabnikVloga PRIMARY KEY (UporabnikID, Vloga))"
.Execute "INSERT INTO tblUporabnik VALUES (1, 'Novak')"
.Execute "INSERT INTO tblVloga VALUES ('Bralec')"
.Execute "INSERT INTO tblVloga VALUES ('Avtor')"
.Execute "INSERT INTO tblVloga VALUES ('Admin')"
.Execute "INSERT INTO tblUporabnikVloga VALUES (1, 'Bralec')"
End With
End Sub
Obrazec frmUporabnik, vezan na tblUporabnik (ključ ID), s poljem z žetoni tokVloge; vloge, med katerimi se
izbira, so v tblVloga:
' Once, in design view (or on the designer's pages); saved with the form.
With Forms!frmUporabnik!tokVloge
.ControlSource = "ID"
.Object.RecordSource = "tblUporabnikVloga"
.Object.ValueField = "Vloga"
.Object.LinkChildFields = "UporabnikID"
.Object.LinkMasterFields = "ID"
.Object.SuggestionSource = "SELECT Vloga FROM tblVloga ORDER BY Vloga"
.Object.AllowFreeText = False
.Object.Caption = "Vloge"
End With
' Form module of frmUporabnik: ask before the last role goes.
Private Sub tokVloge_TokenRemoving(ByVal Value As String, Cancel As Integer)
If Me!tokVloge.Object.Count = 1 Then
Cancel = (MsgBox("Brez vloge se uporabnik ne more prijaviti. Vlogo vseeno odstranim?", _
vbYesNo + vbQuestion) = vbNo)
End If
End Sub
Seznam uporabnikov z njihovimi vlogami kot stolpcem, prek poizvedbe, ki vloge vsakega uporabnika združi v eno besedilo
(na primer s STRING_AGG v pogledu SQL Server):
With Me!lstUporabniki.Object
.RecordSource = "vwUporabnikiZVlogami"
.KeyField = "ID"
.Columns.Add "Ime", "Uporabnik"
.Columns.Add("Vloge", "Vloge").Editor = wedTokens
End With
Opombe
- Vnos: uporabnik vnese vrednost in jo potrdi s tipko Enter, z enoznakovnim ločilom ali z izbiro predloga (puščica dol odpre seznam, Enter prevzame označeni predlog); vrednost se doda tudi, če uporabnik zapusti polje, v katerem je besedilo. Prvi pritisk tipke Esc zapre odprt seznam, kot pri kombiniranem polju v Accessu, drugi počisti vnos. Vračalka v praznem vnosu označi zadnji žeton, ponovni pritisk ga odstrani.
- Zavrnjena vrednost – dvojnik, vrednost zunaj predlogov, vrednost, ki se ne ujema s
Pattern,CancelvTokenAdding– ostane v vnosu; razlog se prikaže pod poljem in vErrorText. Okno s sporočilom se ne odpre. - Nov zapis, ki še ni shranjen, nima ključa: polje ne prikaže žetonov, njegov vnos pa je samo za branje, dokler se zapis ne shrani, tako kot podobrazec čaka na svoj nadrejeni zapis.
- Urejanje ni mogoče: če je na kontrolniku
Locked= Da ali na obrazcuAllowEdits= Ne, polje prikaže žetone brez gumbov za odstranitev in zavrne vnos; tudi bralniki zaslona ne najdejo gumbov za odstranitev. - Brez razveljavitve. Odstranjen žeton je izbrisana vrstica, tako kot v podobrazcu. Če odstranitev zahteva potrditev, vprašajte v
TokenRemoving. - Napake zaledja (kršena omejitev, manjkajoča tabela) se sporočijo v
DataError; zResponse = 0sporočilo preprečite. Neuspelo branje ne prikaže nobenega sporočila; polje ostane prazno,DataErrorpa je edino obvestilo. - Koda piše z
AddToken,RemoveTokenaliTextbrez uporabniških dogodkovTokenAdding…Change. Ko podrejeno tabelo spremenite mimo polja, pokličiteRequery. - Več polj na enem obrazcu podrejeno tabelo bere neodvisno: polje spremembo, ki jo je zapisalo drugo polje, prikaže po naslednji menjavi zapisa ali po
Requery. - Ne v odseku s podrobnostmi neprekinjenega obrazca: Access tam ustvari en primerek kontrolnika ActiveX, ki prikazuje samo trenutni zapis. Za žetone po zapisih uporabite stolpec seznama.
Sorodne teme
sl/wiki/msaccess/comctl/how-to/keep-several-values-as-tokens.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille