Rapport dezelfde 1x parameter doen vragen

Status
Niet open voor verdere reacties.

BartSt

Gebruiker
Lid geworden
26 jun 2012
Berichten
86
Beste mensen,

Ik heb een rapport genaamd "verloffiches".

De koptekstsectie bestaat uit een titel, de naam van de medewerker e.d.

In de sectie "details" bevinden zich enkele subformulieren, die telkens gebaseerd zijn op een query: opgenomen verlof, totalen van opgenomen verlof, verlofrechten, verlofsaldo's.

Er begint een nieuwe pagina op het einde van elke detailsectie.

De queries waarop de subformulieren gebaseerd zijn, gebruiken de parameter [Welk jaar? (YYYY)] om enkel de gegevens van het juiste jaar te selecteren.

Probleem: wanneer ik mijn rapport open, moet ik die parameter een aantal keren per pagina (dus per medewerker) ingeven. Weet iemand hoe ik ervoor kan zorgen dat ik de parameter maar 1x moet ingeven?
 
Makkelijkste oplossing: maak een formulier waarin je het jaartal vraagt, en open het rapport met het jaartal als filter. Dus geen parameter meer gebruiken in je queries.
Vind ik zowiezo een onhandige oplossing :)
 
Dat begrijp ik niet zo goed...

Wat bedoel je juist met een formulier naar een jaartal doen vragen?

En hoe zou ik dan in het rapport kunnen verwijzen naar dat formulierelement?
 
Eigenlijk heel simpel: je maakt een formulier om rapporten te openen, met daarop (bijvoorbeeld) een tekstvak of een keuzelijst waarin je een periode of jaar selecteert. Vervolgens open je met een opdrachtknop het rapport, waarbij je het jaar meegeeft als filter voor het rapport. Je ziet dan dus de juiste data.
In de nieuwe Access cursus wordt die techniek gebruikt om een rapport te filteren.
 
Andere oplossing: gebruik een vaste query voor je rapport, en gebruik het formulier om die query aan te passen. (eigenlijk de techniek van de cursus; het rapport filteren is eerder aan bod gekomen)
 
En om het helemaal duidelijk te maken: een voorbeeldje met beide varianten :)
Overigens maken beide knoppen gebruik van een deel van dezelfde code, namelijk het aanpassen van de query van het rapport. Maar dat is omdat ik dan met één rapport kan werken. Het verschil tussen de knoppen <Rapport Query> en <Rapport Filter> is dus dat bij de Query optie de filtering in de query wordt gezet, en bij het Filter is de query een totaalquery met alle records, en wordt de filtering meegegeven aan het rapport.
 

Bijlagen

Michel,

Bedankt voor je uitleg, klinkt interessant. Ik zal me er even in moeten verdiepen.
 
Laatst bewerkt:
Eigenlijk heel simpel: je maakt een formulier om rapporten te openen, met daarop (bijvoorbeeld) een tekstvak of een keuzelijst waarin je een periode of jaar selecteert. Vervolgens open je met een opdrachtknop het rapport, waarbij je het jaar meegeeft als filter voor het rapport. Je ziet dan dus de juiste data.
In de nieuwe Access cursus wordt die techniek gebruikt om een rapport te filteren.

Met de nieuwe Access cursus refereer je naar je 13 delige reeks (PDFs) hier op de site, of vergis ik me?
 
Klopt; die staat in de sectie Handleidingen.
 
Nou, ben ik het weer even te ver gaan zoeken... :D
Ik heb het dus gevonden. Bedankt, Michel!

Voor de geïnteresseerden, mijn oplossing bestaat uit het aanmaken van een formulier met een niet-afhankelijk tekstvak. In dat tekstvak moet een jaar worden ingevoerd; invoermasker "0000" en standaardwaarde Year(Date()). Dat tekstvak heb ik een duidelijke naam gegeven, "JaarINVOER".
Op dat formulier staat verder een knop die mijn rapport "Verloffiches" lanceert.

Het rapport "Verloffiches" bestaat (nog steeds) uit subrapporten, die zijn gebaseerd op tabellen of queries zonder parameters. De filters van die subrapporten verwijzen naar JaarINVOER, bijvoorbeeld "Year([Begindatum])=[Formulieren]![Verloffiches (rapport via formulier)]![JaarINVOER]"
(Waar "Verloffiches (rapport via formulier)" dus het formulier is dat het rapport lanceert.)
 
Tja, nu ben ik gelijk overmoedig geworden...
Ik heb aan mijn "lancerend" formulier een multiselect keuzelijst toevoegd, waarin stamplaatsen kunnen worden geselecteerd. Aan mijn hoofdrapport heb ik volgende filter toegevoegd:

[Stamplaats] in ([Formulieren]![Verloffiches (rapport via formulier)]![KeuzelijstSTAMPLAATS])

Het resultaat is een leeg formulier. Wat loopt er mis?
 
Een keuzelijst met Invoervak kun je op die manier ("Year([Begindatum])=[Formulieren]![Verloffiches (rapport via formulier)]![JaarINVOER]") nog wel filteren, maar bij een keuzelijst werkt dat niet, tenminste niet als je de optie <Meervoudige Selectie> gebruikt. Maar dat had je al gemerkt ;)
Nog afgezien van het feit dat je direct verwijst naar een object op een formulier, wat er voor gaat zorgen dat je het rapport nooit kunt openen zonder dat het formulier geopend is (althans: je krijgt een parametervraag die je niet zou moeten willen) kun je dus ook geen gebruik maken van een meervoudige keuzelijst. Tenzij je die weer koppelt aan een veld met meervoudige selectie. Maar dat laten we hier even buiten beschouwing.

Mijn insteek is dus doorgaans dat ik probeer te voorkomen dat er parameters in queries en formulieren terecht komen. Dat bereik ik dan door de Source van rapport of query aan te passen. Zoals in mijn voorbeeld bestand. In eerste instantie iets meer werk, maar als je de techniek eenmaal doorhebt, werkt het een stuk soepeler.
Op basis van die techniek heb ik het voorbeeld uitgebreid met een extra keuzelijst, waarin je dus een meervoudige selectie kunt maken, en een rapport daarop filteren. In essentie komt het hier op neer, dat je een string opbouwt van de gekozen waarden uit de keuzelijst. En dat is dus wat je moet doen: de keuzelijst uitlezen, en de geselecteerde waarden in een string zetten. Wat jij hebt gedaan, is de complete keuzelijst in een filter zetten, wat dus niet werkt.

In dit draadje vind je de db met de oplossing.
 
Ik heb met mijn beperkte kennis van VBA gekeken naar de code van de sub "cmdPlanning_Filter_Click()". Als ik het goed begrijp, heb ik die niet allemaal nodig. Wat ik zou moeten doen, is een string declareren, en die vervolgens binnen een lus invullen. De relevante code voor de lus is:

Code:
        Case "lstMaand"
            For Each varItem In Me.lstMaanden.ItemsSelected
                iLst = iLst + 1
                sIn = sIn & Me.lstMaanden.Column(0, varItem)
                If iLst < Me.lstMaanden.ItemsSelected.Count Then sIn = sIn & ","

Dus daar zou ik dan een eigen variant van moeten bouwen. Kan ik in mijn rapportfilter dan zonder meer verwijzen naar die stringvariabele?

(Naast de declaratie van de string moet ik ook een declaratie doen van een teller voor in de lus, iLst.)
 
Je hebt in dit voorbeeld in ieder geval een Variant variabele nodig om de waarden van de listbox uit te lezen. Die heet in het voorbeeld varItem. Daarnaast heb ik een getalvariabele om te kijken of de lus al bij de laatste waarde is aangeland. Zo niet, dan moet er een scheidingsteken bij de lijst met waarden.
Verder heet jouw listbox uiteraard anders, dus die naam moet je ook aanpassen. De Case heb je niet nodig, want je kijkt gelijk naar de listbox. Dus het gaat om het stukje For Each ... Next.

Ik zou het rapport openen op de manier zoals ik dat ook doe, dus door het filter mee te geven bij het rapport. Het zou er dus ongeveer zo uit moeten zien:

Code:
Dim varItem As Variant
Dim iLst As Integer, sIn As String
    
    If Not Me.JaarINVOER.Value = vbNullString Then
        sFilter = "Year([Begindatum]) = " & Me.JaarINVOER.Value
    End If
    
    For Each varItem In Me.KeuzelijstSTAMPLAATS.ItemsSelected
        iLst = iLst + 1
        sIn = sIn & Me.KeuzelijstSTAMPLAATS.Column(0, varItem)
        If iLst < Me.KeuzelijstSTAMPLAATS.ItemsSelected.Count Then sIn = sIn & ","
    Next varItem
    If iLst > 0 Then sIn = "[Stamplaats] In(" & sIn & ")"
    
    If Not sIn & "" = "" Then sFilter = sFilter & " AND " & sIn
    
    DoCmd.OpenReport stDocName, acPreview, , sFilter
 
Laatst bewerkt:
Michel,

Bedankt. Gezien mijn rapport bestaat uit subrapporten en er in het hoofdrapport niet moet worden gefilterd op jaar, heb ik dat deel van de sFilter verwijderd. Mijn code ziet er zo uit:

Code:
Private Sub VerloffichesOpenen_Click()

Dim varItem As Variant
Dim iLst As Integer, sIn As String
    
        
    For Each varItem In Me.StamplaatsKEUZELIJST.ItemsSelected
        iLst = iLst + 1
        sIn = sIn & Me.StamplaatsKEUZELIJST.Column(0, varItem)
        If iLst < Me.StamplaatsKEUZELIJST.ItemsSelected.Count Then sIn = sIn & ","
    Next varItem
        
    If Not sIn & "" = "" Then SFilter = "[Stamplaats] in (" & sIn & ")"
    'Als sIn niet leeg is
       
        
    Dim stDocName As String
    stDocName = "Verloffiches"
    DoCmd.OpenReport stDocName, acPreview, , SFilter

End Sub


Dit geeft volgende foutmelding: (3075)
Syntaxisfout (operator ontbreekt) in query-expressie [Stamplaats] in (HQ,Noord). (Wanneer ik de stamplaatsen HQ en Noord selecteer.)

Volgens mij moet ik ervoor zorgen dat de stamplaatsen worden omsloten met aanhalingstekens ("). Ik heb een aantal pogingen gedaan, maar geraak er niet uit. Hoe kan ik ervoor zorgen dat VBA letterlijk een " opneemt in de string?
 
Da's nou het voordeel van werken met brontabellen met numerieke sleutelvelden ;)

Code:
sIn = sIn & "'" & Me.StamplaatsKEUZELIJST.Column(0, varItem) & "'"
 
Ja, dat ik daar zelf weer niet ben opgekomen :) Ik was te gefixeerd op het " teken. Is er geen manier om dat letterlijk te doen opnemen? Bijvoorbeeld een ander teken ervoor ofzo?

Het werkt in elk geval, bedankt!

EDIT: voor de geïnteresseerden, de volledige code:

Code:
Private Sub VerloffichesOpenen_Click()

Dim varItem As Variant
Dim iLst As Integer, sIn As String
    
        
    For Each varItem In Me.StamplaatsKEUZELIJST.ItemsSelected
        iLst = iLst + 1
        sIn = sIn & "'" & Me.StamplaatsKEUZELIJST.Column(0, varItem) & "'"
        If iLst < Me.StamplaatsKEUZELIJST.ItemsSelected.Count Then sIn = sIn & ","
    Next varItem
        
    If Not sIn & "" = "" Then SFilter = "[Stamplaats] in (" & sIn & ")"
    'Als sIn niet leeg is
       
        
    Dim stDocName As String
    stDocName = "Verloffiches"
    DoCmd.OpenReport stDocName, acPreview, , SFilter

End Sub
 
Laatst bewerkt:
Enkele aanhalingsteken of dubbele maakt in Access VBA niet uit. Al is het "- teken zelf een stringaanduiding, en het '-teken voor commentaar. Maar er zijn verschillende oplossingen:

Code:
sIn = sIn & "'" & Me.StamplaatsKEUZELIJST.Column(0, varItem) & "'"
Code:
sIn = sIn & """" & Me.StamplaatsKEUZELIJST.Column(0, varItem) & """"
Code:
sIn = sIn & Chr(34) & Me.StamplaatsKEUZELIJST.Column(0, varItem) & Chr(34)  'maakt "
Code:
sIn = sIn & Chr(39) & Me.StamplaatsKEUZELIJST.Column(0, varItem) & Chr(39)  'maakt '

of:
Code:
Dim sQ as string
sQ=""""
sIn = sIn & sQ & Me.StamplaatsKEUZELIJST.Column(0, varItem) & sQ  'maakt "

Take your pick...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan