Access VBA. Keuzevak met invoervak filteren.

Status
Niet open voor verdere reacties.

KPTPTT

Gebruiker
Lid geworden
2 mrt 2018
Berichten
321
Hallo. Ik heb een formulier met keuzevak. Het keuzevak is gekoppeld aan de query Historie. In de query staan opdrachten behorende bij een adres. Een adres bestaat uit een veld straat en een veld huisnummer. Een adres kan meerdere keren voorkomen in de lijst, dus een aantal keer dezelfde straat met een aantal keer hetzelfde huisnummer behorende bij verschillende opdrachten.
Als je bladert door de keuzelijst, dan staat er meerdere keren dezelfde straat met hetzelfde huisnummer in de lijst en kun je er één selecteren
Ik zou graag willen dat de lijst gefilterd wordt in één straatnaam met één huisnummer. Aan de hand van dit adres worden in de query alle bijbehorende records (dus de overige adressen met dezelfde straat en hetzelfde huisnummer) opgezocht en getoond in velden op het formulier. De Rijbron voor de keuzelijst met invoervak is: SELECT [qry Historie].[o_Opdracht ID], [qry Historie].[o_Adres], [qry Historie].[o_Huisnummer], [qry Historie].[o_Plaats] FROM [qry Historie];

Deel van de code voor de keuzelijst waarbij het volledige adres van de keuzelijst in een paar tekstvelden wordt getoond. Vervolgens worden alle records opgezocht.
Code:
Private Sub Keuzelijst7_AfterUpdate()
If Not IsNull(Me.Keuzelijst7.Value) Then
    Call Form_Load                                                          'Buttons naar default instelling.
    Set rsClone = Me.RecordsetClone
    sCriteria = sSearchField & "=" & Me.Keuzelijst7.Value                   
    rsClone.FindFirst sCriteria                                                             
        If rsClone.NoMatch Then
            MsgBox "Record niet gevonden"
        Else
            Me.Bookmark = rsClone.Bookmark                       'Synchronize the Bookmark to the recordset's record
        End If
End If

sAdres = DLookup("[o_Adres]", "Opdrachten", "[o_Opdracht ID]=" & Me.Keuzelijst7.Value) 
sNum = DLookup("[o_Huisnummer]", "Opdrachten", "[o_Opdracht ID]=" & Me.Keuzelijst7.Value)
sPlaats = DLookup("[o_Plaats]", "Opdrachten", "[o_Opdracht ID]=" & Me.Keuzelijst7.Value) 

Me.[Tekst302] = sAdres                                                                 'Toont het adres, nummer en plaats
Me.[Tekst314] = sNum
Me.[Tekst304] = sPlaats

Etcetera.

End sub

Hoe kan ik het oplossen, alvast bedankt.
 
Ik snap je gedachtengang niet helemaal (en dan bedoel ik niet de reden dat je deze vraag niet in het Access forum stelt ;) ). Normaal gesproken gebruik je een keuzelijst om het formulier te filteren. Een keuzelijst filteren kan wel, maar lijkt mij (zeker in dit geval) zinloos. Tenzij het om duizenden records gaat die niet in de keuzelijst passen. Dus normaal gesproken zou je in je query geen opdrachtID mogen zetten, en de overige (NAW) velden met DISTINCT groeperen. Je gebruikt de keuzelijst dan om een filter te maken voor het formulier.

In mijn ogen geen VBA vraag, maar een typische Access vraag dus :)
 
Dank je wel OctaFish. Ik dacht dat ik mijn probleem/uitdaging met VBA kan oplossen, vandaar de gekozen rubriek VBA. Je antwoord begrijp ik niet, althans het komt niet overeen met mijn beeldvorming.
Als ik een keuzelijst heb, vanuit de query, met straat en nummer, dan krijg je toch een hele lijst met straten en nummers. Omdat bepaalde adressen meerdere keren voorkomen, zie je die ook in de lijst, en dat wil ik voorkomen. Het zijn wel duizenden records maar qua aantal adressen misschien honderd (meerdere opdrachten per jaar op één adres). Waarom geen opdrachtID in een query? Overige velden in een groep? met DISTINCT ?, hoe? Ik maak geen keuzelijst voor een formulier. Ik heb een formulier met een keuzelijst waarin in de keuzelijst meervoudige gelijke adressen staan, en die wil ik minderen zodat het zoeken in het formulier eenvoudiger wordt (geen Kerkstraat 18 drie maal maar één keer Kerkstraat 18). Na de keuze worden alle record(s) (opdrachten) van het betreffende adres (Kerkstraat 18) met bijbehorende knoppen voor de andere gerelateerde formulieren in het formulier getoond. Het werkt in de praktijk, gemakkelijk, snel en is overzichtelijk, behalve de meervoudige adressen.
 
Access heeft voor zijn automation altijd VBA nodig, maar net zoals je in het Excel forum bijna geen vragen ziet waar geen VBA aan te pas komt (of dat terecht is, blijft dan de vraag natuurlijk) geldt dat voor Access helemaal, omdat het meestal om specifieke Access problematiek gaat, die weinig met de VBA semantiek van doen heeft. Oftewel: een VBA Access vraag is doorgaans zonder Access kennis niet op te lossen. Daarom is het Access forum een veel betere plek.

Omdat bepaalde adressen meerdere keren voorkomen, zie je die ook in de lijst, en dat wil ik voorkomen.
En daar gaf ik dus de oplossing voor :).
Code:
SELECT DISTINCT [o_Adres], [o_Huisnummer], [o_Plaats] FROM [qry Historie]
Zou voldoende moeten zijn om alleen unieke records in je keuzelijst te zien.

Ik heb verder niet naar je code gekeken, omdat deze werkwijze in mijn ogen verkeerd is (op een aantal fronten). En je een hele specifieke vraag stelt, die dus simpel is op te lossen.
 
Dank voor je hulp.
Ik heb voor proef de je Select code in de Rijbron van de keuzelijst geplaatst. De dubbele adressen zijn uit de lijst maar de Keuzelijst geeft geen ID nummer meer af met de code Me.Keuzelijst7. Zie svp. item #1. Wat kan de oorzaak zijn?
 
Laatst bewerkt:
Natuurlijk geeft de keuzelijst nu geen OrderID’s meer. Perfect, is precies de bedoeling! Je moet de keuzelijst gebruiken om je formulier met opdrachten te filteren; die opdrachten horen niet in de keuzelijst thuis. Of, als je tóch op orders wilt kunnen filteren, via een tweede keuzelijst die de orders van de eerste keuzelijst laat zien. Maar nooit in 1 keuzelijst.
 
Dank. Het enige wat ik zou willen is een keuzelijst met enkele adressen, dat is gelukt. De ID is er niet meer, waarom? Wij willen geen tweede keuzelijst met keuze uit opdrachten maar een blad waar alle opdrachten in één keer te zien zijn. Dit heb ik en werk sinds een half jaar naar volle tevredenheid van de gebruikers (was een eis). Uit de keuzelijst komt nu een adres. Om toch een benodigd ID nummer te destilleren, heb ik dit geprobeerd met de DLookUp instructie. Regelmatig succesvol toegepast maar dit keer krijg ik het niet aan de praat.

Code:
Dim sOpdrachtID As String
sOpdrachtID = DLookup("[o_Opdracht ID]", "Opdrachten", "[o_Adres]=" & Me.Keuzelijst7)

Debug.Print Me.Keuzelijst7
Debug.Print sOpdrachtID

Me.Keuzelijst7 geeft een correcte adres-string bv. Kerkplein. Veld o_Adres is onderdeel van tabel Opdrachten en bevat de adressen wo. Kerkplein. Ik verwacht dmv. LookUp de Opdracht ID in sOpdrachtID te krijgen maar helaas. Van alles geprobeerd maar het is laat.
 
Wij willen ... een blad waar alle opdrachten in één keer te zien zijn.
Maar dat heb je nu toch? In de keuzelijst filter je het adres, en dat adres gebruik je om het (doorlopende) formulier te filteren. Daar heb je absoluut geen DLOOKUP voor nodig.
Dat filter is nu dus een filter op tekstniveau, het is geen getal meer. (Moet ook slimmer kunnen denk ik, maar dat staat los van deze vraag). Dus je moet er ook een tekstfilter van maken. Als het filter hetzelfde is als in je lookup, dan zou dit het formulierfilter moeten zijn:
Code:
     Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7 & """"
     Me.FilterOn = True

En die code voeg je dan toe aan de gebeurtenis <Bij klikken> van de keuzelijst zodat het filter wordt uitgevoerd bij het kiezen.
 
Dank voor je hulp, OctaFish. Ik kom er echt niet meer uit en het blijkt dat nu de keuzelijst enkelvoudig is maar sommige adressen, bij een selectie in de keuzelijst van dezelfde straat en ander huisnummer, hetzelfde adres geven als het vorige adres . In de code en keuzelijst van vraag #1 kreeg ik uit de keuzelijst7 een ID nummer [o_Opdracht ID] bij het adres dat was geselecteerd in de keuzelijst. Dit ID heb ik in de verdere code gebruikt en heb dat dus nodig. Nu is het resultaat van de keuzelijst uitsluitend een o-Adres="Kerkplein", geen huisnummer en geen plaats, laat staan een ID, dus niet exclusief. Ik kan er verder geen huisnummer (o_Huisnummer) en plaats (o_Plaats) uit destilleren om dan toch bv. via DLookUp de o_Opdracht ID te destilleren. Ik heb nog geprobeerd om de Rijbron uit te breiden met o_Opdracht ID maar dat geeft geen resultaat evenals het huisnummer en plaats. Wat ik uit de keuzelijst nodig heb is de [o_Opdracht ID] maar hoe?
 
Laatst bewerkt:
Ik snap er steeds minder van. Nu zeg je:
Wat ik uit de keuzelijst nodig heb is de [o_Opdracht ID]
Maar in je eerste bericht zeg je:

Ik zou graag willen dat de lijst gefilterd wordt in één straatnaam met één huisnummer.
Dat is onverenigbaar met elkaar, dus wat wil je nu?

Even uitleggen wat je probleem is: je keuzelijst bevat records op basis van orders. Het OrderID is uniek, en elke order bevat dus een unieke bestelling. Eén klant plaatst meerdere bestellingen, dus het (aflever)adres is nooit uniek. Doordat je zowel OrderID als adressen in de keuzelijst hebt staan, is de gekozen waarde in de keuzelijst altijd een uniek OrderID. Prima als je een specifieke order wil vinden, maar dan moet je die keuzelijst niet gebruiken om een adres te filteren. Hij zoekt immers een order op. Sterker nog: als je een order wil zoeken, zijn er andere velden die je in de keuzelijst moet zetten, omdat een adres doorgaans weinig zegt over een order. Zelfs niet over een specifieke klant!

Wil je een keuzelijst waarmee je een klant kan opzoeken/filteren, dan zet je dus geen OrderID in die keuzelijst, maar klantgegevens, eventueel met adres. Omdat een klant doorgaans meerdere keren voorkomt, moet je de waarden in de keuzelijst uniek maken (met DISTINCT). Dan levert de keuzelijst dus een KlantID op, waarmee je het formulier verder kan filteren. Doorgaans ook een nuttige toepassing van een keuzelijst.

En keuzelijst die een adres filtert? Ik zie eerlijk gezegd het nut niet, maar goed, jij wel. Die adresgegevens moeten dan dus wél in je ordertabel zitten (lijkt mij een typisch geval van dataredundantie, maar goed) anders valt er niks te filteren. Ook nu dus geen OrderID in de keuzelijst, want je wilt adressen filteren. Er komt dan een probleem bij: een straatnaam bevat meerdere huisnummers, dus als je alleen op straatnaam filtert, is je selectie te ruim. Je moet dus filteren op meerdere velden.

Ik kan er verder geen huisnummer (o_Huisnummer) en plaats (o_Plaats) uit destilleren om dan toch bv. via DLookUp de o_Opdracht ID te destilleren
Ook dat klopt niet, want als die velden in de keuzelijst zitten, kun je ze er met Me.Keuzelijst7.Column(#) uithalen. Dus je kunt wel degelijk met je keuzelijst een compleet filter maken. Maar wat moet je toch steeds met die DLOOKUP? Die blijft maar terugkomen in je berichten :)
 
Volgens mij is er verwarring. Ik krijg uit de keuzelijst geen Klant ID c.q. "Opdracht ID". Het gaat niet om orders maar werkopdrachten. Op een uniek adres kan meerdere keren per jaar een werkorder worden uitgevoerd dus het adres kan in de tabel met verschillende werkorders meerdere keren voorkomen. Kerkplein 21-opdracht 10, Kerkplein 21-opdracht 36, etc. Het adres is uniek. In de query staan de kolommen straat, huisnummer, plaats en opdracht ID. In de eerste keuzelijst #1 werden de adressen (straat-huisnummer) meerdere keren weergegeven Kerkplein 21, Kerkplein 21, etc. Er wordt dus op een uniek adres gezocht om daarna alle werkopdrachten en Opdrachtformulieren etc. van dit adres boven water te halen. Als ik één van beide adressen selecteerde, werd met de instructie Me.keuzelijst7 (zie #1) de opdracht ID afgegeven. Hiermee kon ik het unieke adres en huisnummer bepalen en daarna alle werkopdrachten ophalen.

Nu met SELECT DISTICT worden de dubbele adressen verwijderd maar zoals verwacht geen ID afgegeven. Ik heb de opdracht ID voor verdere verwerking nodig. Hoe kom ik eraan, mijn noodplan misschien met DLookUp maar dat is vergeven. Ik verkrijg uit de keuzelijst immers alleen het straatnaam [0_Adres] maar geen uniek bijbehorend huisnummer!. Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7 & """" krijg je alleen het adres uit de eerste kolom.

Volgens je analyse kan ik een filter maken. Je optie met Column(#) heb ik als volgt toegevoegd
Code:
Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7.Column(0) & """"                                   
     Me.FilterOn = True
     sGefilterdAdres = Me.Filter
     Me.Filter = "[o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """"
     Me.FilterOn = True
     sGefilterdHuisnummer = Me.Filter
Opm.: Column begint bij 0 te tellen.
Ik heb nu bruikbare gegevens [o_Adres] = Straatnaam/adres (sGefilterdAdres) en [o_Huisnummer] = huisnummer (sGefilterdHuisnummer) gedestilleerd.

Helaas met testen merk ik dat bij twee verschillende adressen in dezelfde straat bv. Kerkplein 31 en Kerkplein 55, twee maal hetzelfde adres/huisnummer bv. Kerkplein 32, Kerkplein 31 wordt gegeven.

Inmiddels heb ik ontdekt dat bij aanpassen van de volgorde van filtering, er nu wel twee verschillende huisnummers worden gegeven in dezelfde straat.
Code:
Me.Filter = "[o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """"
     Me.FilterOn = True
     sGefilterdHuisnummer = Me.Filter
     
     Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7.Column(0) & """"
     Me.FilterOn = True
     sGefilterdAdres = Me.Filter
Je moet er maar opkomen.

Misschien voor andere lezers: Het adres, nummer en plaats worden in de vorige code weergegeven als: [o_Adres] = "Kerkplein". Ik heb alleen Kerkplein nodig en heb dat als volgt gestript:
Code:
    strOut = vbNullString
    For I = 1 To Len(sGefilterdAdres)
    If InStr(",.\/:*?<>|""""'", Mid(sGefilterdAdres, I, 1)) = 0 Then strOut = strOut & Mid$(sGefilterdAdres, I, 1)
    Next
    strOut = Right([strOut], Len([strOut]) - 12)
    sAdres = strOut
De output sAdres is nu Kerkplein. Evenzo gedaan voor nummer en plaats.

Toch heb ik met DLookUp de Opdracht ID achterhaald.
Code:
sOpdracht = vbNullString
sOpdracht = DLookup("[o_Opdracht ID]", "Opdrachten", _
"[o_Adres]='" & [sAdres] & "' AND [o_Huisnummer]= '" & [sNum] & "' AND [o_Plaats]= '" & [sPlaats] & "'")
Het werkt maar niet consequent, af en toe bij een ander adres wordt geen ID sOpdracht afgegeven. Wat zou dat kunnen zijn?

Ik vind het moeilijk om je lastig te vallen, ben er al meer dan 15 uur mee bezig en waardeer je inspanning zeer.:thumb:
 
Laatst bewerkt:
Even een paar dingen rechtzetten: opdrachtID of werkopdracht ID maakt mij natuurlijk niets uit :). Je opmerking dat een adres uniek is, baart mij enige zorgen, want volgens mij werk je met klanten en niet met adressen. Ik kan mij althans niet voorstellen dat een huis (of bedrijfspand) ooit iets betaald heeft. Of dat een pand jou opdracht geeft om iets te doen. Zal altijd een klant/opdrachtgever zijn. Dus: in je tabe Opdrachten hoef je helemaal geen adressen te hebben, een KlantID volstaat. Adressen zijn alleen interessant als er meerdere klanten op hetzelfde adres zitten.
Een OpdrachtID filteren op basis van een adres? Ik kan mij er totaal niets bij voorstellen.

Dan jouw code om te filteren. Jij laat twee verschillende (enkelvoudige) filters zien. Die werken niet opeenvolgend, al schijn je te denken van wel. Maar het tweede filter overrulet het eerste, dus het eerste filter in je code is nutteloos.
Code:
     Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7 & """ AND " & [o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """"
     Me.FilterOn = True
 
Dank je wel. Het klinkt misschien vreemd, maar we werken met uitsluitend met adressen&opdrachten en leiden daar alles van af. Een keukenkastje vervang je niet op naam van de bewoner maar op een adres, vandaar :). De bewoner is geen opdrachtgever maar de makelaar etc..
Het eerste filter geeft het huisnummer, maar is het huisnummer door het tweede filter dan onstabiel geworden? Je code filter begrijp ik niet helemaal. Er staat bij huisnummer een kolomnummer en bij o_Adres (Column 0) niet, ik mis ook o_Plaats (Column 2).
Wil je die svp aanvullen.

Ik kan niet verder zonder een stabiele o_Opdracht ID. Zie svp. laatste alinea item #11. Die heb ik gedestilleerd vanuit de resultaten van de drie filters, maar de uiteindelijke Opdracht ID blijkt onstabiel te zijn.
Dit had ik gemaakt maar hoe wordt het dan?

Code:
Me.Filter = "[o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """"
    Me.FilterOn = True
    sGefilterdHuisnummer = Me.Filter
    strOut = vbNullString
    For I = 1 To Len(sGefilterdHuisnummer)
    If InStr(",.\/:*?<>|""""'", Mid(sGefilterdHuisnummer, I, 1)) = 0 Then strOut = strOut & Mid$(sGefilterdHuisnummer, I, 1)
    Next
    strOut = Right([strOut], Len([strOut]) - 17)
    sNum = strOut

    Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7.Column(0) & """"           
    Me.FilterOn = True
    sGefilterdAdres = Me.Filter
    strOut = vbNullString
    For I = 1 To Len(sGefilterdAdres)
    If InStr(",.\/:*?<>|""""'", Mid(sGefilterdAdres, I, 1)) = 0 Then strOut = strOut & Mid$(sGefilterdAdres, I, 1)
    Next
    strOut = Right([strOut], Len([strOut]) - 12)
    sAdres = strOut

    Me.Filter = "[o_Plaats] = """ & Me.Keuzelijst7.Column(2) & """"      
    Me.FilterOn = True
    sGefilterdPlaats = Me.Filter
    strOut = vbNullString
    For I = 1 To Len(sGefilterdPlaats)
    If InStr(",.\/:*?<>|""""'", Mid(sGefilterdPlaats, I, 1)) = 0 Then strOut = strOut & Mid$(sGefilterdPlaats, I, 1)
    Next
    strOut = Right([strOut], Len([strOut]) - 13)
    sPlaats = strOut

Ik heb inmiddels verder getest en constateer dat de volgende code voor het bepalen van de [o_Opdracht ID] niet stabiel en de oorzaak is. Regelmatig wordt geen ID nummer (sOpdrachtID) afgegeven. sAdres, sNum, sPlaats worden wel gegenereerd en in mijn formulier steeds correct weergegeven, dus werkt nmi. de filtering goed maar de DLookUp twijfelachtig, quootjes?? Zie ik wat over het hoofd?
Code:
sOpdrachtID = vbNullString
[sOpdrachtID] = DLookup("[o_Opdracht ID]", "Opdrachten", _
"[o_Adres]='" & [sAdres] & "' AND [o_Huisnummer]= '" & [sNum] & "' AND [o_Plaats]= '" & [sPlaats] & "'")
[o_Opdracht ID] = sOpdrachtID
 
Laatst bewerkt:
Gaan we dan nooit van die DLOOKUP afkomen? :). Echt, daar moet je mee stoppen. Van je nieuwste filter snap ik nog minder dan van je vorige, dus ik kan daar niet zoveel mee. Wel zie ik dat je continue hetzelfde doet: het formulier filter een paar keer instellen, en vervolgens vervangen door een ander. Dat levert echter altijd het laatste filter op, nooit een combinatie van de eerdere pogingen. Dat kan echt alleen als je alle voorwaarden in één string zet. En dan krijg je toch echt dit:

Code:
    Me.Filter = "[o_Adres] = """ & Me.Keuzelijst7 & """" _
        & " AND [o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """" _
        & " AND [o_Plaats] = """ & Me.Keuzelijst7.Column(2) & """"""
    Me.FilterOn = True

De reden dat ik geen Column gebruik bij o_Adres is een simpele: elke keuzelijst heeft een Afhankelijke kolom. Dat is een kolom die de gekozen waarde bevat. Doorgaans het sleutelveld, maar je kunt daar elk veld voor gebruiken. In jouw geval is dat dus het veld o_adres. En dan hoef je verder geen kolom op te geven. Dat mág natuurlijk wel; het resultaat zal niet veranderen.
 
Dank voor je hulp. Ik heb je filter getest maar het resultaat is nogal complex om het adres, nummer en plaats met variabele veldlengte te ontleden: [o_Adres] = "Kerkplein" AND [o_Huisnummer] = "13" AND [o_Plaats] = "2251 XN Voorschoten"". Wat ik beslist als uitkomst nodig hebt, zijn in drie aparte strings: sAdres =<adres>, sNum=<huisnummer> en sPlaats=<plaats>.

Tevens, zoals ik al heb aangegeven, heb ik ook nodig de index [o_Opdracht ID] van dit record. Volgens mij (helaas) de enige mogelijkheid om die te destilleren met DLookUp ahv. het adresveld.
Als ik de SQL code van de Rijbron, zie item #4, uitbreid met het veld [o_Opdracht ID], dan heb ik weer last van dubbele adressen in de keuzelijst. Hoe verkrijg ik [o_Opdracht ID]?
De oude Rijbron met dubbele adressen gaf wel met Keuzelijst7 rechtstreeks het [opdracht ID] nummer af maar helaas nu niet meer.

a) Hoe kan ik de complexe string (Me.Filter) ontleden in aparte strings sAdres, sNum en sPlaats?
b) Hoe kom ik zonder DlLookUp aan de waarde van [o_Opdracht ID] van het gefilterde record? De record bevat oa. de velden: [o_Opdracht ID], [o_Adres], [o_Huisnummer], [o_Plaats]? De SQL code Rijbron uitbreiden, hoe?
c) Als er voor b) geen oplossing is, en dan maar toch de DLookUp instructie gebruiken, hoe ziet deze instructie voor de [o_Opdracht ID] er dan uit? De DLookUp code werkt niet stabiel, waarom niet? Bij adressen uit dezelfde straat met ander huisnummer wordt soms wel en soms geen waarde gegeven voor sOpdrachtID/o_Opdracht ID.

Langzamerhand wordt ik na dagen zoeken tureluurs. Alvast dank voor je hulp.

Code:
sOpdrachtID = vbNullString
[sOpdrachtID] = DLookup("[o_Opdracht ID]", "Opdrachten", _
"[o_Adres]='" & [sAdres] & "' AND [o_Huisnummer]= '" & [sNum] & "' AND [o_Plaats]= '" & [sPlaats] & "'") 'gewijzigd [o_opdracht ID]
MsgBox [sOpdrachtID]
 
Laatst bewerkt:
Ik ben de draad enigszins kwijt geraakt, vrees ik... in je oorspronkelijke vraag wilde je de keuzelijst gebruiken om het doorlopende formulier te filteren. Daar heb ik je de SQL voor gegeven, en dat werkt prima. Het gekozen adres gebruik je om een filter op het formulier te zetten, zodat je alle opdrachten op dat adres ziet. was dacht ik exact wat je wilde. Dus ik ben de draad nu helemaal kwijt, want volgens mij is het nu zo dat je bij elk geselecteerd record in je formulier het OpdrachtID hebt. Dus i snap echt niets van al die DLOOKUP constructies. Wil je, op basis van een record in het subformulier een ander formulier openen, dan kun je dat gewoon met een knop doen die je in de Detailsectie zet bijvoorbeeld. Dan heb je automatisch het OpdrachtID te pakken.
 
Ik kan het mij helemaal voorstellen.
Het is een feit dat jouw filter beter is dan de drie opeenvolgende filters van mij, deze geven instabiele problemen. Alle componenten (adres, nummer, plaats) zitten in je filter, echter de uitkomst ([o_Adres] = "Kerkplein" AND [o_Huisnummer] = "13" AND [o_Plaats] = "2251 XN Voorschoten"") van het filter is complex om de losse delen sAdres/[o_Adres], sNum/[o_Huisnummer] en sPlaats/[o_Plaats] te kunnen destilleren. Ik zie dat nog niet zitten, dus hoe zou ik kunnen doen?

Ik heb ook de indexwaarde [o_Opdracht ID] uit de tabel/query nodig. Die krijg ik door toepassing van je SQL string voor de Rijbron niet meer ter beschikking. Dus lijkt mij de oplossing DLookUp om de ID te kunnen distilleren. Ik heb verder onderzoek gedaan en het blijkt dat de plaats van mijn filter in de VBA code (voor of na het openen/uitlezen van de tabel, van belang is voor een stabiele werking van het doorlopen van de database op zoek naar de veldwaarden van de tabel. Laat dit nog maar even zitten. Ik wil verder gaan met jouw filter. Het zal daarna wel beter gaan.

Ik zou wel graag willen weten hoe ik jouw filter kan ontleden in drie strings sAdres= [o-Adres] dus "Kerkplein", sNum = [o_Huisnummer] dus "13" en sPlaats = [o_Plaats] dus "2251 XN Voorschoten".
 
Laatst bewerkt:
Hallo OctaFish. Ik heb inmiddels mijn huiswerk gedaan en heb via een misschien een wat omslachtige manier het eindresultaat van je filter ontleedt. In de string Me.Filter eerst de plaats van de zes Quootjes bepaalt en daarna met Mid str. het adres, nummer en plaats uit de string Me.Filter uitgenomen. Het werkt als een speer en mijn problemen zijn opgelost. Jouw filter (Me.Filter) filtert de waarden uit de kolommen van de keuzelijst(7) en werkt perfect. Ik ben overtuigd, het is de enige manier, vergeet mijn filter in #13 maar gebruik #15. Dank voor alles.

Code:
Me.Filter = "[sGefilterdeAdres] = """ & Me.Keuzelijst7 & """" _
        & " AND [o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """" _
        & " AND [o_Plaats] = """ & Me.Keuzelijst7.Column(2) & """"""
    Me.FilterOn = True


Dim quoot1 As String
Dim quoot2 As String
Dim quoot3 As String
Dim quoot4 As String
Dim quoot5 As String
Dim quoot6 As String
Dim QuootTeller As Integer
Dim CharLenAdres As String
Dim CharLenNum As String
Dim CharLenPlaats As String

QuootTeller = 0

    For I = 1 To Len(Me.Filter)
        If Mid(Me.Filter, I, 1) = Chr(34) Then
            If QuootTeller = 0 Then
                quoot1 = I
                QuootTeller = QuootTeller + 1
            ElseIf QuootTeller = 1 Then
                quoot2 = I
                QuootTeller = QuootTeller + 1
            ElseIf QuootTeller = 2 Then
                quoot3 = I
                QuootTeller = QuootTeller + 1
            ElseIf QuootTeller = 3 Then
                quoot4 = I
                QuootTeller = QuootTeller + 1
            ElseIf QuootTeller = 4 Then
                quoot5 = I
                QuootTeller = QuootTeller + 1
            ElseIf QuootTeller = 5 Then
                quoot6 = I
                QuootTeller = QuootTeller + 1

            End If
        End If
    Next

    CharLenAdres = ((quoot2 - 1) - quoot1)
    sAdres = Mid(Me.Filter, (quoot1 + 1), CharLenAdres)

    CharLenNum = ((quoot4 - 1) - quoot3)
    sNum = Mid(Me.Filter, (quoot3 + 1), CharLenNum)

    CharLenPlaats = ((quoot6 - 1) - quoot5)
    sPlaats = Mid(Me.Filter, (quoot5 + 1), CharLenPlaats)
 
Echt, ik snap niets van je werkwijze. Eerst laat je, op basis van drie componenten, een filter samenstellen. Werkt prima.
Vervolgens ga je die string weer uit elkaar trekken? Waar is dat voor nodig? Bovendien: je hébt de losse delen al!

Code:
Me.Filter = "[sGefilterdeAdres] = """ & Me.Keuzelijst7 & """" _
        & " AND [o_Huisnummer] = """ & Me.Keuzelijst7.Column(1) & """" _
        & " AND [o_Plaats] = """ & Me.Keuzelijst7.Column(2) & """"""

Doe het dan zo:
Code:
sAdres =  Me.Keuzelijst7 
sHuisnummer = Me.Keuzelijst7.Column(1) 
sPlaats = Me.Keuzelijst7.Column(2)
Me.Filter = "[sGefilterdeAdres] = """ & sAdres & """" _
        & " AND [o_Huisnummer] = """ & sHuisnummer & """" _
        & " AND [o_Plaats] = """ & sPlaats & """"""
Ik zie de noodzaak van jouw constructie echt niet...
 
Laatst bewerkt:
Het eerste deel van je tweede oplossing, de losse elementen, had ik niet meegekregen en ben met materie verder gegaan. Dat de oplossing zo eenvoudig is, had ik niet door. Super bedankt en ik kan weer verder. Het werkt als een speer.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan