UItbreiden code

  • Onderwerp starter Onderwerp starter Risk
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Risk

Gebruiker
Lid geworden
5 jul 2010
Berichten
275
Forum,

Ik heb een code in een formulier geplaatst die selecties uitvoert op jaar en afdeling. Ik wil deze uitbreiden en dacht slim even wat te kopi�ren,maar dat lukt niet. Ik maakte een kopie van Private sub etc.... (rood)

Daarn koieerde ik onder Function FilterMaken() Dim sFilter As String de codes met Afdeling en veranderde dat in Handeling.

Helaas foutmeldingen.

Wat doe ik fout. Als ik de techniek begrijp kan ik mijn formulier analyse uitbreiden met nog 2 zoekcriteria.


Met dank

Risk


Code:
Option Compare Database


Private Sub cboAfdeling_AfterUpdate()
    Call FilterMaken
End Sub

Code:
Private Sub cboJaar_AfterUpdate()
Call FilterMaken
End Sub

Code:
Private Sub cboHandeling_AfterUpdate()
Call FilterMaken
End Sub


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
Else
    If Me.cboAfdeling & "" <> "" Then
        sFilter = "[Afdeling] = '" & Me.cboAfdeling & "'"
    End If
End If

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

End Function

Private Sub cboChauffeur_AfterUpdate()
    Call FilterMaken
End Sub
 
Laatst bewerkt door een moderator:
Welke foutmeldingen?

Zet je code tussen codetags a.u.b. (is knopje met het # teken). Dat leest wat makkelijker.
 
Laatst bewerkt door een moderator:
Dank voor de snelle reactie. Excuus voor mijn vergeten # moet nog oefenen. Je ziet mijn lekenkennis.

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

Verander Afdeling in Handeling. Dan gaat het fout.

Ik Krijg o.a. End If

Je zou zeggen keurig doorgewerkt, maar helaas.
Risk
 
Laatst bewerkt door een moderator:
Bij de If van Me.cboJaar ben je aan het einde van de statement een End If vergeten. De End If boven Else mag je verwijderen. Bij de If Me.cboAfdeling mag je aan het eind 1 End If verwijderen.
 
Ik heb de code een beetje aangepast, zodat hij wat makkelijk is aan te passen. De functie ziet er nu zo uit:

Code:
Function FilterMaken()
Dim sFilter As String

If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar
If Me.cboAfdeling & "" <> "" Then
    If sFilter <> "" Then sFilter sFilter & " AND "
    sFilter = sFilter & "[Handeling] = '" & Me.cboHandeling & "'"
End If

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

End Function

Ik heb als keuzelijst cboHandeling gebruikt; heb je zelf een andere naam, dan moet je die uiteraard nog aanpassen. Een veelgebruikte conventie is om keuzelijsten met Invoervak de prefix cbo te geven, en gewone keuzelijsten de prefix lst. Textvakken krijgen dan bijvoorbeeld de prefix txt. Niet dat je dat verplicht zou moeten doen, maar iedereen snapt gelijk waar je het over hebt als je het wel doet.
Het stuk vanaf de tweede IF (If Me.cboAfdeling & "" <> "" Then) kun je nu eenvoudig kopieëren als je meer keuzelijsten wilt toevoegen.

En de knop Code (#) heb je ook nog niet ontdekt zag ik :) Wat mij betreft pas je de eerste post nog wel aan, en maak je de code alsnog op met de Code knop. Wat ik zelf meestal doe (dan kan ik in het snelscherm blijven is de code tag er voor typen. Je typt dan [ code ] aan het begin (zonder de spaties trouwens, maar dat moet even omdat de code anders gelijk in werking treedt) en aan het eind typ je [ /code ]. Dan staat alles tussen de codes gelijk goed.
 
Michel en gast0224

Deze code werkt. Ik kan dus selecteren binnen jaar en afdeling. Wat ik er tussen wil hebben is Handeling en eventueel nog een paar.

De oplossingen kreeg ik niet aan de praat. Misschien met rood even aangeven hoe en wat.

Als altijd mijn dank.
Risk (ex Access2010)

Code:
Private Sub cboAfdeling_AfterUpdate()
Call FilterMaken
End Sub

Private Sub cboJaar_AfterUpdate()
    Call FilterMaken
End Sub


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
Else
    If Me.cboAfdeling & "" <> "" Then
        sFilter = "[Afdeling] = '" & Me.cboAfdeling & "'"
    End If
End If

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

End Function
 
Ik blijf toch bij mijn (nieuwe) versie...

Code:
Function FilterMaken()
Dim sFilter As String

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

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

End Function
Zoals ik al zei: veel makkelijker uit te breiden...
 
Michel,

Ik geloof je onmiddellijk, maar net toe ik het probeerde: Compileerfout: Sub, Function of Property verwacht. Het sFilter wordt door Access gearceerd.

Code:
Function FilterMaken()
Dim sFilter As String

If Me.cboJaar & "" <> "" Then sFilter = "[Jaar]=" & Me.cboJaar
If Me.cboAfdeling & "" <> "" Then
    If sFilter <> "" Then [COLOR="blue"]sFilter[/COLOR] sFilter & " AND "
    sFilter = "[Afdeling] = '" & Me.cboAfdeling & "'"
End If
If Me.cboHandeling & "" <> "" Then
    If sFilter <> "" Then sFilter sFilter & " AND "
    sFilter = sFilter & "[Handeling] = '" & Me.cboHandeling & "'"
End If

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

End Function

Ergo: het werkt helaas nog niet.
 
Laatst bewerkt:
Michel

If sFilter <> "" Then sFilter sFilter & " AND "
Ik heb er een = teken tussen gezet en het werkt nu wel.

Risk
 
Michel,

Het gedeelte jaar werkt nu niet zo lekker als de andere 2.

Nieuwe vraag:
een reset knop??
en kan ik de gegevens overzetten naar een rapport anders dan met de printknop in het formulier, dus naar een echt rapport, of gaat mijn gedachte nu te ver?

Met groet,

Risk.
 
Soms maak je een foutje met kopieren....

Code:
Function FilterMaken()
Dim sFilter As String

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

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

End Function

Wat betreft je andere vragen: een reset knop is niet zo moeilijk: gewoon alle tekstvakken of comboboxen weer leeg maken doe je zo:
Code:
Me.cboHandeling=""
En dat voor alle zoekvelden.
Als je een filter wil overzetten naar een rapport, dan kan dat uiteraard ook. Daar zijn verschillende trucjes voor, die regelmatig behandeld worden op het forum.
 
Laatst bewerkt:
Michel,

Dank.
Wat ik met de reset bedoelde is dat alles weer terug gaat naar de complete lijst. Ik kwam daarop omdat inde cbo van "Handeling"er een wit vlakje verschijnt boven het eerste argument. Als ik daarop klik dan komen alle velden weer tevoorschijn. Het gekke is dat ik dat bij Jaar en Afdeling niet heb. Daar staan de eerste waardes vanuit de cbo direct bovenaan.

Als ik dus alles wil "resetten" moet de gehele ongesorteerde (of geselecteerde zo je wilt) lijst weer verschijnen om van daaruit weer nieuwe selecties te maken.

Nu wist alleen de invoer, hetgeen ook netjes is voor een gebruiker.

Ik hoor graag.

Dank als altijd,

Risk
 
En dat doe je door de keuzelijsten weer leeg te maken. Dat je bij Handeling wel een 'leeg vakje' ziet komt vermoedelijk doordat je een niet-ingevuld record in de tabel hebt. De andere tabellen hebben dat niet. Ik zou er zelf voor zorgen dat het verdwijnt, niet dat de anderen hem ook krijgen.
 
Michel
Vakje is inderdaad weg. Rest zoals gemaakt n.a.v. jou opmerking geeft niet de hele keuzelijst terug. Alleen de invoer wordt gewist.

Risk
 
?? Filteren doe je op basis van niet-gebonden selectievakjes en keuzelijsten. Die moeten m.b.v. de code geleegd worden, maar de keuzelijst moet uiteraard daarna wel de waarden laten zien die in de Rowsource zitten.
 
Michel,

Waar. Alles gaat keurig op leeg en je kunt weer selcteren.

Ik herinner mij een post van jou filteren_v1.mdb waarin je een prachtig selectieformulier geeft met een resetknop die alles weer terug brengt in de lange lijst. Heb in de code gekeken (bewaar dit soort items) maar dat is even iets te hogere wiskunde voor mij.

Dat bedoel ik dus met een reset. Wat ik er nu van gemaakt heb als knoptekst is invoer wissen. De lijst komt pas weer terug als ik restart. Dat is dus niet netjes.

Risk.
 
Als je een filter verwijdert, heb je er niet genoeg aan om alleen de selectievakjes leeg te maken, je moet ook het filter verwijderen van het formulier. Dat doet de functie FilterMaken ook. Dus na het leegmaken van de keuzevelden moet je de functie nog een keer aanroepen, en nog een Requery uitvoeren op het formulier.
 
Michel,

Requery?? Men wordt steeds wijzer.

Code:
Private Sub Knop398_Click()
DoCmd.Requery "?????"

End Sub

Heb geen idee wat ik moet invullen om dit te laten werken. Nooit van gehoord.

Risk
 
Als je de opdrachten hebt laten uitvoeren zet je nog één regel bij de knop (niet wat een aparte knop, wat je zo te zien nu gedaan hebt, maar bij de code die de keuzelijsten schoont)
Me.Requery
of Me.Form.Requery
 
Michel,

Beide werken niet. Ben ik erg dom als ik het niet snap waarom het niets doet anders dan de keuzelijsten legen?

Code:
Private Sub Reset_Click()
Me.cboHandeling = ""
Me.cboAfdeling = ""
Me.cboJaar = ""


Me.cboLadingsoort = ""
Me.cboVervoerd = ""
Me.Requery
End Sub
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan