met een druk op de knop alle records in een subfromulier afdrukken

Status
Niet open voor verdere reacties.

Rene71

Gebruiker
Lid geworden
2 aug 2012
Berichten
133
hoe kan je met knop in een keer alle records afdrukken die op dat moment in het sub formulier staan
nu heb ik een knop PRINT UNIT in het subformulier staan die het huidige record afdrukt
ik moet dus naar Unit 2 gaan om dat Unit ID af te drukken
Code:
DoCmd.OpenReport "rptHandlingUnit", acViewReport, , "[UnitID]=" & [UnitID]
maar ik wil dat alle records worden afgedrukt. staan er twee records in dan moeten er twee rapporten worden afgedrukt
Print Unit 2.jpg
het mooiste zou zijn dat ik met een knop ook Print Vrachtbrief kan uitvoeren
maar dat kan dan volgens mij door in de knop Print Vrachtbrief te verwijzen naar de knop Print Unit
 
Als je in een specifiek record staat kun je met Me.UnitID (ik zou dus niet jou methodiek gebruiken) dat nummer uitlezen. Een ander record uitlezen lukt natuurlijk niet. Ik zou dus die knop niet daar zetten, maar in de detailsectie van het Unit record, zodat je dat vanuit het record kunt afdrukken. Als je een enkel rapport wilt.
Om alle detailrecords af te drukken, moet je met een recordset werken. Daarbij zou ik niet met deze manier van filteren werken, maar het rapport koppelen aan een vaste query die je steeds aanpast. Dan kun je het rapport namelijk gelijk naar de printer sturen. Je moet dus een recordset maken die alle detailrecords bevat, en de SQL via de QueyDefs collectie aanpassen.
 
ja dat heb ik je wel eens eerder zien uitleggen
ik heb al zitten zoeken op het forum maar ik kan het niet meer terug vinden kan me ook even niet voor de geest halen of het toen om rapporten ging of om het maken van pdf
de vraag is volgens mij al een keer eerder gesteld
zal toch beter moeten zoeken
recordsets ik snapt er nog maar weinig van
 
Een recordset is in wezen niks anders als een query die je maakt. Meestal zet ik 'm eerst in een tekstvariabele, want dat is overzichtelijker.
Je subformulier heeft waarschijnlijk een tabel of een query als Recordbron, en die kun je dus prima als uitgangspunt pakken voor de recordset. Daar zitten dan alle records in die je wilt hebben. Met een loop lus je dan door alle records heen op basis van het veld UnitID. Daarmee maak je dus het WHERE deel van de query. Het rapport hang je aan een (al dan niet tijdelijke) query waarvan je de naam dus weet. Het aanpassen van die query gaat dan als volgt:
Code:
Dim qTmp As QueryDef
Set qTmp = CurrentDb.Querydefs("qTemp")
qTmp.SQL = StrSQL
En dat is het dan zo'n beetje. Bij elk record verander je dus de SQL code van qTemp, en aangezien die query de basis is van je rapport, verander je ook je rapport. En dat print je dan vervolgens, en daarna ga je in de lus naar het volgende record.
 
ik heb het draadje weer gevonden en heb de code aangepast
Code:
Dim strDocName As String, strSQL As String, strWhere As String
Dim qTemp As QueryDef
Dim rs As DAO.Recordset
Dim iLast As Integer

    strDocName = "rptHandlingUnit"
    strSQL = "SELECT * FROM tblUnit"
    Set rs = CurrentDb.OpenRecordset(strSQL)
    With rs
        .MoveLast
        If .RecordCount > 0 Then
            DoCmd.SetWarnings False
            iLast = .RecordCount - 1
            .MoveFirst
            For i = 0 To iLast
                On Error GoTo Create_qTemp
                strWhere = " WHERE  [UnitID]=" & rs!PBID
                Set qTemp = CurrentDb.QueryDefs("qTemp")
                On Error GoTo 0
                qTemp.SQL = strSQL & strWhere
                DoCmd.OpenReport strDocName, acViewNormal, , strWhere, acHidden
                .MoveNext
            Next i
            DoCmd.SetWarnings True
        End If
    End With
    Exit Sub

Create_qTemp:
    Set qTemp = CurrentDb.CreateQueryDef("qTemp", strSQL & strWhere)
    Resume Next
krijg een foutmelding Fout3075 .jpg op
Code:
DoCmd.OpenReport strDocName, acViewNormal, , strWhere, acHidden

als ik een enkele print opdracht geeft met de knop Print Unit
Code:
DoCmd.OpenReport "rptHandlingUnit", acViewReport, , "[UnitID]=" & [UnitID]
krijg ik het gevraagde UnitID
ik wil dus alle UnitID's van de PBID afdrukken
ik begrijp de foutmelding niet want de PBID in de foutmelding is wel hetgene waarvan ik de UnitID wil afdrukken
Code:
strWhere = " WHERE  [UnitID]=" & rs!PBID
ik wil dus alle UnitID's van de PBID afdrukken
ik doe hier (strWhere) dus iets fout ik snap alleen niet wat
 
Ik snap de foutmelding wel, want je doet a) dingen dubbel en b) ook nog eens met een fout er in :). Om met het laatste te beginnen: het filter dat je meegeeft met het rapport bevat het woord WHERE. Maar dat is niet de bedoeling; strWHERE zou alleen dit moeten zijn:
Code:
strWhere = "[UnitID]=" & rs!PBID
Maar zoals gezegd: je doet dubbel werk, dus het hoeft niet eens zo gedaan te worden. De constructie is er op gebaseerd dat het rapport is gekoppeld aan de query qTemp, en de query is al gefilterd. Ik zou de procedure dus zo aanpassen:
Code:
Dim strDocName As String, strSQL As String, strWhere As String
Dim qTemp As QueryDef
Dim rs As DAO.Recordset

    strDocName = "rptHandlingUnit"
    strSQL = "SELECT * FROM tblUnit "
    Set rs = CurrentDb.OpenRecordset(strSQL)
    With rs
        .MoveLast
        If .RecordCount > 0 Then
            .MoveFirst
            Do Until .EOF
                On Error GoTo Create_qTemp
                strWhere = "WHERE [UnitID]=" & rs!PBID
                Set qTemp = CurrentDb.QueryDefs("qTemp")
                On Error GoTo 0
                qTemp.SQL = strSQL & strWhere
                DoCmd.OpenReport strDocName, acViewNormal
                .MoveNext
            Loop
        End If
    End With
    Exit Sub

Create_qTemp:
    Set qTemp = CurrentDb.CreateQueryDef("qTemp", strSQL & strWhere)
    Resume Next
Je ziet dat ik de iAantal heb vervangen door .EOF. Werkt net wat handiger.
 
Bedankt Michel voor je Reactie

er worden nu inderdaad rapporten afgedrukt. maar te veel
PakbonUnit.png
en dit krijg ik dan 4x (en waarom ook 5x hetzelfde subrapport op het rapport )
ik heb er tijdje naar zitten kijken tot ik er ook achter kwam dat er ook niet gekeken wordt naar het huidige PBID
er staan in de tblPakbon 4 records. dat verklaard waarschijnlijk de 4 afdrukken die ik krijg
en welk PakbonID (PBID) ik ook wil afdrukken ik krijg altijd de Eerste record afgedrukt
ik krijg ook het tweede Unit niet afgedrukt (in de eerste Record van tblPakbon zitten 2 Units gekoppeld )

en voor zover ik het nu begrijpt wordt er alleen in de
Code:
strWhere = "WHERE [UnitID]=" & rs!PBID
gekeken PBID en eigenlijk niet eens naar een PBID maar het eerste PBID

ik moet dus ook opgeven van welk huidig PakbonID (PBID) de UnitID's moeten worden afgedrukt
maar hoe doe je dat ?
 
Daarvoor zou ik de db moeten zien. Je opent in eerste instantie de tabel met alle records. Daarna pas wordt een filtering op de query gemaakt. Die query moet uiteraard wel als basis van het rapport dienen, anders gaat het ook niet werken. Dus wellicht dat daar het probleem zit.
 
Vraagje aan Actafish

heb je misschien al de zin en gelegenheid gehad om naaf mijn fout in de code te kijken

met vriendelijke groet
Rene
:)
 
Ik heb er al even naar gekeken, maar die db staat thuis. Sowieso heb ik vandaag heel weinig tijd, dus je zult tot vanavond moeten wachten :).
 
dat je er naar wilt kijken ben ik al blij mee en hopelijk heb je ook de oplossing voor me
alvast bedankt
 
daar istie weer
is Octafish misschien al in de gelegenheid geweest om naar de dB te kijken ?
 
Kijken wel, maar deze db staat zó ver weg van wat ik zelf zou doen, dat ik er een beetje moedeloos van word. Zo snap ik in je rapport al die DLookup's niet, die straks ook niet meer gaan werken. Omdat er nu maar 1 record in tblBedrijfsInformatie staat gaat het wel goed, maar daar kun je in de problemen mee komen.
En dat subformulier zou ik ook nooit gebruiken; volgens mij kun je alles met één query en een aantal groepen een veel beter resultaat bereiken. Kortom: eerlijk gezegd ontbreekt mij de tijd om dit echt te verbouwen. Maar die richting zou ik dus opgaan: er één rapport van maken. Zodra je de gegevens in één query kunt vangen, kun je er één rapport van maken.
 
in tblBedrijfsInformatie komt nooit meer dan 1 record te staan en zo (althans das is de bedoeling) hoef ik niet al de rapporten aan te passen als er ooit iets veranderd in de bedrijfsgegevens
misschien is daarvoor geen tabel nodig, maar moest de gegevens toch ergens opslaan

klopt Michel Moedeloos werd ik er ook van, bij gebrek aan kennis

ik heb in het begin een Query gemaakt op de tabellen tblUnit tblPakbon tblpakbonregel
toen kreeg ik ook dubbele gegevens vandaar de oplossing die ik nu heb toegepast om ieder UnitID afzonderlijk af te drukken

Misschien moet ik de tblpakbonregel koppelen aan twee velden UnitID van de tblUnit. en PBID van de tblPakbon
de UnitID moet in de query inidergeval niet meerdere keren voorkomen

ik verder om de gegevens in een Query te zetten, als dat me lukt zou het moeten werken
zo niet meld ik me graag weer

toch bedankt voor je reactie het schep toch een ander licht in de duisternis :shocked:
 
en zo (althans das is de bedoeling) hoef ik niet al de rapporten aan te passen als er ooit iets veranderd in de bedrijfsgegevens
Dan zou ik daar een TempVar variabele voor gebruiken. Met zo'n tabel kan alleen maar (al dan niet per ongeluk) worden gerommeld.

toen kreeg ik ook dubbele gegevens vandaar de oplossing die ik nu heb toegepast om ieder UnitID afzonderlijk af te drukken
Dat was juist goed :). Op het moment dat je op basis van één gegeven (Klant) een tabel koppelt (Facturen, Bestellingen etc) dan krijg je, als je al die gegevens in één query zet, dubbele gegevens te zien vanuit het bovenliggende niveau. Dat dan op basis van het aantal bestellingen dat een klant doet. Als je aan Klant --> Bestellingen ook nog eens Bestelregels toevoegt, zie je de bestellingen ook nog eens herhalend, en dat geldt dan weer voor de bovenliggende bestellingen.

Dus als een klant 6 bestellingen maakt, met in totaal 52 artikelen, dan zie je de klantgegevens in de query 52 keer terug, en de bestelgegevens zo vaak als er bestelregels zijn voor een bestelling. Maar dat hoort dus!
Maak je vervolgens een rapport, dan groepeer je eerst op Klant --> Bestelling --> Bestelregels. En dan zie je dus de klant één keer, de 6 bestellingen elk één keer en per bestelling de bestelregels één keer. En dat is nu ook de kracht van rapporten. Vervolgens kun je dan natuurlijk later nog wel filteren op ofwel klant, ofwel een specifieke bestelling. Maar dat doe je dus allemaal vanuit die ene query waar alles gewoon in zit.
 
TempVar variabele. nog niet mee gerommeld, ik ga er meer over opzoeken bedankt voor de tip:thumb:

ja dat er meerdere UnitID mogen voorkomen ben in nu ook achter, en dat moet eigelijk ook
heb inmiddels een Query qryUnit gemaakt waarin alle gegevens zitten en getest met een knop die per UnitID een afdruk maakt en dat werkt nu ook met de groepen in het rapport

nu nog de juiste aantal pakbonregels van de UnitID. ik krijg nog steeds teveel afdrukken
en welk PBID ik ook wil afdrukken ik krijg altijd de eerste PBID en dan teveel keer af gedrukt en ook nog niet de evt tweede Unit
maar dat natuurlijk komen dat
Code:
 strSQL = "SELECT * FROM qryUnit "
dat ik nu een query opvraag voor de strSQL ipv tblUnit
of dat ik hier
Code:
strWhere = "WHERE [UnitID]=" & rs!PBID
iets niet fout doe

of moet ik qTemp aanpassen naar qryUnit
Code:
Dim qTemp As QueryDef
het rapport heeft nu als recordbron namelijk qryUnit

nog genoeg om uit te proberen
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan