Selectie via keuzelijsten op formulier

Status
Niet open voor verdere reacties.

Friend

Verenigingslid
Lid geworden
31 jan 2009
Berichten
1.128
Beste forumleden,

In de voorbeeld database maak ik via het formulier "frmSelectieKeuze" een selectie van welke records ik wil openen in het formulier "frmSelectie".
Nu moet ik alle drie selecties invullen : jaar, maand, status.

Graag zou ik als één of meedere niet worden ingevuld ik toch van de selectie die wel is ingevuld de records krijg.

Bv ik voer alleen het jaar in en verder niet. Dat ik dan toch bv het ingegeven jaar 2023 krijg. Of Bv jaar en maand. of maand en status etc.
Hoe is dit te verwezenlijken?

Friend
 

Bijlagen

  • testselectie.rar
    43 KB · Weergaven: 23
Is niet zo moeilijk, als je je filter modulair opbouwt. Dus vóórdat je het filter aanmaakt voor een keuzelijst eerst controleert of hij wel gekozen is of niet. In het laatste geval: overslaan. Ik kijk er morgen wel even naar.
 
OctaFish, dank je wel voor je reactie! Fijn dat je er naar wilt kijken, ben benieuwd hoe de oplossing is !
Is je computer thuis al weer up and running?
Mvrgr Friend
 
Sinds gisteren . De (hopelijk) definitieve versie staat nu thuis te draaien. En zonder problemen, dus me happy bunny :).
 
Tot je iets beters krijgt : hier heb je alvast een voorbeeld hoe het kan. Ik heb het bestandje wel iets eenvoudiger gemaakt door de de combo boxen uit de tabelstructuur van tblSelectie te halen en het formulier frmSelectie onmiddellijk op de tabel te baseren. De code onder de knop is aangepast naar:
Code:
Private Sub knpOpenForm_Click()
On Error GoTo Err_knpOpenForm_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "frmSelectie"
    stLinkCriteria = "1 = 1 "
    If Me.kzlJaar > 0 Then stLinkCriteria = stLinkCriteria & " and jaar = " & Me.kzlJaar
    If Me.kzlMaand > 0 Then stLinkCriteria = stLinkCriteria & " and maand = " & Me.kzlMaand
    If Me.kzlStatus > 0 Then stLinkCriteria = stLinkCriteria & " and status = " & Me.kzlStatus
    'Debug.Print stLinkCriteria
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    

Exit_knpOpenForm_Click:
    Exit Sub

Err_knpOpenForm_Click:
    MsgBox Err.Description
    Resume Exit_knpOpenForm_Click
End Sub
 

Bijlagen

  • testselectie_ng.zip
    102,7 KB · Weergaven: 20
Zonder te willen claimen dat mijn voorstel beter is, had ik het volgende bedacht voor onder de knop op frmSelectieKeuze.

Code:
Private Sub knpOpenForm_Click()
On Error GoTo Err_knpOpenForm_Click


    Dim stDocName As String
    Dim stLinkCriteria As String
    Dim AantalInSelectie As Integer


    If Not IsNull(Me.kzlJaar) Then
        stLinkCriteria = "jaar=" & Me.kzlJaar
    End If
    
    If Not IsNull(Me.kzlMaand) Then
        If Len(stLinkCriteria) > 0 Then
            stLinkCriteria = stLinkCriteria & " AND " & "maand=" & Me.kzlMaand
        Else
            stLinkCriteria = "maand=" & Me.kzlMaand
        End If
    End If
    
    If Not IsNull(Me.kzlStatus) Then
        If Len(stLinkCriteria) > 0 Then
            stLinkCriteria = stLinkCriteria & " AND " & "status=" & Me.kzlStatus
        Else
            stLinkCriteria = "status=" & Me.kzlStatus
        End If
    End If
      
    If Len(stLinkCriteria) > 0 Then
        AantalInSelectie = DCount("*", "tblSelectie", stLinkCriteria)
    Else
        AantalInSelectie = DCount("*", "tblSelectie")
    End If
       
    If AantalInSelectie > 0 Then
        stDocName = "frmSelectie"
        DoCmd.OpenForm stDocName, , , stLinkCriteria
    Else
        MsgBox "Er zitten geen gegevens in de selectie", vbInformation, "Geen gegevens"
    End If


Exit_knpOpenForm_Click:
    Exit Sub


Err_knpOpenForm_Click:
    MsgBox Err.Description
    Resume Exit_knpOpenForm_Click
End Sub

Als je deze code gebruikt moet je uit qwrSelectie de criteria verwijderen. Dat wordt nu in de code geregeld.
 
NoellaG,

Heel hartelijk dank voor je reactie :thumb: en de mooie oplossing, met directe link naar de tabel!

Het werkt prima, dank je wel!

Friend
 
Peter,

Heel hartelijk dank voor je reactie:thumb: en mooie oplossing!

Het werkt prima, dank je wel!

Friend
 
Leuk dat een aantal mensen een oplossing geeft die vergelijkbaar is met het verwijderen van dode blaadjes uit een plant, maar het lijkt mij nuttiger om het probleem bij de wortels aan te pakken. En dat is: waarom zou je filteren op formulier A, en de resultaten bekijken op formulier B? Dat is a) onhandig, b) tijdrovend en c) lastiger te programmeren, en d) moeilijker in het onderhoud. Ik denk bijvoorbeeld aan de situatie dat je een filter maakt, het formulier opent en vervolgens een ánder filter wilt gebruiken. Moet je eerst het formulier sluiten, nieuw filter maken en formulier opnieuw openen. Laat ik het laten bij de opmerking dat ík dat bepaald niet handig vind!

Mijn oplossing is dus: wat is nu makkelijker dan de filters op formulier frmSelectie te zetten? Daarmee omzeil je alle genoemde problemen: je krijgt bij het openen gelijk alle beschikbare records te zien, en kunt dan naar hart en lust gaan filteren. Dat filteren doe je natuurlijk niet (alleen) op de tabellen tblJaar en/of tblMaand, maar altijd in combinatie met de tabel tblSelectie, omdat je (lijkt mij alleen waarden wilt filteren die in tblSelectie voorkomen. Waarom zou je een jaar filteren of een maand, die nog niet gebruikt is? Nutteloos...

Dan krijg je dus in de koptekst van frmSelectie drie extra keuzelijsten, waarmee je de gevraagde selecties kunt maken. Die filter je dan ongeveer zoals hierboven in de twee voorbeelden zijn aangegeven. Ik gebruik daarvoor een aparte functie:

Code:
Function Filteren()
Dim sFilter As String


    If Not IsNull(Me.cboJaar.Value) Then sFilter = "Jaar=" & Me.cboJaar.Value
    If Not IsNull(Me.cboMaand.Value) Then sFilter = sFilter & IIf(sFilter <> "", " AND ", "") & "Maand=" & Me.cboMaand
    If Not IsNull(Me.cboStatus.Value) Then sFilter = sFilter & IIf(sFilter <> "", " AND ", "") & "Status=" & Me.cboStatus
    With Me
        .Filter = sFilter
        .FilterOn = (Not sFilter = vbNullString)
    End With


End Function


En die start je vanaf je formulier met drie acties:
Code:
Private Sub cboJaar_Click()
    Filteren
End Sub


Code:
Private Sub cboMaand_Click()
    Filteren
End Sub


Code:
Private Sub cboStatus_Click()
    Filteren
End Sub


En om de keuzelijsten leeg te maken:
Code:
Function FilterWeg()

    With Me
        .cboJaar = Null
        .cboMaand = Null
        .cboStatus = Null
        .Filter = ""
        .FilterOn = False
    End With
End Function


Code:
Private Sub Knop16_Click()
    FilterWeg
End Sub
 
OctaFisch,

Hartelijk dank voor de uitgebreide uitleg en andere kijk op de zaak/oplossing:thumb:

Interessant om er ook op deze wijze naar te kijken en over na te denken.

Ben hem net zoals de 2 andere oplossingen in de proef database/formulier gaan zetten.

Een vraagje waar ik tegen aanloop als ik de cboJaar baseer op de tblSelectie is dat bv het jaar 2023 meerdere keren wordt weergegeven in de lijst omdat het betreffende jaar in meerdere records staat vermeldt.

Hoe kan ik in de cboJaar dit beperken dat ik maar 1x 2023 krijg in de lijst / unieke waarden?

Friend
 
Dat is een logisch probleem, dat je kunt ondervangen door de query aan te passen. Je maakt dan van SELECT … SELECT DISTINCT. En daarmee zie je de unieke waarden. Je kunt dat óók afdwingen in de Eigenschappen van de query. Als je dat wilt, kan ik mijn versie wel meesturen.
 
OctaFish, dank je wel!
Ja als je hem wilt sturen graag!
Dank je wel.
Friend
 
Het is inderdaad een handerige oplossing van OctaFish. Ik heb me bij mijn voorstel te veel laten leiden door wat er al was.

@OctaFish
Ik heb ook overwogen het zo te maken dat je alleen de waardes getoond worden die daadwerkelijk voorkomen in de tabel. Initieel is dat eenvoudig door alleen de unieke waardes uit de tabel te tonen. Had ik dus best mee kunnen nemen.
Het lijkt me echter pas echt zinvol als je ook rekening houdt met de criteria die al ingevuld zijn. Dus als je een jaar kiest mogen alleen nog de maanden getoond worden die bij dat jaar voorkomen in de tabel. Dat betekent dat je telkens als je een van de drie keuzes wijzigt de rijbronnen van de andere aan moet passen. Zal best kunnen maar ik ben er maar even mee gestopt het uit te vogelen. Als pleister op de wond heb ik maar ingebouwd dat je een waarschuwing krijgt als er geen gegevens zijn die aan de selectie voldoen. Iets dat in jouw voorstel ook voor kan komen (maar je wel meteen ziet).
 
… Het lijkt me echter pas echt zinvol als je ook rekening houdt met de criteria die al ingevuld zijn.
Beetje een open deur :). Zelf zou ik dat dus ook doen: in het filter rekening houden met de reeds gemaakte keuzes. Dat is wél wat meer werk, maar werkt uiteindelijk veel logischer, want je voorkomt combinaties die niet tot een resultaat leiden omdat ze een lege recordset opleveren. Omdat ik (nog steeds) niet betaald krijg voor HelpMij activiteiten, heb ik dat dus nog niet gedaan. Bovendien vind ik dus dat TS eerst zélf een poging moet ondernemen voordat ik een handje toesteek. Want het lijkt mij een stuk handiger als TS het zelf óók leert :).
 
Hierbij de database zoals ik 'm heb aangepast naar mijn ideeën. Dus nog zónder actieve filtering op keuzes in keuzelijsten. Iets dat je bijvoorbeeld zou kunnen oplossen met TempVars. Al gebruik ik zelf (tot nu toe dan) QueryDefs waarbij ik de SQL van de keuzelijsten aanpas.
Overigens vind ik aparte tabellen voor Maanden en Jaren érg overdreven :). Tenzij jullie meer maanden gebruiken dan de reeds bekende 12 :d.
 

Bijlagen

  • testselectie.zip
    44,4 KB · Weergaven: 17
Octafish,

Bijzonder dank voor al je werk en oplossingen.

Ik ga binnen mijn kennis dit inbouwen en gebruiken in mijn database.

Iets dat je bijvoorbeeld zou kunnen oplossen met TempVars. Al gebruik ik zelf (tot nu toe dan) QueryDefs waarbij ik de SQL van de keuzelijsten aanpas.

Dit is echter boven mijn "pet".

Overigens vind ik aparte tabellen voor Maanden en Jaren érg overdreven . Tenzij jullie meer maanden gebruiken dan de reeds bekende 12 .

Nee gelukkig hebben wij ook maar 12 maanden;)

Ben wel benieuwd hoe jij dit dan voor ogen hebt om dat in één tabel te combineren, als ik je goed begriipt.

Friend
 
Thx, voor dit prachtig voorbeeld hoe de geest van een programmeur werkt. Ik vind dit fascinerend en hoop dat jullie het niet erg vinden dat ik dit voorbeeld in mijn scrum cursus gebruik, anoniem natuurlijk.
 
Thx, voor dit prachtig voorbeeld hoe de geest van een programmeur werkt.
“No programmers were harmed during the making of this example”. Ik beschouw mezelf ook bepaald niet als programmeur, en mijn werkgever(s) ook al niet. Sterker nog: ik heb nooit ook maar één dag als programmeur gewerkt. Maar gebruik het gerust als voorbeeld. :d.
 
Ben wel benieuwd hoe jij dit dan voor ogen hebt om dat in één tabel te combineren, als ik je goed begriipt.
Nou, de járen haal je simpel uit de datums die je invoert. Dus het eerste record in tblSelectie bepaalt al de mogelijke keuzes in de keuzelijst cboJaar, met de functie Year([Datumveld]). Bij elk nieuw jaar komt er een waarde bij. Iets vergelijkbaars kun je doen met de keuzelijst cboMaand, want die bouw je op dezelfde manier op (Format([Datumveld];”mmmm”)).

Ik zal wat inbouwen in het voorbeeldje.
 
OctaFish, net thuis hele dag weggeweest. Mooie gedachte van NoellaG en een compliment voor jou toch.
Dank als je de aanvulling mbt het jaar en maand nog in het voorbeeld wilt verwerken. Zit zelf nog even te kijken hoe je het had over de cboKeuze lijst jaar en maand te baseren op TBZ Selectie en niet tblJaar cq tblMaand.
Friend
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan