Formulierfilter vast in een form

Status
Niet open voor verdere reacties.
@barrink:
Er zit wat vba achter de opzoekvakken, zoals je al had gezien. Bovendien zit er nog het e.e.a. op de onderliggende query, waar je naar moet kijken. Op een aantal velden zit daar een criterium, gebaseerd op het bijbehorende tekstveld uit uit formulier.
Daar zit nu een criterium in als:
Like [Forms]![OVERZICHT]![txtDOCOnderwerp] & "*"

Dat moet je veranderen in:
Like "*" & [Forms]![OVERZICHT]![txtDOCOnderwerp] & "*"

En dan is-tie fuzzie... En uiteraard ook voor de rest!
 
Ik neem aan dat alles gebaseerd is op de code in het formulier... ik hoe niets aan te passen aan de query of de tabel toch?

TE snel!.. srry.. ik ga het proberen! :)
 
Laatst bewerkt:
Met SelLength wordt het aantal karacters gegeven van de geselecteerde tekst.
Beter is het om te gebruiken:
Me(strControlName).SelStart = Len(Me(strControlName).Text)
 
Ik heb het nu toegepast op een veld... SYSSysteem..

in de query heb ik bovenstaand criteria toegevoeg... in het "zoekveld" bij key up en keydown de volgende gebeurtenisprocedure (zie onder).. er gebeurd echter niets.. zie wel heel even een zandloper....

Option Compare Database
Option Explicit
Public ctlCurrentControl As Control
Public strControlName As String

Private Sub txtSYSSysteem_Enter()

Set ctlCurrentControl = Screen.ActiveControl
strControlName = ctlCurrentControl.Name
Me.Test = strControlName

End Sub

Private Sub txtSYSSysteem_KeyDown(KeyCode As Integer, Shift As Integer)

Set ctlCurrentControl = Screen.ActiveControl
strControlName = ctlCurrentControl.Name

End Sub

Private Sub txtSYSSysteem_KeyUp(KeyCode As Integer, Shift As Integer)

Me.Form.Requery
Me(strControlName).SetFocus
Me(strControlName).SelStart = Me(strControlName).SelLength

End Sub
 
De regel
Me.Test = strControlName
zit er in om te controleren of het juiste tekstvak is geactiveerd; die zou dus, samen met het tekstveld Test, wegkunnen. Als je geen tekstveld Test hebt, loopt de procedure daar zowiezo op fout. Heb je het tekstveld wel, dan zou je, als je met de Tabtoets het veld
txtSYSSysteem selecteert, de naam van het selectieveldje in het veld Test moeten zien verschijnen.
De KeyDown doet in weze hetzelfde als de Enter procedure, en die wordt aangeroepen als je met de muis een tekstveld selecteert, en een letter intypt. Een veld met de muis selecteren activeert de Enter procedure niet, vandaar dat de Control naam op twee plaatsen wordt afgevangen.
De KeyUp zou moeten werken, als je de betreffende filtering ook in de query onder het formulier hebt gezet. Heb je alleen de tabel, dan gebeurt er inderdaad niks, je moet dan eerst op basis van de tabel een query maken, en de criteria regels instellen.
Ik ben overigens bezig om die procedure te veranderen, want op zich is het wel snel gemaakt zo, maar het is ook een beetje ondoorzichtig (had je al gemerkt...). Het lijkt mij netter om de volledige filtering via het formulier te sturen, met de commando's Me.FilterOn en Me.Filter. Daarmee hou je de volledige controle op het formulier, en blijft een query dus ook altijd werken, want hij is dan niet meer afhankelijk van het geopende formulier.
@Charles:
De tweede methode werkt uiteraard ook, maar ik heb nog niet geconstateerd dat de Selstart=Sellength het niet doet, dus dan vind ik het eigenlijk wel prima zo ;)
 
Laatst bewerkt:
Als ik een letter typ in 1 van de filtervelden, dan springt de cursor na invoer van een letter naar de 1e positie van het veld. Schakkel ik onderstaande code uit, door er een commentregel van te maken, dan kan ik gewoon door typen en wordt bij iedere invoer stapsgewijs gefilterd.

Code:
Me(strControlName).SelStart = Me(strControlName).SelLength
 
Hier een versie die gewoon de tabel als basis gebruikt, waarbij dus alle noodzakelijke handelingen op het formulier worden gedaan.
Er zijn twee varianten: een formulier met een keuzelijst, en een formulier met Keuzelijst met invoervak. De laatste variant is af, de eerste zit erbij om te laten zien hoe je met een gewone keuzelijst kunt filteren.
Je kunt overigens nog maar één filtering tegelijk toepassen; het combineren van filters moet ik nog doen. Dus dat wordt versie 1.8...

@Charles
De oplossing om de cursor te sturen met Len() werkt niet jofel als het tekstvak leeg is, of leeg wordt gemaakt. De lengte is dan Null, wat uiteraard problemen oplevert. Dus deze methode werkt wat mij betreft toch minder...
 

Bijlagen

De oplossing om de cursor te sturen met Len() werkt niet jofel als het tekstvak leeg is, of leeg wordt gemaakt. De lengte is dan Null,

Onzin!
In Len(Me(strControlName).Text) wordt de lengte bepaald van de Text-waarde, die kan niet Null zijn/worden, wel leeg met lengte 0. De Value-waarde die kan Null zijn

Het gebruik van SelLength is daarentegen onjuist omdat daar de lengte van de geselecteerde karacters wordt bepaald
 
@Harry:
Oh oh wat zijn we een kommaneukers.... De Value is Null, inderdaad. Petje af voor de vriendelijke opmerking...
 
Michel,

Voordat we allemaal vervelende woorden gaan gebruiken, het volgende

Mijn bijdrage van 9H14
>Met SelLength wordt het aantal karacters gegeven van de geselecteerde tekst.
>Beter is het om te gebruiken:
>Me(strControlName).SelStart = Len(Me(strControlName).Text)

was een reactie op Charles zijn bijdrage van 7H59

In dat licht gezien, is jouw opmerking van in jouw bijdrage van 10H53, naar mijn mening wat onzinnig.
Waarom?
Omdat er verschil is tussen:
Len(Me(strControlName).Text)
en
Len(Me(strControlName))

Me(strControlName).Text is altijd tekst, terwijl Me(strControlName) (is nl Value) van het type variant is.
Maar in het gebruik hier is er nog een ander groot verschil. De Value waarde wordt pas bijgewerkt na Afterupdate, terwijl de Text-waarde meteen bij intypen wordt bijgewerkt. De functie Len geeft dus andere waarden terug. Len(Me(strControlName).Text) dus het aantal letters dat is ingetypt.
Sellength zal in de meeste gevallen 0 zijn omdat er geen tekst geselecteerd is.

Mijn opmerkingen hebben dus niets te maken met het woord dat jij bezigt. Er is hier sprake van een essentieel verschil in het gebruik van de functie Len.
 
Laatst bewerkt:
@Harry:
In dat geval is het misschien handig als je duidelijk maakt waar je op reageert... En met woorden als Onzin! met een citaat van mij erbij, terwijl je dus reageert op een opmerking van Charles maak je mijn humeur ook niet beter...
Als ik er naast zit, dan mag je mij met alle plezier op mijn vingers tikken (graag zelfs), maar hou het constructief...
 
Ben ik weer!

En daar ben ik weer ;)

Was een tijdje weg voor mijn werk. Ik heb nog eens gekeken naar het bestand maar kom er echt zelf niet uit... Ik voeg nogmaals het bestand toe (beetje aangepast door mij).

Wat ik wil is boven elk veld (heb de velden veranderd) de mogelijkheid om te zoeken via een selectiemenu (het groene menu bovven onderwerp) en bij het onderwerp zoeken op woorden (zoals het blauwe veld nu). Beide mag natuurlijk ook als dat minder werk is! ;)

Verder vraag ik me af of het mogelijk is om die link (helemaal rechts) te vervangen door een button...

ik hoor het wel.. en alvast super bedankt voor de moeite!!!!

grt,
Erik
 

Bijlagen

Werp er een blik op!
 
Ik heb denk ik wel iets moois bedacht... De tekstvakken zijn nu afhankelijk van elkaar, dus de filtering op veld 1 wordt gebruikt in de volgende filtering, en vice versa. Er wordt elke keer een aangepaste filtering gemaakt op basis van de drie velden die je nu gebruikt.
Tevens wordt de filtering in het formulier nu gebruikt als bron voor de keuzelijst Onderwerp, zodat die alleen records laat zien in de actuele recordset.
Cool :cool:
 

Bijlagen

:) ziet er inderdaad cool uit!!!! mooi man! Als je dit nu voor alle velden kunt fixen ben ik helemaal blij!! hahaha

is het trouwens mogelijk om als het veld leeg wordt gemaakt alle records weer terug komen? Hoef je de knop "alles" niet te gebruiken.. maar die zit er wss ook niet voor niks.. haha
 
Ik heb deze variant zo gemaakt omdat je geen andere selectie-opties meer had; als je naar de code kijkt, wordt het er niet overzichtelijker op als je meer opties wilt gebruiken, maar het kan wel..
Kijk eens of je snapt wat er gebeurt, want dan kom je er denk ik wel uit!
 
OK..heb geprobeerd de knop te kopieeeren en dan wat te veranderen in de code.. maar dan geeft ie telkens een error... kan ik ergens de basics vandaan halen=
 
Dat hij na leegmaken van een tekstveld niet alle records laat zien, is mijn fout(je)... Ik had wel een check gemaakt op lege tekstvelden, maar hij kwam daar niet; hij sloot de routine gelijk af, zodat het filter a.h.w. op de laatste letter bleef staan, terwijl het tekstvak wel leeg was gemaakt. Je moet dus voor de drie zoekvakken de volgende aanpassing maken:

Code:
Private Sub [B][COLOR="Blue"]txtDOCOnderwerp[/COLOR][/B]_AfterUpdate()
On Error GoTo Stoppen
    
If Nz(Me.[B][COLOR="blue"]txtDOCOnderwerp[/COLOR][/B], "") = "" Then
    Me.Filter = ""
    Me.FilterOn = False
    Me.Requery
Else
    Call TekstFilter
End If

Stoppen:

End Sub
Je kunt de code bijna één op één overnemen voor de twee andere tekstvakken, alleen dus het filtervak veranderen. Zie de gekleurde tekst.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan