UItbreiden code

  • Onderwerp starter Onderwerp starter Risk
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.
Als je niet alle aanwijzingen opvolgt, krijg je uiteraard maar een half resultaat :D

Dus na het leegmaken van de keuzevelden moet je de functie nog een keer aanroepen

Dus zoiets zou moeten werken:

Code:
Private Sub Reset_Click()
    Me.cboHandeling = ""
    Me.cboAfdeling = ""
    Me.cboJaar = ""
    Me.cboLadingsoort = ""
    Me.cboVervoerd = ""
    Call FilterMaken
    Me.Requery
End Sub
 
Michel,

Dit werkt Perfect.

In mijn enthousiasme met allerhande sorteringen viel een ding mij later pas op.

Ik voer een selectie op jaar: resultaat juist bijv. 2009 met alle afdeling in 2009
Ik voer een selectie op een specifieke afdeling dan keren de jaren terug.

Ik gebruik de door jou aangepaste code betreffende dit deel:

Code:
If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar
If Me.cboAfdeling & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = "[Afdeling] = '" & Me.cboAfdeling & "'"
End If

Nu heb ik wat zitten priegelen en toen ging het goed

Als ik jaar sorteer en daarna afdeling gaat het goed. Ook in de overige comboboxen

Sorteer ik sec op afdeling:

Foutmelding 3075
Syntaxfout (Operator ontbreekt) in query expressie AND [Afdeling] = "Noord" (en noord is een afdeling).

De foutopsporing in Access geeft aan dat iets verkeerd zit (gearceerd in geel): Me.Filter = sFilter

Na een stevig aantal uren zoeken en doen, even het spoor bijster. Ik was al blij dat het werkte, totdat ik sec op afdeling een sortering deed.

Nieuwe code (zelf aangepast:

Code:
If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar
    If Me.cboAfdeling & "" <> "" Then
        sFilter = sFilter & " AND [Afdeling] = '" & Me.cboAfdeling & "'"
    End If

De gehele code:

Code:
Function FilterMaken()
Dim sFilter As String
If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar
    If Me.cboAfdeling & "" <> "" Then
        sFilter = sFilter & " AND [Afdeling] = '" & Me.cboAfdeling & "'"
    End If

If Me.cboHandelingen & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Handelingen] = '" & Me.cboHandelingen & "'"
End If

If Me.cboLocatie & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Locatie] = '" & Me.cboLocatie & "'"
End If

If Me.cboRijfout & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Rijfout] = '" & Me.cboRijfout & "'"
End If

If sFilter <> "" Then
    Me.Filter = sFilter
    Me.FilterOn = True
Else
    Me.Filter = ""
    Me.FilterOn = False
End If

End Function
 
Laatst bewerkt:
Ik heb jouw db niet dus kan ik niet testen of e.e.a. bij jou wel of niet werkt. Mijn code zou, als je er goed over nadenkt, probleemloos moeten werken. Waarom werkt hij wel bij Handeling, maar niet bij Afdeling? De techniek is hetzelfde: je kijkt eerst of er een string in het filter staat (met If sFilter <> "" ) en als als die bewering waar is (er staat dus een voorwaarde in het filter) dan moet het woord AND toegevoegd worden aan het filter. En die check doe je bij alle nieuwe filters. De code werkt, want dat constateer je bij Handeling. Hij werkt niet bij Afdeling, en dat betekent dus dat er in de voorgaande stap iets in het filter wordt gezet, want het filter is niet leeg. Ergo: daar moet je dus wel degelijk naar kijken. Je hebt een workaround, maar je probleem bestaat nog steeds...
 
Michel,

Jou kennis gaat veel verder dan die van mij. Ik moet het hebben van plakken, knippen en advies.

Waarom werkt het als ik in andere velden iets invul dan wel om ook het jaar te selecteren en niet als ik in afdeling (de kolom naast jaar) een afdeling kies en dan het jaar? Dan komen alle jaren die betrekking hebben op de afdeling te voorschijn.

Waarom denk ik is de code met Jaar anders dan de andere cbo?
Code:
If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar

Zou daar ook AND tussen gezet moeten worden??

Misschien zie je het alsnog.

Risk
 
Als je een filter gaat opbouwen, maak je hem eerst leeg (zeker als het een publieke variabele is) met sFilter="". Daarna ga je de verschillende elementen opbouwen. Logischerwijze begin je dan met de eerste waarde die je tegenkomt, in jouw geval is dat cboJaar. Dezelfde logica die zegt dat je met de eerste voorwaarde begint, verklaart ook dat je filter dan nog leeg is. Je begint immers met de eerste voorwaarde. Er kan dus nooit iets in het filter staan op dat moment. En daarom hoef je dus ook niet te checken of het filter leeg is of niet. Er kan, omdat het filter dus altijd leeg is bij het begin, nooit een AND nodig zijn bij de eerste voorwaarde!
Kijk je naar de tweede filterwaarde, dan is het verhaal heel anders: nu kan er wel degelijk iets aan het filter zijn toegevoegd: Jaar namelijk. En daarom moet je nu wèl checken of het filter leeg is of niet. Is het filter niet leeg, dan heb je het AND argument nodig om de twee voorwaarden aan elkaar te knopen. En dat geldt uiteraard voor alle volgende voorwaarden.

Daarom zei ik ook dat je de procedure nog eens moet bekijken, want als je geen jaar kiest, dan moet het filter leeg zijn als je aan de tweede voorwaarde begint. En omdat je dus een AND krijgt als begin van je filterstring, gaat er iets verkeerd met die keuzelijst (vermoed ik). De oplossing is dus niet een workaround maken, zoals je gedaan hebt, maar de oorzaak van het probleem wegnemen!
 
Michel,

Probleem is opgelost. Na veel gezoek en nog eens proberen vanaf scratch vond ik de oplossing in:

Code:
If Me.cboJaar & "" <> "" Then
    sFilter = "[Jaar]=" & Me.cboJaar
    If Me.cboAfdeling & "" <> "" Then
        sFilter = sFilter & " AND [Afdeling] = '" & Me.cboAfdeling & "'"
    End If
Else
    If Me.cboAfdeling & "" <> "" Then
        sFilter = "[Afdeling] = '" & Me.cboAfdeling & "'"
    End If
End If

Ik heb jou bewerkte code gekopieerd en daarin zat dus niet het statement Else...

Dit erin geplakt en tot mijn verbazing werkte het.

Weer veel geleerd. Dank voor je altijd snelle support.

Om nu met de gegevens een rapport te maken is de volgende klus. Weet jij een topic dat ik kan vinden?

Nogmaals dank.

Risk
 
Ik gebruik mijn eigen code ook, en daar hoort geen Else in.... Kortom: je hebt het probleem nog steeds niet getackeld! Dat betekent, dat je keuzelijst cboJaar en/of cboAfdeling nog steeds verkeerde waarden afgeeft. Je kunt dat ondervangen zoals je gedaan hebt, maar een structurele oplossing is dat niet, in mijn ogen. Je moet streven naar foutloze code, en naar correct werkende keuzelijsten. Anders kom je het probleem nog wel een keer tegen.
Nogmaals: aan mijn code makeert niks, en hij werkt bij mij ook prima. Doet-ie het bij jou niet, dan ligt het dus aan jouw bronnen :)

Code:
Function FilterMaken()
Dim sFilter As String
If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar
Eerst de keuzelijst uitlezen. Als de keuzelijst (met een lege string) niet leeg is, dan de waarde toewijzen aan het filter.
Code:
If Me.cboAfdeling & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
Controleren of de keuzelijst Me.cboAfdeling + lege string leeg is of niet. Als er een waarde is geselecteerd, kijk je of er in de variabele sFilter een string staat. Als dat zo is, dan is er dus een jaar geselecteerd in de eerste stap. Dat houdt automatisch in, dat het filter moet worden uitgebreid met het argument AND. Dit gebeurt dus alleen als sFilter leeg is! Krijg je toch het woord AND in je string zonder dat er een jaar is geselecteerd, dan is de string niet leeg. En dat hoort dus niet...
Code:
    sFilter = "[Afdeling] = '" & Me.cboAfdeling & "'"
End If
Vervolgens breid je het filter uit met de variabele cboAfdeling. En daarna herhaal je de procedure voor de overige keuzevelden.
Code:
If Me.cboHandeling & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Handeling] = '" & Me.cboHandeling & "'"
End If
Als laatste zet je, als het filter niet leeg is het filter aan, en anders zet je het filter uit.
Code:
If sFilter <> "" Then
    Me.Filter = sFilter
    Me.FilterOn = True
Else
    Me.Filter = ""
    Me.FilterOn = False
End If
End Function
Veel makkelijker kun je het filter niet opbouwen, en je hebt er verder geen ELSE .. THEN voor nodig.
 
ichel,

Dank nomaals voor je heldere uiteenzetting.

Ik heb een kleine Database gemaakt met jou filter. Daarin werkt het.

Ik ga de fout zoeken, ben voorlopig geholpen met beide oplossingen. Voor een demoversie is het prima met mijn oplossing. Als alles werkt bouw ik een nieuwe structuur van de database (waarin ik oefen is echt een werkdatabase). Moet het lukken.

Volgende project: hoe print ik e.e.a. uit. Ga mij eens verdiepen in jou Filteren_v1 Kom ik ongetwijfeld weer hobbels tegen.

Met dank voor alle hulp.

Risk
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan