rapportfilter werkt niet volledig

Status
Niet open voor verdere reacties.

gotcha123

Gebruiker
Lid geworden
12 apr 2008
Berichten
86
Ik heb een rapport gemaakt op basis van een query, met in mogelijke filters (geslacht, schooljaar en studiejaar) de verwijzing naar de keuze in het formulier (vb. [Formulieren]![frm_selectiecriteria_afdrukken]![cbo_geslacht]
Ik wil vanuit een formulier max. 3 keuzes (schooljaar, geslacht en studiejaar) kunnen maken en gebaseerd op die keuzes mijn rapport laten afdrukken.

Nu heb ik 2 vragen/problemen hieromtrent:
1) Vanuit 2 van de 3 keuzes lukt dit perfect (geslacht en studiejaar) (dit zijn keuzelijsten met invoervak btw) om het rapport op de gewenste manier te maken.
Maar als ik het schooljaar selecteer vanuit een keuzelijst (zonder invoervak), dan neemt hij deze waarden niet aan en krijg ik een leeg rapport.
Doe ik dit vanuit een keuzelijst met invoervak (het schooljaar dan), dan werkt dit wel.

Waar ligt het verschil in toepassing van de filter in het maken van het rapport?
Ik zou namelijk graag meerdere schooljaren kunnen selecteren om in 1 rapport te plaatsen.

2) mijn 2e vraag sluit hier lichtjes bij aan. Als er niets geselecteerd wordt, dan zou ik willen dat hij alle waarden van de betreffende keuzelijst neemt om het rapport mee te maken (vb. alle studiejaren).
Hoe krijg ik dit voor elkaar?

Alvast bedankt voor de hulp!
 
Een Keuzelijst kun je net als een Keuzelijst met Invoervak laten werken door de eigenschap <Meervoudige selectie> op <Geen> te zetten. De keuzelijst krijgt dan een waarde toegewezen als je er op klikt. Zet je hem op één van de andere opties, dan krijgt de keuzelijst geen waarde meer, en die is dan Null. In je criterium filter je dus op <Null> i.p.v. op de gekozen waarden.

De oplossing kan alleen via VBA: je moet een functie maken die een dynamisch filter opbouwt, op basis van de gekozen waarden. En als je dat toch aan het doen bent, dan kun je gelijk vraag 2 meenemen, want het filter wordt toch 'live' gemaakt, dus dan kun je ook de overige filterlijsten uitlezen en in het filter zetten.
Tip: lees een keuzelijst uit met de property .Selected, en gebruik SET om een QueryDef te definiëren en de nieuwe sql aan de query te hangen. Dan blijft alles netjes en soepel werken.
 
Laatst bewerkt:
ik vrees dat ik bij die oplossing in VBA zal moeten afhaken...die functies ken ik namelijk helemaal niet :-(
 
Dan heeft het zeker geen zin om de (bijna geen meer) dummycode te posten? Je kan eventueel een voorbeeldje maken op basis van je db, met formulier en rapport, dan kunnen we het er wel voor je inzetten.
 
Ik gebruik een constructie die er in jou geval ongeveer zou uit zou kunnen zien:
Code:
Private Sub cmdOpenRapport_Click()
On Error GoTo Err_cmdOpenRapport_Click
Dim qDEF As DAO.QueryDef
Dim i As Integer
Dim strSQL As String, strWhere As String
Dim strJaar As String, strStudieJaar As String, strGeslacht As String
Dim varItem As Variant

    'basisquery maken
    strSQL = "SELECT * FROM [B][COLOR="#0000CD"]tblStudieGroepen[/COLOR][/B] "
    
    'Opbouwen van de  IN string met een lus van de listbox
    For i = 0 To Me.[B][COLOR="#0000CD"]lstJaar[/COLOR][/B].ListCount - 1
        If Me.lstJaar.Selected(i) Then
            If strJaar & "" = "" Then strIN = strIN & ","
            strJaar = strJaar & Me.lstJaar.Column(0, i)
        End If
    Next i

    If Me.[B][COLOR="#0000CD"]cboStudieJaar[/Color][/B] & "" <> "" Then strStudieJaar = Me.cboStudieJaar
    If Me.[B][COLOR="#0000CD"]cboGeslacht[/Color][/B] & "" <> "" Then strGeslacht = Me.cboGeslacht
    
    'De WHERE string maken van de filters
    If strJaar <> "" Then
        If strWhere = "" Then strWhere = "WHERE ("
        strWhere = strWhere & "[B][COLOR="#0000CD"]Schooljaar[/Color][/B]] IN (" & strJaar & ")"
    End If

    If strStudieJaar <> "" Then
        If strWhere = "" Then strWhere = "WHERE (" Else strWhere = strWhere & " AND "
        strWhere = strWhere & "[B][COLOR="#0000CD"]StudieJaar[/Color][/B] = " & strStudieJaar
    End If
    
    If strGeslacht <> "" Then
        If strWhere = "" Then strWhere = "WHERE (" Else strWhere = strWhere & " AND "
        strWhere = strWhere & "[[B][COLOR="#0000CD"]Geslacht[/Color][/B]] = '" & strGeslacht & "'"
    End If
    If strWhere <> "" Then strWhere = strWhere & ")"
    
    strSQL = strSQL & strWhere
    
    On Error GoTo GeenQuery
    Set qDEF = CurrentDb.QueryDefs("[B][COLOR="#0000CD"]qryRapport[/Color][/B]")
    'SQL van de query vervangen
    qDEF.SQL = strSQL
    'Rapport openen in dialog modus, zodat je bij het sluiten het formulier weer krijgt.
    DoCmd.OpenReport "[B][COLOR="#0000CD"]Rapport[/Color][/B]", acViewPreview, , , WindowMode:=acDialog

    'Clear listbox selection after running query
    For Each varItem In Me.lstJaar.ItemsSelected
        Me.lstJaar.Selected(varItem) = False
    Next varItem

Exit_cmdOpenRapport_Click:
    Exit Sub

GeenQuery:
    'Query aanmaken als hij niet bestaat.
    Set qDEF = MyDB.CreateQueryDef("qryRapport")
    Resume Next

Err_cmdOpenRapport_Click:
    If Err.Number = 5 Then
        MsgBox "You must make a selection(s) from the list", , "Selection Required !"
        Resume Exit_cmdOpenRapport_Click
    Else
        'Write out the error and exit the sub
        MsgBox Err.Description
        Resume Exit_cmdOpenRapport_Click
    End If

End Sub
Dit is dummycode, omdat ik niet weet hoe jouw tabellen, velden en keuzelijsten etc. heten. Alle variabelen heb ik dus een keer blauw gemaakt om aan te geven wat je zou moeten veranderen.
In dit voorbeeld wordt een basis query gemaakt op basis van de brontabel van het rapport. Deze query wordt vervolgens uitgebreid met de al dan niet gekozen keuzelijsten. De multi-keuzelijst wordt dus op een wat ingewikkelder manier uitgelezen; de andere keuzelijsten kunnen ook in een query gebruikt worden, zoals je al weet.
Aan het eind, als de string strWHERE helemaal is opgebouwd, wordt de complete SQL toegekend aan de basisquery van het rapport. Vervolgens open je het rapport met de hard ingegeven filterwaarden.
Voordeel: de query werkt altijd, ook als je het formulier niet opent; hij zal nooit om een parameter vragen.
De hele code hangt overigens onder een knop, zodat je na het filteren met
eén druk op de knop het rapport opent.
 
Laatst bewerkt:
ik heb de poging ondernomen en alles aangepast wat ik dacht aangepast te moeten worden, maar blijkbaar heb ik er toch nog een paar foutjes in laten zitten.
toen ik de code wou uittesten, heeft hij een aantal keer aangegeven dat een variabele niet gedefinieerd was, dus heb ik ze bovenaan gedefinieerd.
Als ik nu de code test, dan krijg ik foutmelding 91 (objectvariabele of blokvariabele Width is niet ingesteld) bij regel 59 [Set qDEF = MyDB.CreateQueryDef("qryRapport")]

Hieronder mijn code hoe ik ze aangepast heb. Of heb je liever dat ik de ganse database post?

Code:
Private Sub cmd_OpenRapport_Click()
On Error GoTo Err_cmdOpenRapport_Click
Dim qDEF As DAO.QueryDef
Dim i As Integer
Dim strSQL As String, strWhere As String
Dim strJaar As String, strStudieJaar As String, strGeslacht As String
Dim varItem As Variant
Dim StrIN As String
Dim myDB As Database

    'basisquery maken
    strSQL = "SELECT * FROM tbl_selectiecriteria_apart "
    
    'Opbouwen van de  IN string met een lus van de listbox
    For i = 0 To Me.lst_schooljaar.ListCount - 1
        If Me.lst_schooljaar.Selected(i) Then
            If strJaar & "" = "" Then StrIN = StrIN & ","
            strJaar = strJaar & Me.lst_schooljaar.Column(0, i)
        End If
    Next i

    If Me.cbo_studiejaar & "" <> "" Then strStudieJaar = Me.cbo_studiejaar
    If Me.cbo_geslacht & "" <> "" Then strGeslacht = Me.cbo_geslacht
    
    'De WHERE string maken van de filters
    If strJaar <> "" Then
        If strWhere = "" Then strWhere = "WHERE ("
        strWhere = strWhere & "Schooljaar_id] IN (" & strJaar & ")"
    End If

    If strStudieJaar <> "" Then
        If strWhere = "" Then strWhere = "WHERE (" Else strWhere = strWhere & " AND "
        strWhere = strWhere & "StudieJaar_id = " & strStudieJaar
    End If
    
    If strGeslacht <> "" Then
        If strWhere = "" Then strWhere = "WHERE (" Else strWhere = strWhere & " AND "
        strWhere = strWhere & "[Geslacht_id] = '" & strGeslacht & "'"
    End If
    If strWhere <> "" Then strWhere = strWhere & ")"
    
    strSQL = strSQL & strWhere
    
    On Error GoTo GeenQuery
    Set qDEF = CurrentDb.QueryDefs("qTemp")
    'SQL van de query vervangen
    qDEF.SQL = strSQL
    'Rapport openen in dialog modus, zodat je bij het sluiten het formulier weer krijgt.
    DoCmd.OpenReport "rpt_selectiecriteria", acViewPreview, , , WindowMode:=acDialog

    'Clear listbox selection after running query
    For Each varItem In Me.lst_schooljaar.ItemsSelected
        Me.lst_schooljaar.Selected(varItem) = False
    Next varItem

Exit_cmdOpenRapport_Click:
    Exit Sub

GeenQuery:
    'Query aanmaken als hij niet bestaat.
    Set qDEF = myDB.CreateQueryDef("qTemp")
    Resume Next

Err_cmdOpenRapport_Click:
    If Err.Number = 5 Then
        MsgBox "You must make a selection(s) from the list", , "Selection Required !"
        Resume Exit_cmdOpenRapport_Click
    Else
        'Write out the error and exit the sub
        MsgBox Err.Description
        Resume Exit_cmdOpenRapport_Click
    End If

End Sub
 
Ik heb de code bewerkt vanuit een ander voorbeeld je dat ik wel eens gebruikt heb. Tegenwoordig haal ik de QueryDefs rechtstreeks uit de db, zoals je hier kunt zien:
Code:
    On Error GoTo GeenQuery
    Set qDEF = CurrentDb.QueryDefs("qTemp")
In de GeenQuery subroutine staat nog de originele code, waarbij eerst een variabele wordt ingesteld op de huidige database.
Code:
GeenQuery:
    'Query aanmaken als hij niet bestaat.
    Set qDEF = myDB.CreateQueryDef("qTemp")
Die variabele heb je niet (en dus ook niet nodig), maar daar kijkt hij wel naar bij het uitvoeren. Dus die regel moet je nog aanpassen.
 
het lukt mij voorals nog niet om het rapport deftig te krijgen...nu scheelt er blijkbaar opeens iets met de query :-(
ik moet parameterwaardes invullen, dus ergens is er nog iets fout...
als ik met dezelfde query een 'simpele' bewerking uitvoer vanuit 2 comboboxen, dan lukt het wel. Met de code lukt het niet...
 
Ik zet er in dat geval een inputbox tussen die de query afvangt.

Code:
    strSQL = strSQL & strWhere
Dim tmp
    tmp = InputBox("","",strSQL)
Hiermee vang je de gegenereerde SQL af (<Ctlr>+<C), die je dan in een nieuwe query kunt plakken. Het lost niks op, maar je kunt dan in de query kijken waar de fout zit, want Access geeft dat dan wel aan.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan