Uitleg codering?

Status
Niet open voor verdere reacties.

kruimeltjes

Gebruiker
Lid geworden
30 sep 2009
Berichten
222
Kan iemand mij uitleggen wat deze functie precies doet? Of misschien beter gezegd wat er wordt omschreven, wat dit doet weet snap ik.

Code:
Private Function CheckFilter(Optional Zoekveld As String, Optional Waarde As String)
Dim sFilter As String
Dim sFilters() As String, sTekst() As String
Dim ctl As Control
Dim sAndOr As String
Dim rst As Recordset
Dim iFltr As Integer

'Eerst de grootte van de matrix bepalen....
x = 0
iFltr = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
            iFltr = iFltr + 1
            On Error Resume Next
            If Not .Text = "" Then
                x = x + 1
                ReDim Preserve sTekst(x)
                sTekst(x) = .Text
            End If
        End If
    End With
Next ctl

'Als de tekstfilters leeg zijn, dan filter leegmaken en stoppen....
If x = 0 Then GoTo LeegFilter
'...... anders doorgaan, en matrix herdefiniëren.
ReDim sFilters(x, 3)

'Dan de variabelen vullen met gegevens
i = 0
x = 0
For Each ctl In Controls
    With ctl
        If LCase(Left(.Name, 9)) = "txtFilter" Then
            .SetFocus
''            MsgBox Asc(.Text)
                i = i + 1
            If Not sTekst((i)) = "" Then
                sFilters(i, 1) = .Tag
                sFilters(i, 2) = sTekst(i)
                sFilters(i, 3) = .Name
                x = x + 1
            End If
        End If
    End With
Next ctl

'Dan op basis van de variabelen het filter opbouwen
Select Case Me.fraOptie.Value
    Case 1
        sAndOr = " AND "
    Case 2
        sAndOr = " OR "
End Select

For i = LBound(sFilters) To UBound(sFilters)
    If LBound(sFilters) = UBound(sFilters) Then
        sFilter = "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
    Else
        sFilter = sFilter & "[" & sFilters(i, 1) & "] Like ""*" & sFilters(i, 2) & "*"""
        If i < UBound(sFilters) Then
            sFilter = sFilter & sAndOr
        End If
    End If
Next i

'Filter vervolgens op formulier toepassen.
Me.Filter = sFilter
Me.FilterOn = True

If Not Zoekveld = "" Then
    Me(Zoekveld).SetFocus
End If

Set rst = Me.RecordsetClone
With rst
    .Bookmark = Me.Bookmark
    Me!lblNavigate.Caption = "Record " & _
        .AbsolutePosition + 1 _
        & " of " & .RecordCount
    .MoveLast
    .MovePrevious
    If .RecordCount < 26 Then
        Me.ScrollBars = 0
    Else
        Me.ScrollBars = 2
    End If
End With

Exit Function

LeegFilter:
    Me.Filter = ""
    Me.FilterOn = False
    On Error Resume Next
    Me(Zoekveld).SetFocus

End Function

Groetjes,

Simone
 
Aangezien ik 'm gepost heb, zal ik het ook maar uitleggen ;)
Dit stukje is een onderdeel van de functie, zoals je uiteraard al gezien had. Wat hij doet, is eigenlijk simpel: om het mogelijk te maken om met verschillende al dan niet ingevulde tekstvakken op verschillende velden te kunnen filteren, moet je eerst weten welke tekstvakken zijn gevuld. De niet-ingevulde tekstvakken (en uiteindelijk dus de velden) wil je niet meenemen in het filter. Wat dit deel nu doet, is alle controls op het formulier doorlopen, en controleren of er iets ingevuld is of niet. Dat gebeurt met de regel If Not .Text = "" Then. Ik gebruik hier met opzet Text, en niet Value, omdat je de tekst 'live' uitleest, dus op het moment van typen. Met Value lees je de waarde uit het tekstveld als dat de focus niet meer heeft. Met .Text kun je dus real time filteren.
Op het moment dat de functie wordt opgestart, wordt het filter nog niet gelijk opgemaakt/ingesteld, omdat (zoals al gezegd) er lege tekstvakken in het filter kunnen zitten. Daarom wordt eerst voor elk gevuld tekstvak een extra regel aangemaakt in de matrix variabele sTekst. Vandaar de X=X+1, en sTekst(x)=.Text regels.

Samenvattend: dit deel van de routine vult dynamisch een matrixvariabele met de ingevulde tekst uit de filter tekstvakken.
In het vervolg wordt aan de hand van de matrix de rest van de filtergegevens opgehaald.
 
Oke vast een hele stomme opmerking maar in het bestand dat je geschreven hebt staat ook een functie module. Heb ik hieruit dingen nodig om een filter formulier te maken zoals jij hebt gedaan?

Groetjes,

Simone
 
Ik weet eerlijk gezegd zo snel niet welk uit bestand je de code hebt gehaald, maar zo uit mijn hoofd, dacht ik van niet. Overigens kun je dat snel controleren: als je de code hebt geplakt in een zoekformulier, en je kiest in het VBA scherm <Foutopsporing>, <Database compileren> controleert Access de code in je db. Als er een fout in zit, bijvoorbeeld een verwijzing naar een functie die niet bestaat, kom je daar zo snel achter. En die kopieer je dan alsnog naar een (nieuwe) module in je eigen db.
 
In deze db heb je geen extra modules nodig; ik combineer graag vragen van HelpMij in een db; dat zoekt bepaalde zaken wat makkelijker terug. Kijk maar eens of de extra functies nuttig voor je zijn of niet. In het laatste geval kun je ze uiteraard wegdoen.

Overigens heb ik het oorspronkelijke voorbeeld wat uitgebreid, zodat je nu ook kunt filteren op keuzelijsten (met invoervak). Het is nog een lopend projectje, want ik wil nog wat beter filteropties kunnen combineren, maar de verschillende zoekopties an sich werken prima. Ook is de hoofdroutine nu verbeterd, om de keuzelijsten te kunnen gebruiken.
 

Bijlagen

  • Filteren Uitgebreid.rar
    86,4 KB · Weergaven: 23
Oke toch nog wel een vraagje maar dan nu meer me betrekking op het formulier.

In jouw database OctaFish zie je in formulier ontwerp in de sectie details dat er maar 1 tekstvakje is voor iedere detail dat je wilt weergeven. Als je echter in gegevensblad mode kijkt dan zie je ineens heel veel tekstvakken. Ik heb gezocht maar kan niet vinden waar dat je dat kan instellen of hoe je dat gedaan hebt.

Tweede vraag gaat over de zoekcriteria; als je in jouw database ook maar 1 letter intikt zie je dat er gelijk gezocht wordt. Je kunt in mijn formulier hele verhalen tikken en enteren zoveel je wilt maar hij denkt ook bekijk jij het maar; doe het lekker zelf!

Ehhmm hoe heb je dat voor elkaar gekregen?

Groetjes,

Simone
 
Je eerste vraag is heel simpel: jouw formulier staat op <Enkelvoudig>; wil je meer records zien (en dat wil je in dit geval) dan moet je de Standaardweergave op <Doorlopend formulier> zetten. Daarbij zou ik nog wel wat aanpassingen aan de layout doen als ik jou was, want je verspilt nogal wat ruimte in de detailsectie.
De tweede vraag zal ik even moeten bekijken...
 
Er zitten een paar foutjes in jouw versie, waardoor hij inderdaad niet werkt.

1. Je hebt de naam van de filtervakken aangepast. Op zich mag dat uiteraard, maar je moet dan ook de checks in de vba code aanpassen:
If LCase(Left(.Name, 9)) = "txtFilter" Then
wordt dan:
If LCase(Left(.Name, 11)) = "txtCriteria" Then
En dat moet je overal vervangen waar de code wordt gebruikt. (typisch zo'n foutje waardoor je nu ineens een rode bam krijgt, vermoed ik ;) )

2. De tweede fout is wat ingrijpender, omdat het hele systeem is gebaseerd op een juiste invulling van de teksteigenschappen. Het probleem is, dat je bij de zoekvelden niets hebt ingevuld bij de <Extra Info> regel van de teksteigenschappen. En dat moet wel, want je moet per zoekvak wel aangeven op welk veld het filter moet werken. Laat je het leeg, dan gebeurt er dus niks. Ik heb er een plaatje bijgedaan voor de duidelijkheid.
Je moet dus voor elk zoekveld een verwijzing opgeven naar het veld dat het zoekveld moet filteren.
 
oke inderdaad een rode bam :eek: maar het werkt dat is goed nieuws. En inderdaad nu nog mijn layout aanpassen want er wordt bijzonder veel ruimte verspeeld!

Het vakje extra info is handig om er bij te hebben maar het is niet nodig om daarop te kunnen zoeken. dus dat zou weg kunnen. Maar het zou wel handig zijn als ik bij het printen van de gevonden zoekopdracht deze gegevens wel op het printje zou hebben staan.

Maar na de aanpassingen die ik tot nu toe heb gedaan kwam ik erachter dat als ik mijn zoekcriteria op and zet dat die begint te klagen dat er een parameter voor ZIScode moet worden opgegeven. Idee wat dat kan zijn? Ja ik dus nu wel, de ZIS code staat niet in de tbl_materials waarop het formulier is gebaseerd. Kan ik nu beter dan een query maken met alle gegevens die ik wil terug vinden daarin vermeld?

Ik zal mijn versie er nog even bij plakken

Bekijk bijlage Patientendatabase.part01.rar
Bekijk bijlage Patientendatabase.part03.rar
Bekijk bijlage Patientendatabase.part02.rar

Kan het trouwens zo zijn dat er in de SetFocus en de SelLenght wat fout staat bij mij? Hij loopt er soms op vast namelijk
 
Laatst bewerkt:
Het vakje extra info is handig om er bij te hebben maar het is niet nodig om daarop te kunnen zoeken. dus dat zou weg kunnen.
Wat bedoel je hier mee??? Het is namelijk niet 'handig om er bij te hebben', maar de motor waarop de hele procedure draait! Zonder ingevulde <Extra info>, geen zoekfunctie!
De regen dat de SelLength niet overal goed werkt, komt omdat je nog niet bij elk zoekveld de Setfocus regel hebt staan. Die is nodig om de SelLength en SelStart te kunnen bepalen.
Het veld ZIScode heb je inderdaad nodig als je daarop wilt kunnen zoeken. Vergeet ook niet om de veldnaam in de <Extra Info> te zetten. (de reden? zie mijn eerdere opmerking ;) )
 
oke ik denk dat ik dat eerste een beetje verkeerd geformulierd heb, ik bedoelde namelijk niet de extra info want dat heb ik netjes ingevuld. Ik bedoelde het vakje extra information.
Wat moet ik instellen bij de stefocus en sellenght dan want dat snap ik nog niet helemaal.

Groetjes,

Simone
 
Ik snap nog steeds niet wat je bedoelt met 'het vakje extra information'. Dat staat toch nergens op je formulier? Wel zag ik dat je de filtering op ZIS code verkeerd had gemaakt, en dat het bijbehorende veld ontbreekt. De SetFocus opdracht moet ook nog bij de tekstvakken worden gezet. Ik heb e.e.a. werkend gemaakt in je voorbeeld.
 

Bijlagen

  • Patientendatabase.part2.rar
    30 KB · Weergaven: 16
  • Patientendatabase.part1.rar
    100 KB · Weergaven: 20
Sorry voor het wat laat reageren maar er kwam weer van alles en nog wat tussen. Het vakje extra information stond oorspronkelijk wel op het formulier maar heb ik verwijderd later, wat dus zorgt voor extra veel verwarring sorry daarvoor.

Ik ga kijken naar wat je gedaan hebt, dank je wel alvast in elk geval.

Groetjes,

Simone
 
Alvast succes ermee! We zien de volgende vragen wel weer verschijnen ;)
 
En ja hoor daar ben ik weer! Duurde even voor ik hier weer aan kon werken maar heb het weer opgepakt. Goed ben dus achter een aantal dingen gekomen;

1. Een database maken kun je niet naast je gewone werk zomaar even doen
2. Sommige dingen snap ik nog steeds niet, hoe hard ik mijn best er ook voor doe
3. Selstart en Sellenght dat is waar ik in dit vraagstuk over struikel
4. Het maakt niet uit in welk zoekveld ik sta, mijn db zoekt altijd op PatientID wat ik dus niet wil
5. Maximum aantal tekens dat het zoekveld kan handelen is 4 (?)
6. Ik ben niet blond maar zo voelt het wel als ik aan de slag ga met visual basic

Oke zoals ik het dus begrijp moet ik de SelStart en de SelLenght ergens in mijn code definieren, met nadruk op ergens want ik zou absoluut niet weten waar wat natuurlijk absoluut niet opschiet.

Mag ik aub nog een klein, ehhh nee waarschijnlijk een grote duw, de goeie richting op?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan