Meervoudige selectie...HELP!

Status
Niet open voor verdere reacties.

Janzan

Gebruiker
Lid geworden
10 jan 2012
Berichten
61
Beste mensen,

Ik heb een vraag.....heb al heel wat uren gezocht maar nog niet kunnen vinden.
Ik heb een doorlopend formulier met als gegevensbron een query.
In de koptekst van het formulier heb ik wat keuzelijsten staan zodat ik de gegevens kan filteren.
In het ontwerpvenster van de query heb ik de deze keuzelijsten als criterium gegeven, en dat werkt nu allemaal prima.
Bij 1 van de keuzelijsten zou ik graag meerdere items kunnen selecteren.
Dat kan als ik bij de eigenschappen van de keuzelijst meervoudige selectie aangeeft.
Maar dan de vraag.
Hoe moet ik nu in het ontwerpvenster van de query die meervoudige selectie inbrengen?
Nu werkt het met 1 criteria A, maar als ik in de keuzelijst ook B en C selecteert hoe moet ik dan te werk gaan?
De meervoudige selectie uit de keuzelijst moet dus ingelezen worden in het criteria van het betreffende veld in de query.
Ik denk dat dit toch via een stukje code zal moeten?
Wie heeft er voor deze leek een duidelijk voorbeeld?

b.v.b hartelijk dank!
 
Je zult af moeten stappen van het principe dat je de query filtert, wat ik je in dit geval trouwens zowiezo zou afraden: je kunt een formulier prima filteren, dus waarom zou je dat in de onderliggende query doen? Als je het formulier filtert en de query 'schoon' houdt, blijft de query altijd zonder problemen te gebruiken, en zoals gezegd: het formulier is prima te filteren. Je moet het filter dan wel opbouwen, wat je met een meervoudige keuzelijst dus toch al moet. Het uitlezen van een keuzelijst gaat ongeveer zo:
Code:
    sFilter = ""
    i = 0
    For Each itm In Me.lstCat1.ItemsSelected
        If Me.lstCat1.ItemsSelected.Count > 0 Then
            sFilter = sFilter & "(ParentID = " & Me.lstCat1.ItemData(itm) & ") "
            i = i + 1
            If i < Me.lstCat1.ItemsSelected.Count Then sFilter = sFilter & "OR "
        Else
            Exit Sub
        End If
    Next itm
Op deze manier kun je een keuzelijst uitlezen, en alle geselecteerde waarden in een string zetten. Hiermee bouw je vervolgens het filter op.
 
Hartelijk dank voor je reactie.

Ik ben een redelijke leek v.w.b. access en code etc.
Voor jou is het zeker weten super simpel :D maar voor mij is het nog niet te doorgronden.
Een voorbeeld zegt meer dan duizenden woorden, en als ik een voorbeeld heb dan kom ik er in de meeste gevallen wel uit.
Ik zou dan ook enorm geholpen zijn (en ik denk ook vele anderen in de toekomst) met een voorbeeldje uitgewerkt in een database.
Gewoon een formulier met daarop 3 keuzelijstjes, A B en C
In A de mogelijkheid voor meervoudige selectie, in B en C alleen maar enkelvoudige selectie.
Dan een knop zoek, en wat moet er dan voor code onder die knop om de gewenste gegevens in een gewoon gegevensblad zichtbaar te maken.
Zo'n werkend voorbeeld met hier en daar misschien wat uitleg in de code dat zou heerlijk zijn om te leren.
Het is natuurlijk best lastig om je als specialist in te moeten leven in een leek, dat begrijp ik heel goed.
Voor jou is het allemaal gesneden koek en vanzelfsprekend, maar voor velen die er niet elke dag mee bezig zijn is het best lastig.
Nogmaals dank voor al je info
 
Een voorbeeldje is uiteraard geen probleem.... Dat van die duizend woorden moet je nog maar eens tegen het licht houden, want zoveel zitten er vrees ik wel in de code die gebruikt wordt :D
 

Bijlagen

  • Filteren Uitgebreid V2.zip
    67,1 KB · Weergaven: 170
Allereerst hartelijk dankt voor je info.

Ik heb het bekeken....maar het is niet helemaal wat ik zoek.
Het is natuurlijk een prachtig stukje filterwerk.....maar zo veel dat ik door al de mogelijkheden het nog niet kan bevatten.
Heb je niet een eenvoudig voorbeeldje, gewoon 1 keuzelijstje met meervoudige selectie, en 1 zonder meervoudige selectie, en 1 knop waar de code onder hangt die de query zijn werk laat doen en de uitkomst gewoon op een gegevensblad laat zien.

Met duizend woorden kan ik mijn grote dank dan nog niet uitspreken :p
 
Het lijkt mij handiger als jij een voorbeeldje post met wat gegevens; dan heb je het meer in je eigen omgeving. Op zich is de crux van het verhaal hierboven namelijk al te vinden (de techniek om de keuzelijst uit te lezen). Die zal dus verder niet veranderen, behalve de naam van jouw keuzelijst natuurlijk.
 
Hartelijk dank weer voor je hulp.
In de bijlage een voorbeeldje.
Ik kan nu met beide keuzevakken een waarde selecteren.
In het query ontwerpvenster heb ik bij het veld een criteria verwijzing gemaakt naar de betreffende keuzelijsten.
De knop ververst nu het geheel, en de records verschijnen in het subformulier.
Ik zou nu graag een meervoudige selectie kunnen maken in het keuzevak jaar.
Dat is alles...:DBekijk bijlage filtervoorbeeld.rar
 
Ik heb bovenstaande techniek in je formulier toegepast. Ik zeg wel: 'je formulier' maar je zult zien dat daar weinig van over is. Het belangrijkste is wel dat je in deze situatie helemaal geen subformulier nodig hebt; je maakt het daarmee alleen maar nodeloos ingewikkeld. Keep it simpel ;)
 

Bijlagen

  • filtervoorbeeld.rar
    23,7 KB · Weergaven: 142
Duizend maal dank, want dit is het helemaal! :thumb:
Ik begrijp het nu, en ga het nu ook toepassen.
 
Toch nog een vraag...:(
Ik heb je voorbeeld toegepast in mijn database.
Ik krijg alleen de volgende foutmelding als ikk klik op een waarde in de keuzelijst.
Fout 2448 u kunt geen waarde aan dit object toekennen.
Als ik dan de kijk bij foutopsporing wijst hij aan:
Me.Filter = sFilter
Als ik daar met de cursor op gaat staan zie ik:
sFilter ="(=24933)"
Dit is ook de waarde die waarop ik heb geklikt in de keuze lijst...
Wat mis ik nu nog??
Ik kan niet vinden wat ik anders heb gedaan dan in jouw voorbeeld.

Wederom mijn dank!
 
Laatst bewerkt:
Je hebt een klein detail gemist in mijn voorbeeld. Ik haal de veldnaam voor het filter namelijk uit een eigenschap van de keuzelijst. En die eigenschap heb je niet ingevuld, vandaar dat de filterstring niet volledig is. Als je de eigenschappen bekijkt van mijn keuzelijsten lst1 en lst2, zie je op het tabblad <Overig> de eigenschap <Extra info>. Die bevat resp. de waarden "Jaar" en "Soort". Dit zijn zeg maar de namen van de velden waarop je het filter wilt maken. Die eigenschap wordt in deze regel uitgelezen:
Code:
       sFilter = sFilter & "(" & [B][COLOR="#0000CD"]Me.lst1.Tag [/COLOR][/B]& " = " & Me.lst1.ItemData(itm) & ") "
De reden dat ik het zo doe is omdat ik vaak keuzelijsten combineer tot één filter, en dan wil je op een gestandaardiseerde manier met een lus door de keuzelijsten lopen. Aangezien elke keuzelijst uiteraard een ander veld filtert, kun je dan niet volstaan met het hard intypen van de veldnaam van het filter. Die veldnaam zet ik dus bij de Eigenschap <TAG> (in het Nederlands dus <Extra Info>).
Vul dus bij de keuzelijsten daar de naam in van het veld, en je zult zien dat hij werkt.
 
JA!!!, geweldig weer:thumb:
Klopt het wel dat het filteren op tekstvelden waarin ook punten etc voorkomen niet goed gaat?
Een veld soort heeft wel eens als inhoud kl.test bijvoorbeeld...
Op velden waar cijfers instaan gaat het nu prima.
 
Filteren op een tekstveld gaat net iets anders dan filteren op een numeriek veld. Dat verschil kun je zien als je de filterstring bekijkt van lst2, die is gemaakt voor een tekstveld. lst1 filtert een numeriek veld. Als je de juiste syntax gebruikt, zou het niet mogen uitmaken dat er een punt in staat.
 
Oke, dan ga ik dat nog eens even goed bekijken.
Nogmaals dank voor al deze duidelijke info die mij als leek zeer geholpen heeft!:thumb:
 
Kan ik zo'n keuzelijst ook gelijktijdig voor meerdere velden gebruiken?
Bijvoorbeeld ik heb in de keuzelijst de keuze uit en aantal getallen.
Ik wil dan de records zien waarin in veld A of in veld B de geselecteerde waarde staat.
Kan ik bij die extra info ook 2 velden opgeven misschien?
b.v.b dank
 
Ik snap de vraag eigenlijk niet; als je een keuzelijst maakt is die gebaseerd op één veld. De opties waaruit je kunt kiezen hebben dus betrekking op één veldbron. Die veldbron is ook de basis van het veld waarop je filtert. Je kunt een keuzelijst niet tegelijkertijd voor twee verschillende velden gebruiken, en het lijkt mij dus ook niet zinvol om op meerdere velden tegelijkertijd te filteren. Maar leg eerst eens uit wat je bedoelt, want ik vermoed dat je iets heel anders wilt...
 
Oke, ik zal proberen om het even duidelijk te maken.
Ik heb een tabel die wordt gemaakt door een ander programma.
Het is een tabel met veel velden, en hier komt de info van een aantal vestigingen bij elkaar.
Vraag mij niet waarom, maar een kenmerk van een proudct waar ik ook op wel filteren staat soms in veld A en soms in Veld B
Met de eerste keuzelijst filter ik dus op artikel.
Met de tweede lijst wil ik dan graag op dat kenmerk sorteren.
Dus een artikel met in veld A of in Veld B dat kenmerk
Uitiendelijk zie ik dan de records waar in Veld A de waarde kenmerk staat en ook de records waarin veld B de waarde kenmerk staat.
Als die waarde in veld A staat, dan staat die waarde niet in veld B
Ik kan natuurlijk 2 keuze lijsten maken.....maar ik dacht misschien is die waarde uit 1 keuzelijst ook te gebruiken om op 2 velden te filteren.

Tja, als het een beetje gaat lukken wil je steeds meer he? :d
 
Dat gevoel ken ik :)
Ik zou het anders oplossen, want dit ziet er uit als een vrij ongelukkige constructie. Ik zou een Union query maken waarin je twee queries samenvoegt op basis van een criterium Is NULL voor het samen te voegen veld.. De eerste query maak je gewoon met de queryfunctie. De rest van het werk moet je in het SQL venster doen. Die query bevat dan iets als:
Code:
SELECT Test.Datum, Test.[Veld 1] AS Veld FROM Test
WHERE (((Test.[Veld 1]) Is Not Null))
Die SELECT code kopieer je, en voeg je onderaan toe, nadat je eerst onder de bestaande code het woord UNION hebt getypt:
Code:
Union 
SELECT Test.Datum, Test.[Veld 2] FROM Test
WHERE (((Test.[Veld 2]) Is Not Null))
Uiteraard pas je in de gekopieerde tekst de veldnaam aan. En dat herhaal je als je nog meer velden wilt samenvoegen. Dus bij een derde veld krijg je dit er nog bij:
Code:
Union 
SELECT Test.Datum, Test.[Veld 3] FROM Test
WHERE (((Test.[Veld 3]) Is Not Null));
De totale UNION query ziet er dan zo uit:

Code:
SELECT Test.Datum, Test.[Veld 1] AS Veld FROM Test
WHERE (Test.[Veld 1] Is Not Null)
Union 
SELECT Test.Datum, Test.[Veld 2] FROM Test
WHERE (Test.[Veld 2] Is Not Null)
Union 
SELECT Test.Datum, Test.[Veld 3] FROM Test
WHERE (Test.[Veld 3] Is Not Null);

Let ook op de puntkomma die Access er automatisch bij zet. In een query mag er maar één voorkomen, en die komt op het eind te staan.
Als je de query nu uitvoert, zul je zien dat alle aparte velden nu in één veld staan. En op basis daarvan kun je weer makkelijker een formulier maken, en ook makkelijker een keuzelijst.
Deze techniek werkt overigens alleen jofel als de velden waarop je selecteert uniek zijn, dus een waarde mag niet in het ene record en [Veld 1] staan, en in een ander record in [Veld 2].
Dan kun je de query ook nog wel draaien, maar moet je i.p.v. UNION de opdracht UNION ALL gebruiken.
 
Laatst bewerkt:
oooo, dat is simpel op te lossen dus....... :shocked:

Ik moet daar even over nadenken....of ik daar wel aan gaat beginnen.... :d
Misschien is een extra keuzelijstje ineens niet zo erg meer
Ik ben in ieder geval weer een stuk opgeschoten.
Ik bedank je nogmaals voor al je info :thumb:
 
Heb ik toch nog een vraagje.
Ik heb nu twee keuzelijsten gemaakt, met meervoudige selectie helemaal naar jouw voorbeeld.
Echter werken de keuzelijsten bij mij niet in combinatie met elkaar, zoals wel het geval in jouw voorbeeld.
De selectie van de eerste keuzelijst gaat verloren als ik een selectie maakt in de tweede keuzelijst??
Als ik in de eerste keuzelijst een artikel selecteerd dan komen alle records keurig te voorschijn.
Selecteer ik in de tweede keuzelijst dan een kenmerk komen alle artikels met dat kenmerk te voorschijn.
Dat is in jouw voorbeeld niet het geval......wat doe ik fout??
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan