Selectie critera in header rapport

  • Onderwerp starter Onderwerp starter Risk
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Risk

Gebruiker
Lid geworden
5 jul 2010
Berichten
275
Forum,

Nog bezig met een ander vraag doemde er meteen een nieuwe op.

Ik heb een werkend selectieformulier gemaakt (zie eerdere vraag en dito antwoorden van Octafish).

Ik heb ooit een voorbeeld gezien van een rapport waarin een code in de kop de selecteicriteria uit het formulier liet zien.

Je zoekt op biv.: kenteken, afdeling, chauffeur en dan verschijnen de data in het rapport, maar de genoemde selectiecriteria in je header van het rapport. Daar zou ik dan bijv. een zin kunnen zetten: U selecteerde op: Ad A, AdB, Ad C. heb de hele voorbeelddatabase Noordenwind doorgespit in de veronderstelling dat daar iets stond.

Wie weet de oplossing??

Ik hoor graag.

Risk
 
Als je het filter (of wat je mee wilt geven) als OpenArgs meegeeft bij het openen van het rapport, kun je de OpenArgs variabele op het rapport toewijzen aan je tekstvak. Iets als:

Code:
Private Sub Rapportkoptekst_Format(Cancel As Integer, FormatCount As Integer)
    If Not Me.OpenArgs = "" Then
        Me.txtFilter = Me.OpenArgs
        Me.txtFilter.Visible = True
    End If
End Sub
 
Michel,

Ik open het rapport bij eigenschappen/gebeurtenis en dan zet ik deze code "bij filter"?

Blijft lastig die codes, maar werkt het dan is het perfect en te gebruiken bij andere toepassingen.

Blijf proberen te leren.

Hoor graag.

Risk
 
Nee, deze code kun je niet bij Filter zetten. Het is een gebeurtenis die je zo in het VBA venster kunt plakken van je rapport. Officieel hoort hij bij de gebeurtenis <Bij Opmaken> van de Header sectie, (Rapportkoptekst_Format) maar je zou ook een andere gebeurtenis kunnen maken, en deze code daar overheen zetten, dan staat hij ook gelijk bij de goede gebeurtenis. Overigens heb je dan ofwel een tekstvak nodig dat txtFilter heet, of je moet de naam in de code aanpassen. Maar da's een kleinigheid.
Verder moet je de filtertekst nog meegeven aan de opdrachtregel die het rapport opent. Dat is de laatste parameter, dus een paar komma's typen, en je komt 'm vanzelf tegen. Of hard coderen met OpenArgs:=sFilter.
 
Michel,

Dank voor je reactie, ga het proberen, maar op voorhand ben ik bang dat het voor mij (en misschien dandere lezers) lastig gaat worden. Is er ergens een voorbeeldje van een rapport te vinden?

Wordt vervolgd.

Risk
 
Geen probleem :) Ik heb het voorbeeldbestandje van de cursus (Rapport filteren 2k3) bijgewerkt. Als je het rapport vanaf het formulier opent, zie je het gebruikte filter. Open je het rapport rechtstreeks, met gesloten formulier dus, dan zie je geen filter.
 
Ik ga er vanavond voor zitten. Dit is denk ik een zeer bruikbare oplossing. Spaart een aantal verschillende rapportvarianten uit.

Wordt vervolgd en dank als altijd.

Risk
 
Michel,

Na enig proberen, de haven niet gehaald.

In mijn rapport heb ik een vakje gemaakt zoals in het voorbeeld Filter met de naam: txtFilter. Gewoon een kopie gemaakt van uit het voorbeeld. Gecontroleerd en alles is gelijk.

De code in het rapport bij VBA:


Option Compare Database


Private Sub Rapportkoptekst_Format(Cancel As Integer, FormatCount As Integer)
If Not Me.OpenArgs = "" Then
Me.txtFilter = Me.OpenArgs
Me.txtFilter.Visible = True
End If
End Sub


En dan werkt het dus weer eens niet. Voor zover ik kan zien alles netjes overgenomen.

Ik hoor graag wat ik fout doe.

Risk
 
Heb je ook de code gebruikt waarmee het rapport wordt geopend? Als je daar het filter niet meegeeft in de OpenArgs variabele, valt er natuurlijk niks te laten zien in het rapport.
 
Michel,

Ik heb nog even gekeken naar de code zoals jij aangeeft.

"Heb je ook de code gebruikt waarmee het rapport wordt geopend? Als je daar het filter niet meegeeft in de OpenArgs variabele, valt er natuurlijk niks te laten zien in het rapport"

Ik begrijp even niet wat je bedoeld met de code waarmee het rapport wordt geopend. Onder de knop Rapport filter in je voorbeeld heb ik bij de gebeurtenisprocedure niets in die code kunnen ontdekken. Niet zo heel vreemd voor een niet kenner van codes, maar kon hetproberen.

Welk filter zet ik dus waar.

Hulp blijft onontbeerlijk.

Dank,

Risk
 
Aanvullend:

Zou de filter hier moeten? DoCmd.OpenReport stDocName, acViewPreview, , sFilter

Risk
 
Op mijn formulier staan twee knoppen die het rapport openen. De eerste knop past de query aan, en de tweede opent het rapport met de complete recordset, en krijgt het filter vanuit de knopcode mee. In beide gevallen wordt de OpenArgs parameter gebruikt om het filer 'mee te sturen' naar het rapport.
Dat kan op twee manieren: je kunt net zoveel komma's typen achter het DoCmd.OpenReport commando tot de actie OpenArgs actief wordt, of je typt de parameter direct in. De tweede variant wordt bij de filterknop gebruikt, de 'harde' optie bij de eerste knop.

Code:
    DoCmd.OpenReport stDocName, acPreview, , sFilter, , sFilter
Het filter komt hier twee keer voor in de code. De eerste keer als filter, de tweede keer als OpenArgs. Overigens zou je het rapport verder ook op basis van het OpenArgs kunnen filteren, maar dat is een ander verhaal...
Rechtstreeks gebruikt ziet het er zo uit:
Code:
    DoCmd.OpenReport stDocName, acPreview, OpenArgs:=sFilter
Waar het om gaat: je moet bij het openen van het rapport dus het OpenArgs argument meegeven, anders valt er op het rapport niks uit te lezen. Het argument is dan immers leeg.
 
Dank voor de snelle reactie, ga aan de slag als ik weer op locatie ben.

Uiteindelijk gaat het werken.

Risk
 
Michel,

Hoera, dacht ik, er verschijnt een selctiescherm! Criteria verschijnen, maar nu selecteert mijn formulier niet meer. Het zit in OpenArgs. Haal ik dat weg dan sorteert het weer prima. Ik vergeet iets, maar wat?

Code:
Option Compare Database

Private Sub cboKenteken_AfterUpdate()
Call FilterMaken
End Sub

Private Sub cboVestiging_AfterUpdate()
Call FilterMaken
End Sub


Private Sub cboNaam_AfterUpdate()
Call FilterMaken
End Sub

Private Sub cboJaar_AfterUpdate()
Call FilterMaken
End Sub


Function FilterMaken()
Dim sFilter As String


If Me.cboJaar & "" <> "" Then
    sFilter = "[Jaar]=" & Me.cboJaar
    If Me.cboVestiging & "" <> "" Then
        sFilter = sFilter & " AND [Vestiging] = '" & Me.cboVestiging & "'"
    End If
Else
    If Me.cboVestiging & "" <> "" Then
        sFilter = "[Vestiging] = '" & Me.cboVestiging & "'"
    End If


If Me.cboNaam & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Naam] = '" & Me.cboNaam & "'"
End If

If Me.cboKenteken & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Kenteken] = '" & Me.cboKenteken & "'"
End If

If sFilter <> "" Then
    Me.Filter = sFilter
    Me.FilterOn = True
Else
    Me.Filter = ""
    Me.FilterOn = False
End If

End Function


Private Sub Knop405_Click()

stDocName = "Doorlooptijd schade op chauffeur"
Dim sFilter As String
If Me.cboJaar & "" <> "" Then
    sFilter = "[Jaar]=" & Me.cboJaar
    If Me.cboVestiging & "" <> "" Then
        sFilter = sFilter & " AND [Vestiging] = '" & Me.cboVestiging & "'"
    End If
Else
    If Me.cboVestiging & "" <> "" Then
        sFilter = "[Vestiging] = '" & Me.cboVestiging & "'"
    End If
End If

If Me.cboNaam & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Naam] = '" & Me.cboNaam & "'"
    End If
    
 If Me.cboKenteken & "" <> "" Then
    If sFilter <> "" Then sFilter = sFilter & " AND "
    sFilter = sFilter & "[Kenteken] = '" & Me.cboKenteken & "'"
    End If
 
   Me.Form.Visible = False

DoCmd.OpenReport stDocName, acViewPreview, , OpenArgs:=sFilter

End Sub



Private Sub Reset_Click()
    Me.cboNaam = ""
    Me.cboVestiging = ""
    Me.cboJaar = ""
Me.cboKenteken = ""
    Call FilterMaken
    Me.Requery
End Sub

Bijna gelukt.

Risk
 
Laatst bewerkt:
Aanvulllend:

Ik dacht als de ene optie niet werkt, dan mixen.

Met dit werkt het:

DoCmd.OpenReport stDocName, acViewPreview, , sFilter, OpenArgs:=sFilter

De juiste de oplossing??

Risk
 
Bijna gelukt lijkt ook op te gaan voor het in de CODE tag zetten :)
Dat is overigens een kwestie van een paar typfoutjes zo te zien: de start tag is [ code ] (zonder spaties) en de eind tag is [ /code ] (ook weer zonder spaties)

Wat betreft de vraag:
Code:
DoCmd.OpenReport stDocName, acViewPreview, , OpenArgs:=sFilter
DoCmd.OpenReport stDocName, acViewPreview, , sFilter, OpenArgs:=sFilter

Kijk eens naar het aantal (en de plek) van de komma's :)

Als je een parameter direct aanroept, mag er maar één komma voor staan. In de eerste regel heb je er twee staan. Resultaat: foutje.
Gebruik je geen directe parameter, dan moet je net zoveel komma's typen tot de gewenste parameter in beeld komt. En dan kom je hier uit:
Code:
DoCmd.OpenReport stDocName, acPreview, , sFilter, , sFilter
 
Michel,

Het werkt! Dank voor alle input.

Laatste punt: Is er een mogelijkheid om [Vestiging]="Amsterdam" alleen "Amsterdam" te laten verschijnen?? Vraag ik nu iets wat niet mogelijk is?

Ben al blj dat dit werkt.

Risk
 
Alles is uiteraard mogelijk; ik heb voor het gemak het volledige filter gebruikt, want voor demonstratie doeleinden maakt het natuurlijk niet uit wàt je in het rapport laat zien. Je zult dus een aparte string moeten maken voor de tekst die je in het rapport wilt maken. Ik zou zeggen: doe dat in de procedure die het filter opbouwt, want daar krijg je de ingrediënten vandaan. Daar waar het filter de veldnaam + de uitkomst toewijst aan de variabele sFilter, zet je de geselecteerde waarde in die nieuwe variabele. Die nieuwe variabele geef je vervolgens mee in de OpenArgs parameter.

Ik zie dat het nog niet gelukt is om de code tag te repareren :)
 
Michel,

Code:
 gebruikt. Hoop dat dat in het vervolg gaat lukken.

Ik heb een beeld bijeen string. Dat is vast niet wat er in de database moet. Begrijp ik het een dan volgt er weer  een gedachte  die lastiger is dan de vorige. Hoe zou ik dat moeten oplossen?

Vraag wel heel veel. Blof heeft een nieuwe song: was je maar hier. 

Risk
 
Ik zie in je code een dubbele punt staan. Dat werkt dus (zoals je kunt zien) niet ;) Overigens kun je code uiteraard altijd toepassen middels de knop, als je in het Geavanceerde scherm zit. Kijk naar de variabele sFilter, en kopieer die zo ongeveer, dan kom je een heel eind. Om een tipje van de sluier op te lichten:

Code:
sFilter = sFilter & " AND [Vestiging] = '" & Me.cboVestiging & "'"
wordt dan iets als:
Code:
sRapportFilter = Me.cboVestiging
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan