subformulier filteren op basis van 3 keuzelijsten

Status
Niet open voor verdere reacties.

gotcha123

Gebruiker
Lid geworden
12 apr 2008
Berichten
86
Beste allen,

ik wil op een formulier (met subformulier) een filter laten toepassen op basis van 3 waarden die moeten ingegeven worden via een keuzelijst met invoervak, namelijk het schooljaar, het studiejaar en het geslacht.
Zodoende zou ik in mijn subformulier een aantal criteria moeten krijgen die enkel gelden voor deze criteria.

Op basis van de cursus (en wat zoekwerk op het internet) krijg ik het wel geregeld voor een filter op basis van 1 criterium, maar niet op basis van 3.

Welke optie is de gemakkelijkste om uit te voeren?
1) filter van keuzelijst op keuzelijst (vb. eerst het schooljaar ingeven, dan filter toepassen op volgende keuzelijst, dan studiejaar ingeven, terug filter toepassen en dan geslacht ingeven en als laatste filter toe te passen en uiteindelijk de juiste gegevens in mijn subformulier te krijgen.)

2) knop maken die de 3 waarden gebruikt om 1 keer te filteren.

Ik vermoed dat de 2e optie de meest efficiënte optie is, maar in beide gevallen weet ik niet hoe ik tot een oplossing moet komen.

Mijn database kan je vinden op volgende link: https://www.dropbox.com/sh/tcmp6xr6b7gq45u/enXAir0tYY
Het formulier waar het om gaat is frm_criteria_toevoegen_wijzigen


Alvast bedankt voor de hulp!
 
Laatst bewerkt:
We hebben op het forum wel een prima voorbeeldje staan waarmee je een interactief filter kunt maken. Al is die de laatste tijd niest meer voorbijgekomen, dus je moet zoeken in de wat oudere topics. Met de Zoetermeer 'dynamisch' 'formulier' 'filteren' kom je denk ik een heel eind. Anders kan ik het bestand vanavond wel posten.
Ik zou in ieder geval gaan voor een filter waarbij het niet uitmaakt welke combinatie je gebruikt of in welke volgorde. Dat maakt de procedure dan wel wat ingewikkelder. Maar hoe dat moet, zie je dus in dat voorbeeldje. ;)
 
volgens mij heb ik de thread gevonden, maar ik snap er niet te veel van eerlijk gezegd :-(
in het voorbeeld wordt gewerkt met tekstfilters (wat op zich niet zo'n groot verschil is), dus ik moet de benaming gewoon aanpassen van txtFilter naar cbo_schooljaar, zoals het in mijn geval is.
Maar het gebruik van de CheckFilter snap ik helemaal niet...en ik zie ook niet hoe ik de aanpassing kan maken naar mijn bestand...
 
Ik zal er vanavond even naar kijken. De essentie van de functie is, dat hij alle filters onafhankelijk bekijkt. Dat kan een tekstuele zijn, om te filteren op een willekeurige tekenares in een veld, of een keuzelijst, diea per definitie de volledige waarde filtert. Vanwege dit verschil moet het filter op een specifieke manier worden opgebouwd, en dat doet de functie.
 
Voordat ik iets met die db kan gaan doen, moet je hem toch eerst eens normaliseren; er zitten een paar tabellen in waar mijn haren recht van overeind gaan staan, zoals de tabel [tbl_selectiecriteria], met o.a. de velden [AV_Voorwaarde 1], [AV_Voorwaarde 2] t/m [AV_Voorwaarde 7] en [ProfV_Criterium 1] t/m [ProfV_Criterium 11], en to top it off: [PresV_Criterium 1] t/m [PresV_Criterium 4]. Die tabel deugt dus niet. Die velden moet je terugbrengen tot [AV_Voorwaarde], [ProfV_Criterium] en [PresV_Criterium]. Dat maakt je tabel ook gelijk een stuk overzichtelijker. Voor verschillende combinaties van selectiecriteria heb je dan nog een extra tabellen nodig, waarin je de criteria vastlegt, en een tabel waarin je de combinaties koppelt. Deze tabel is wat mij betreft onwerkbaar.
Hetzelfde geldt voor de tabel [], waarin je een serie velden hebt met de namen [AV1] t/m [AV7], [PrV1] t/m [PrV11] en [PresV1] t/m [PresV4]. Resultaten leg je vast in een gekoppelde tabel, waarin je een veld Resultaat hebt, en een keuzelijst met de waarden AV1 t/m AV7, PrV1 t/m PrV11 en PresV1 t/m PresV4.
Verder doe je ook nog mee aan de grote rage van dit jaar: een formulier maken met een volkomen nutteloos subformulier. Waarbij je hoofdformulier dan gebruikt wordt om te filteren, en het subformulier de data laat zien. Niet doen! Tenzij je de programmeercapaciteiten hebt om te snappen wat je aan het doen bent, en ik vermoed dat daar geen sprake van is. Verwijder het subformulier, zet alle velden in het hoofdformulier, en je zult zien dat het filteren een factor 10 makkelijker te maken is. Maar dat komt wel als de db klopt :)
 
Michel,

alvast bedankt voor de nuttige hulp!
De tabel tbl_selectiecriteria gebruik ik niet (stond er nog in omdat die zo geimporteerd was van excel). Die is nu verwijderd.
Voor de selectiecriteria gebruik ik tbl_selectiecriteria_apart. Daar staat alles wel genormaliseerd, denk ik.

Ik heb in de tabel tbl_resultateningaves de velden [AV1] tem [Pres4] verwijderd en vervangen door het veld [Resultaat_id], waaraan ik dan een tabel moet koppelen.
Nu is het absoluut niet vereist dat de criteria die er zijn, onderverdeeld moeten worden in AV1 tem Pres4. Dat was maar een naam die ik aan het criterium wou geven om ergens een naam te kunnen geven aan het veld. De criteria zijn volgens mij al uniek vastgelegd in het [selectiecriterium_apart_id] in de tabel tbl_selectiecriteria_apart. Als ik dan gewoon een resultaat kan geven op basis van bovenstaand id is het ook al meer dan goed. Het enige wat vereist is, is dat ik kan achterhalen of het een criterium is dat in een van volgende 3 categorieën onderverdeeld is (algemene voorwaarden, profielvoorwaarden, prestatievoorwaarden).
Moet ik dan nog een keuzelijst met waarden maken of kan ik het dan op een andere (makkelijkere) manier oplossen?
Ik dacht dat het dan misschien kon door gewoon een score te geven in het veld [Resultaat_id] in de tabel tbl_selectiecriteria_apart met als koppeling een relatie naar de tabel tbl_beslissing (bestaat uit een keuzelijst met 3 waarden nl. voldaan, niet voldaan, deliberatie).
 
Ik heb ondertussen 1 hoofdformulier trachten te maken, zowel vanuit de wizard als vanuit een leeg formulier op basis van de 2 "hoofdtabellen" tbl_resultateningaves en tbl_selectiecriteria_apart, en daarbij tbl_gegevens en tbl_federaties om de koppeling tussen beide tabellen te kunnen maken en telkens krijg ik eenzelfde probleem...in ontwerpmodus zie ik hoe de tabel eruit zou zijn, maar als ik naar formulierweergave ga, dan krijg ik in de "details" een leeg wit blad. Het is daar precies of de velden niet kunnen weergegeven worden.

Heeft iemand een idee hoe dat zou kunnen komen?

De upgedate database kan je vinden op volgende link: https://www.dropbox.com/sh/tcmp6xr6b7gq45u/enXAir0tYY
 
Ik heb een dergelijk formulier in mijn DB (indertijd van 't net geplukt en omgevormd), leuke is daarbij dat je je filter oa. kan combineren op formkeuzevelden gebaseerd op datum/tijd, numerieke velden, tekstvelden en selectievakjes etc....en dat je daarbij nog kolommen kan verbergen en weer zichtbaar maken. Je Report baseer je danop ongeveer dezelfde code FilterFormulier.jpg

Mijn Codes voor de form (die moet je maar ombouwen)
Achter elke keuzelijst bij de afterupdate
Code:
Private Sub Kzl_afdelingkeuze_algemeen_AfterUpdate()
cmdFilter_Click
End Sub
Bij de formfilterknop
Code:
Public Sub cmdFilter_Click()
    'Purpose:   Build up the criteria string form the non-blank search boxes, and apply to the form's Filter.
    'Notes:     1. We tack " AND " on the end of each condition so you can easily add more search boxes; _
                        we remove the trailing " AND " at the end.
    '           2. The date range works like this: _
                        Both dates      = only dates between (both inclusive. _
                        Start date only = all dates from this one onwards; _
                        End date only   = all dates up to (and including this one).
    Dim strWhere As String                  'The criteria string.
    Dim lngLen As Long                      'Length of the criteria string to append to.
    Const conJetDate = "\#mm\/dd\/yyyy\#"   'The format expected for dates in a JET query string.
    
    '***********************************************************************
    'Look at each search box, and build up the criteria string from the non-blank ones.
    '***********************************************************************
    'If Me.Keuzerondje_Actief = -1 Then
     '   strWhere = strWhere & "([Act] = True) AND "
    'End If
    
    If Not IsNull(Me.Kzl_personeelsnummer) Then
        strWhere = strWhere & "([personeelsnummer] Like """ & Me.Kzl_personeelsnummer & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_JaartalStart) Then
        strWhere = strWhere & "([Datum start] Like ""*" & Me.Kzl_JaartalStart & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_MaandkeuzeStart) Then
        strWhere = strWhere & "([Datum start] Like ""*" & Me.Kzl_MaandkeuzeStart & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_JaartalStop) Then
        strWhere = strWhere & "([Datum stop] Like ""*" & Me.Kzl_JaartalStop & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_MaandkeuzeStop) Then
        strWhere = strWhere & "([Datum stop] Like ""*" & Me.Kzl_MaandkeuzeStop & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_Geslacht) Then
        strWhere = strWhere & "([Geslacht] Like ""*" & Me.Kzl_Geslacht & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_afdelingkeuze_algemeen) Then 'is numeriek veld
        strWhere = strWhere & "([CAfdeling] = " & Me.Kzl_afdelingkeuze_algemeen & ") AND "
    End If
    
    If Not IsNull(Me.Kzl_FTEquivalent) Then  'is numeriek veld
        strWhere = strWhere & "([FT Equivalent] = " & Me.Kzl_FTEquivalent & ") AND "
    End If
    
    If Not IsNull(Me.Kzl_betrekking) Then  'is numeriek veld
        strWhere = strWhere & "([Beklede betrekking] = """ & Me.Kzl_betrekking & """) AND "
    End If
    If Not IsNull(Me.Kzl_Statuut) Then  'is numeriek veld
        strWhere = strWhere & "([Statuut] = """ & Me.Kzl_Statuut & """) AND "
    End If
    If Not IsNull(Me.Kzl_Tewerkstelling) Then  'is numeriek veld
        strWhere = strWhere & "([Tewerkstelling] = """ & Me.Kzl_Tewerkstelling & """) AND "
    End If
        If Not IsNull(Me.Kzl_Duur) Then  'is numeriek veld
        strWhere = strWhere & "([Duur] = """ & Me.Kzl_Duur & """) AND "
    End If
    
    'If Not IsNull(Me.Kzl_prioriteit_gemeente) Then
     '   strWhere = strWhere & "([PrGem] = " & Me.Kzl_prioriteit_gemeente & ") AND "
    'End If
    
    'If Not IsNull(Me.Kzl_gemeente) Then
     '   strWhere = strWhere & "([BVWoonplaats] = """ & Me.Kzl_gemeente & """) AND "
    'End If
    
    'If Not IsNull(Me.kzl_categorie) Then
     '   strWhere = strWhere & "([Categorie] = """ & Me.kzl_categorie & """) AND "
    'End If
     '   If Me.Keuzerondje_KVC = -1 Then
      '  strWhere = strWhere & "([KVB_wachtlijst] = True) AND "
    'End If
     '   If Me.Keuzerondje_KVC_OK = -1 Then
      '  strWhere = strWhere & "([KVB_wachtlijst_voldaan] = True) AND "
    'End If
    
    'Another text field example. Use Like to find anywhere in the field.
    'If Not IsNull(Me.txtFilterMainName) Then
        'strWhere = strWhere & "([MainName] Like ""*" & Me.txtFilterMainName & "*"") AND "
    'End If
    
    'Number field example. Do not add the extra quotes.
    'If Not IsNull(Me.cboFilterLevel) Then
        'strWhere = strWhere & "([LevelID] = " & Me.cboFilterLevel & ") AND "
    'End If
    
    'Yes/No field and combo example. If combo is blank or contains "ALL", we do nothing.
    'If Me.cboFilterIsCorporate = -1 Then
       ' strWhere = strWhere & "([IsCorporate] = True) AND "
    'ElseIf Me.cboFilterIsCorporate = 0 Then
       ' strWhere = strWhere & "([IsCorporate] = False) AND "
    'End If
    
    'Date field example. Use the format string to add the # delimiters and get the right international format.
    'If Not IsNull(Me.txtStartDate) Then
     '   strWhere = strWhere & "([EnteredOn] >= " & Format(Me.txtStartDate, conJetDate) & ") AND "
    'End If
    
    'Another date field example. Use "less than the next day" since this field has times as well as dates.
    'If Not IsNull(Me.txtEndDate) Then   'Less than the next day.
     '   strWhere = strWhere & "([EnteredOn] < " & Format(Me.txtEndDate + 1, conJetDate) & ") AND "
    'End If
    
    '***********************************************************************
    'Chop off the trailing " AND ", and use the string as the form's Filter.
    '***********************************************************************
    'See if the string has more than 5 characters (a trailng " AND ") to remove.
    lngLen = Len(strWhere) - 5
    If lngLen <= 0 Then     'Nah: there was nothing in the string.
        Msgbox "No criteria", vbInformation, "Nothing to do."
        'cmdReset_Click
    Else                    'Yep: there is something there, so remove the " AND " at the end.
        strWhere = Left$(strWhere, lngLen)
        'For debugging, remove the leading quote on the next line. Prints to Immediate Window (Ctrl+G).
        'Debug.Print strWhere
        
        'Finally, apply the string as the form's Filter.
        Me.[Sub_Frm_Personeelsleden].Form.Filter = strWhere
        Me.[Sub_Frm_Personeelsleden].Form.FilterOn = True
        Me.Txtaantal = Me.Sub_Frm_Personeelsleden.Form.Recordset.RecordCount
    End If
End Sub

En dan onder de report knop iets zoals dit
Code:
Private Sub CmbReportPreview_Click()
On Error GoTo Err_CmbReportPreview_Click

    Dim stDocName As String
    Dim strWhere As String                  'The criteria string.
    Dim lngLen As Long                      'Length of the criteria string to append to.
    Const conJetDate = "\#mm\/dd\/yyyy\#"   'The format expected for dates in a JET query string.
    
    '***********************************************************************
    'Look at each search box, and build up the criteria string from the non-blank ones.
    '***********************************************************************
    
      If Not IsNull(Me.Kzl_personeelsnummer) Then
        strWhere = strWhere & "([personeelsnummer] Like """ & Me.Kzl_personeelsnummer & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_JaartalStart) Then
        strWhere = strWhere & "([Datum start] Like ""*" & Me.Kzl_JaartalStart & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_MaandkeuzeStart) Then
        strWhere = strWhere & "([Datum start] Like ""*" & Me.Kzl_MaandkeuzeStart & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_JaartalStop) Then
        strWhere = strWhere & "([Datum stop] Like ""*" & Me.Kzl_JaartalStop & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_MaandkeuzeStop) Then
        strWhere = strWhere & "([Datum stop] Like ""*" & Me.Kzl_MaandkeuzeStop & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_Geslacht) Then
        strWhere = strWhere & "([Geslacht] Like ""*" & Me.Kzl_Geslacht & "*"") AND "
    End If
    
    If Not IsNull(Me.Kzl_afdelingkeuze_algemeen) Then  'is numeriek veld
        strWhere = strWhere & "([CAfdeling] = " & Me.Kzl_afdelingkeuze_algemeen & ") AND "
    End If
    
    If Not IsNull(Me.Kzl_FTEquivalent) Then  'is numeriek veld
        strWhere = strWhere & "([FT Equivalent] = " & Me.Kzl_FTEquivalent & ") AND "
    End If
    If Not IsNull(Me.Kzl_betrekking) Then  'is numeriek veld
        strWhere = strWhere & "([Beklede betrekking] = """ & Me.Kzl_betrekking & """) AND "
    End If
    If Not IsNull(Me.Kzl_Statuut) Then  'is numeriek veld
        strWhere = strWhere & "([Statuut] = """ & Me.Kzl_Statuut & """) AND "
    End If
    If Not IsNull(Me.Kzl_Tewerkstelling) Then  'is numeriek veld
        strWhere = strWhere & "([Tewerkstelling] = """ & Me.Kzl_Tewerkstelling & """) AND "
    End If
    If Not IsNull(Me.Kzl_Duur) Then  'is numeriek veld
        strWhere = strWhere & "([Duur] = """ & Me.Kzl_Duur & """) AND "
    End If
    
    '***********************************************************************
    'Chop off the trailing " AND ", and use the string as the form's Filter.
    '***********************************************************************
    'See if the string has more than 5 characters (a trailng " AND ") to remove.
    lngLen = Len(strWhere) - 5
    If lngLen <= 0 Then     'Nah: there was nothing in the string.
        Msgbox "Geen filtercriteria ingesteld, rapportvoorbeeld met alle data als U op OK drukt", vbInformation, "Nothing to do."
        Cancel = True
    Else                    'Yep: there is something there, so remove the " AND " at the end.
        strWhere = Left$(strWhere, lngLen)
        'For debugging, remove the leading quote on the next line. Prints to Immediate Window (Ctrl+G).
        'Debug.Print strWhere
        
        'Finally, apply the string as the form's Filter.
    Me.[Sub_Frm_Personeelsleden].Form.Filter = strWhere
    Me.[Sub_Frm_Personeelsleden].Form.FilterOn = True
    End If
    stDocName = "Rpt_Personeelsleden_volgens_criteriaform"
    DoCmd.OpenReport stDocName, acPreview, , strWhere
    DoCmd.Maximize
  
Exit_CmbReportPreview_Click:
    Exit Sub

Err_CmbReportPreview_Click:
    Msgbox Err.Description
    Resume Exit_CmbReportPreview_Click
End Sub


NB: je (voorbeeld)database bevat volgens mij vertrouwelijke informatie die je misschien best vooraf verwijderd/aanpast voor ze op 't net te zetten
 
Laatst bewerkt:
Hoe komt het dat de tabel [tbl_gegevens] totaal niet genormaliseerd is? Er zitten 74(!) personen in met meer dan één record, waarvan 27 met meer dan 4. Dat zou ik eerst oplossen voordat ik verder ging bouwen...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan