<>= tekens gebruiken bij selectie in doorlopend formulier

Status
Niet open voor verdere reacties.
Bedankt OctaFish,:thumb:

Dit is stukje code is zeker bedoeld om eerst het filter leeg te maken voordat hij het filter opbouwt, want er kan nog een filter in het geheugen staan.
Code:
strFilter = ""

De rest van de code begrijp ik ook niet volledig. Wordt toch snel tijd om maar een cursus te gaan volgen.:d

Kan eigenlijk het DoCmd.OpenForm ook gebruikt worden als het formulier al geopend is?
Het werkt, dus ik denk zelf van wel, maar soms zijn er logischer oplossingen voor handen.

Nu kan ik een selectie maken door de keuzelijst, maar kan het ook met selectievakjes?
Of maak je het dan onnodig ingewikkeld.
 
Ad 1: Het filter wordt nu als algmene variabele gedeclareerd, vandaar dat hij geldig blijft binnen de module. Dat houdt in, dat hij eerst moet worden geleegd, want anders wordt het nieuwe filter toegevoegd aan het vorige Met sfilter=sfilter & ....). En dat wil je meestal niet.
Ad 2:Ja, dat kan. Access opent een formulier standaard maar één keer, en als hij al is geopend, wordt het formulier geactiveerd i.p.v. geopend.
Alles kan, dus selectievakjes zal ook zeker kunnen :) Kijk eens in mijn voorbeeldje, zou ik zeggen!
 
Heb wat gepuzzeld met wat code wat ik denk nodig te hebben.
Alleen krijg ik het niet aan elkaar gepuzzeld.

Code:
strSQL = "SELECT DISTINCT * FROM " & tbl_Debiteuren & " WHERE [Selectie] =-1"
    With CurrentDb.OpenRecordset(strSQL)

Dan denk ik deze code nog nodig te hebben
Code:
If Len(strFilter) <> 0 Then strFilter = strFilter & " OR "
        strFilter = strFilter & "[DebiteurID]=" ??????

En voor de rest kom ik geen stap verder :evil:

En om na het uivoeren van het rapport de waarde weer op false te zetten:
Code:
strSQL = "UPDATE " & tbl_Debiteuren & " SET [Selectie] = 0"

KAn je nog wat advies geven OctaFish?
 
Voordat je de recordset opent, moet je de filters samenvoegen. Dus iets als:

Code:
If Len(strFilter) <> 0 Then strFilter = strFilter & " OR "
        strFilter = strFilter & "[DebiteurID]=" Me.cboFilter
End If

sFilter=sFilter & " AND [Selectie] =-1"

Daar moet je dus een beetje mee spelen...
 
Maar hoe kan je dan het filter herhalen?
Dat hij de geselecteerde regels 1 voor 1 afloopt en opbouwt als filter.


Wat doet een recordset eigenlijk?
 
Die heb je er zelf bij gehaald.... Een recordset gebruik ik meestal om een keuzelijst te vullen met waarden, of om velden in een tabel bij te werken. Bij filters heb je ze doorgaans niet nodig, omdat de recordset al op het formulier is geïnitialiseerd (door een tabel of query aan een tabel te koppelen). Een filter herhaal je ook niet, dat stel je in...
 
Had veel gezocht en zag iedere keer, als het een beetje in de buurt kwam van mijn vraag, dat recordset genoemd werd in de code.

Ik snap dat je het filter niet herhaald, alleen hoe bouw je het filter dan op met selectievakjes als 1000 or 1004 or 1005.

Bij een keuzelijst gebruik je dit:
Code:
For Each Keuze In lstSelecteerklant.ItemsSelected()
Code:
Next Keuze

Maar wat gebruik je als je het filter wil opmaken doormiddel van selectievakjes?
 
Een selectievakje heeft de waarden o of -1, dus daar selecteer je dan op. Je filter wordt dan iets als: sFilter=sFilter & " AND [JouwSelectieveld] = -1"
 
Goedemorgen OctaFish,
Met het stukje code heb je me vrijdag al mee geholpen.

Code:
If Len(strFilter) <> 0 Then strFilter = strFilter & " OR "
        strFilter = strFilter & "[DebiteurID]=" Me.cboFilter
End If

sFilter=sFilter & " AND [Selectie] =-1"
Maar hoe krijg je het voor elkaar dat hij het debiteurnr van het aangevinkte record meeneemt en dan het volgende aangevinkte record en verbind met OR. enz. enz.
Weet niet of we elkaar helemaal begrijpen, anders hoor ik het wel.
Bedankt alvast voor al je hulp
 
Ik denk inderdaad dat we langs elkaar heendenken.... ik snap niet helemaal waar je naar toe wilt. Je wilt records selecteren op basis van een selectievakje, maar je wilt dan uit die selectie de Debiteurnummers uitlezen? Is dat het?
 
Met onderstaande code heb je me geholpen, hiermee kan ik meerdere debiteuren selecteren en het formulier filteren.

Code:
Option Compare Database
Dim strFilter As String

Private Sub cmdFilter_Click()
    DoCmd.Close acForm, Me.Form.Name
    DoCmd.OpenForm "frm_OmzetOverzicht", acNormal, , strFilter
    
End Sub

Private Sub lstSelecteerklant_AfterUpdate()
Dim Keuze As Variant
strFilter = ""

    For Each Keuze In lstSelecteerklant.ItemsSelected()
        If Len(strFilter) <> 0 Then strFilter = strFilter & " OR "
        strFilter = strFilter & "[DebiteurID]=" & lstSelecteerklant.Column(0, Keuze) & ""
    Next Keuze

End Sub

Toen vroeg ik: is het zelfde ook mogelijk op een doorlopend formulier doormiddel van selectievakjes aanvinken.
Meerdere selectievakjes (debiteuren) aanvinken waarop het formulier gefiltert kan worden.
Dit was mogelijk, zoiets stond in je voorbeeld bestandje.
Alleen kom ik er niet echt uit.
 
Ik snap nog niet helemaal hoe je de selectievakjes wilt gebruiken; in mijn voorbeeldje zit het selectievakje extra in de tabel; dat is eigenlijk ook de enige optie, want als je een niet-gebonden selectievakje maakt, kun je dat alleen aan- of uitzetten voor alle records. Je moet de gekozen waarde dus opslaan in je tabel. En als je dat doet (een extra veld gebruiken) hoef je de Debiteurnummers niet meer te selecteren, want de selectie doe je op het selectieveld.
 
Heb het voorbeeldje bijgevoegd in access 2003 indeling.

Als je frm_Omzetoverzicht opent staan er 2 knoppen:
Zoek klant 1 opent een keuzelijst met debiteuren om te filteren.
Zoek klant 2 opent het doorlopend formulier met debiteuren.

In zoek klant 1 selecteer je de regel door erop te klikken en in zoek klant 2 moet je een vinkje plaatsen. Kan je met zoek klant 2 ook het formulier net zo filteren als zoek klant 1.
 

Bijlagen

Soms is het echt simpel, maar denk je te moeilijk. :o
Bedankt voor je inzet OctaFish :thumb:
 
Code:
Option Compare Database
Dim strFilter As String

Private Sub cmdFilter_Click()
    DoCmd.Close acForm, Me.Form.Name
    DoCmd.OpenForm "frm_OmzetOverzicht", acNormal, , strFilter
    
End Sub

Private Sub lstSelecteerklant_AfterUpdate()
Dim Keuze As Variant
strFilter = ""

    For Each Keuze In lstSelecteerklant.ItemsSelected()
        If Len(strFilter) <> 0 Then strFilter = strFilter & " OR "
        strFilter = strFilter & "[DebiteurID]=" & lstSelecteerklant.Column(0, Keuze) & ""
    Next Keuze

End Sub

Bij uitvoeren van deze code wordt het formulier frm_OmzetOverzicht gefilterd.
Heb op frm_OmzetOverzicht een knop met filter uit hier staat deze code achter.
Code:
strFilter = ""
me.requery
Dit werkt,hierdoor wordt het filter opgeheven en zie ik alle records op mijn formulier.
Alleen als ik dan opnieuw wil filteren op jaar, periode of debiteurid op frm_OmzetOverzicht gebeurt er niks.

Heeft iemand een idee?
 
Lijkt mij logisch; het filter wordt opgebouwd op basis van je keuzelijsten. In je code laat je alleen de code zien voor de keuzelijst Klant; die wordt opgebouwd als je een klant kiest. Verander je niks in je keuzelijst(en), dan maak je ook geen nieuwe filterstring. Sluit je het formulier frm_OmzetOverzicht wel af, voordat je opnieuw filtert?
 
Deze versie doet het in ieder geval...
 

Bijlagen

frm_OmzetOverzicht wordt niet afgesloten.
Als ik gefilterd heb op meerdere debiteuren en druk op filter_uit worden alle records getoond, dat is goed.
Alleen wil ik vervolgens op jaar of maand filteren op frm_OmzetOverzicht dan gebeurt er niks.
Dit alleen als ik frm_OmzetOverzicht opnieuw opent.
 
Ook niet in die van mij? Want ik heb geen probleem met filteren of filter leegmaken...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan