printer dialoogvenster oproepen en instellingen wijzigen voor vba recordset

Status
Niet open voor verdere reacties.

JohanRVT

Gebruiker
Lid geworden
2 mrt 2011
Berichten
555
In mijn vorige thread gebruik ik een vba recordset die meerdere rapporten na elkaar afprint, (indien deze werden aangevinkt door de gebruiker in een formulier met subformulier).
Nu zouden onze dames graag voor het startten van de printreeks de printerinstelling op duplex kunnen zetten (en de lade kiezen zou nog een pluspunt kunnen zijn)
Voor een enkelvoudig rapport is dit geen probleem via het opnemen van de regel "RunCommand acCmdPrint" in de printopdracht van dat ene rapport.
Bij de recordset lukt dat niet; plak je de regel ervoor dan print je het formulier ipv de rapporten; plak je 'm erna of erin dan loopt de recordset niet.
Of hoe op te lossen?
Even hieronder een deel van de code
Code:
Set rs = dbsCurrent.OpenRecordset("select Tbl_documenten_benamingen.* " _
                                           & "FROM Tbl_documenten_benamingen " _
                                           & "WHERE Directprintcontract = True And Directprint = True And RES = True" _
                                           & "ORDER by Directprintcontractsort asc")
'Printerinstelling dialoog scherm openen
RunCommand acCmdPrint
        If (Not rs.EOF) Then
                    rs.MoveFirst
                    Do Until rs.EOF = True

                        stDocName = rs("Documentnaam")
                        strWZC = rs("WZC")
                        strfamilie = rs("Familie")
                        strapotheek = rs("Apotheek")
                        If strWZC = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar WZC" & "|" & "Residentieel"

                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                        If strfamilie = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar familie" & "|" & "Residentieel"
                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                        If strapotheek = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar Apotheek" & "|" & "Residentieel"
                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                    rs.MoveNext
                    Loop
        End If
        
            rs.Close
            Set rs = Nothing
            dbsCurrent.Close
 
Volgens mij kun je niet bij de printerinstellingen vanuit zo'n procedure. Sowieso onderbreek je de uitvoering van de code als je een Windows dialoogvenster gebruikt. Je zou wellicht zelf een formulier kunnen bouwen voor de printerinstellingen en de gekozen waarden meegeven bij de printopdracht. Maar ik zou er niet aan beginnen. Als het al kan, moet je nogal diep in de API's graven...
 
De printerinstellingen aanpassen naar bv duplex (en dan opslaan) in een aparte procedure vooraleer de printprocedure te startten zou ook genoeg zijn en het gebruiksgemak van de DB enorm verhogen. Het gaat wel om een netwerkprinter maar in princiep gaat er geen andere gebruiker die instellingen wijzigen in die fractie van een seconde die er dan kan verstrijken voor het eigenlijke printen. Zou heel mooi zijn dat dan de standaard instelling terug wordt gezet na het printer in bv een derde procedure.
In de help van Access staan er veel commando's bij de accmdprint, ik heb al verschillende api's en dll's gezien (en geprobeerd) maar geraak er (nog) niet uit maar een schermpje oproepen, de instellingen toepassen en opslaan bij het drukken op OK (zoals je met Ctrl+P doet bij een Afdrukvoorbeeld van een rapport) moet toch wel ergens te doen zijn.
 
Het dialoogvenster openen heeft ook geen enkele zin, omdat je dan de procedure verlaat. En daar kom je dan nooit meer terug. Ik heb zelf ook wel eens geprobeerd om via VBA de printerinstelling aan te passen (naar duplex bijvoorbeeld) maar het is mij ook nooit gelukt. Ook al kon ik met een msgbox bevestigen dat het aanpassen prima gelukt was. Ik steek er in ieder geval geen tijd meer in :). Laat de gebruiker maar zelf bepalen via het menu wat-ie wil...
 
Ook niet als je dit bv in 2 aparte functiemodules giet en na elkaar "callt"?
 
Heb je volgens mij 2 knoppen nodig. Nogmaals: je stopt met de procedure; je kunt niet pauzeren om even een uitstapje te maken. Die moet daarna de procedure dus weer opnieuw starten.
 
Dat zou geen probleem zijn; twee knoppen drukken met daartussen de instellingen aanpassen en Ok drukken moeten ze wel kunnen mee leven onze dames ;)
 
Een werkbaar compromis gevonden waar ons dames (voorlopig) mee kunnen leven :rolleyes: ; eerste methode waarbij je dus eerst je printerinstelling via windows\configuratiescherm\printers instelt (met snelkoppeling op bureaublad naar de printer in kwestie) met dan een algemene printknop met subroutine die de in een formulier aangevinkte rapporten na elkaar afprint waarbij je ook nog eens vooraf een gewenst aantal afdrukken kunt bepalen per rapport (een paar rapporten moeten namelijk 3x of meer geprint worden) en een tweede methode waarbij als je dubbelklikt op een recordkiezer van een rapportnaam in het subformulier je eerst het printerdialoogvenster krijgt (via het "RunCommand acCmdPrint" commando) waar je dus makkelijk duplex kunt kiezen en je dat ene rapport krijgt.
Algemene printcode
Code:
Set rs = dbsCurrent.OpenRecordset("select Tbl_documenten_benamingen.* " _
                                                       & "FROM Tbl_documenten_benamingen " _
                                                       & "WHERE Directprintcontract = True And Directprint = True And RES = True " _
                                                       & "ORDER by Directprintcontractsort asc")
        If (Not rs.EOF) Then
                    rs.MoveFirst
                    Do Until rs.EOF = True
                        stDocName = rs("Documentnaam")
                        stDocId = rs("Documentid")
                        strWZC = rs("WZC")
                        strfamilie = rs("Familie")
                        strapotheek = rs("Apotheek")
                        If strWZC = True Then
                            For CopieCounter = 1 To Nz(DLookup("WZC_aantal", "Tbl_documenten_benamingen", "Documentid= " & stDocId), "1")
                                stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                                DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar WZC" & "|" & "Residentieel"
                                DoCmd.Close acReport, stDocName, acSaveNo
                            Next CopieCounter
                        End If
                        If strfamilie = True Then
                            For CopieCounter = 1 To Nz(DLookup("familie_aantal", "Tbl_documenten_benamingen", "Documentid= " & stDocId), "1")
                                stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                                DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar Familie" & "|" & "Residentieel"
                                DoCmd.Close acReport, stDocName, acSaveNo
                            Next CopieCounter
                        End If
                        If strapotheek = True Then
                            stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                            DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar Apotheek" & "|" & "Residentieel"
                            DoCmd.Close acReport, stDocName, acSaveNo
                        End If
                    rs.MoveNext
                    Loop
        End If
        
            rs.Close
            Set rs = Nothing
            dbsCurrent.Close

Hier de dubbelclick code
Code:
    stBNummer = [TempVars]![PDBNummer]
    stDocName = "" & Me.Documentnaam.Value & ""
    strWZC = "" & Me.WZC.Value & ""
    strfamilie = "" & Me.Familie.Value & ""
    strapotheek = "" & Me.Apotheek.Value & ""
    If (IsNull([TempVars]![PDBNummer])) Then
        MsgBox "Er is eerder geen bewoner geselecteerd, herbegin", vbOKOnly + vbInformation, "Waarschuwing"
        DoCmd.Close
        [Forms]![Hoofdschakelbord_01].SetFocus
        [Forms]![Hoofdschakelbord_01].cmbBewoner.SetFocus
                Exit Sub
    End If
    If strWZC = False And strfamilie = False And strapotheek = False Then
            MsgBox "Niets aangevinkt! " & vbCrLf & _
                   "Dit rapport " & stDocName & " kan niet worden afgedrukt." & vbCrLf & _
                   "Vink minstens één item hiernaast aan!", vbOKOnly + vbCritical, "Opgelet"
                        Exit Sub
    End If
    If strWZC = True Then
        stLinkCriteria = "[BNummer] = " & [TempVars]![PDBNummer]
        DoCmd.OpenReport stDocName, acViewPreview, , stLinkCriteria, , "Exemplaar WZC" & "|" & "Residentieel"
        RunCommand acCmdPrint
        DoCmd.Close acReport, stDocName, acSaveNo
    End If
    If strfamilie = True Then
        stLinkCriteria = "[BNummer] = " & [TempVars]![PDBNummer]
        DoCmd.OpenReport stDocName, acViewPreview, , stLinkCriteria, , "Exemplaar familie" & "|" & "Residentieel"
        RunCommand acCmdPrint
        DoCmd.Close acReport, stDocName, acSaveNo
    End If
    If strapotheek = True Then
        stLinkCriteria = "[BNummer] = " & [TempVars]![PDBNummer]
        DoCmd.OpenReport stDocName, acViewPreview, , stLinkCriteria, , "Exemplaar Apotheek" & "|" & "Residentieel"
        RunCommand acCmdPrint
        DoCmd.Close acReport, stDocName, acSaveNo
    End If
 
De dames stellen dus hun printer eigenschap voor het printen in op duplex\links binden maar ze maken mij er attent op dat er toch nog regelmatig willekeurig rapporten niet dubbelzijdig worden afgeprint, vnl die in het begin van de printreeks, op het einde van de printreeks zijn die meestal goed. Een geheugenprobleem van de server of de printer?
Hoe kunnen we een rapport afdruk forceren steeds dubbelzijdig afgeprint te worden?
 
Even voor de goede orde: worden de rapporten wel goed afgedrukt als ze het handmatig instellen?
 
Ja, via de dubbelklik "functie" kunnen ze de rapporten stuk voor stuk "handmatig" afdrukken en dan is het dubbelzijdig afdrukken geen probleem voor alle rapporten die uit meerdere pagina's bestaan.
De dames zijn nu aan het experimenteren om in blokken te werken en te zien tot welk aantal ze kunnen gaan vooraleer er weer willekeurig geen dubbelzijdig afgeprint worden.
Enige probleem is dat bij echt testen er veel papier en toner wordt verbruikt.
NB: zoals steeds vragen ze gemakzuchtig een knopje om alle vinkjes ineens aan te vinken, weg te doen, per kolom, een zestal configuraties die ze kunnen opslaan, terugzetten, etc..... (zie printscreen)
printscreen.jpg
 
Gezien de moeite en tijd die je er al in gestoken hebt, en de instabiliteit van het geheel, zou ik het al lang hebben opgegeven! Je had een paar dagen zelf die rapporten handmatig af kunnen drukken :). Voor mij is het een stukje werkinstructie en moet een gebruiker zelf in staat zijn om dubbelzijdig af te drukken. In Prince2 termen: het hoort thuis bij de business, niet bij Functioneel Beheer.
 
Opgeven is hier geen optie, stelselmatig proberen dingen te verbeteren (=in minder klikken hetzelfde beter en/of sneller doen) is wat we steeds doen. :confused:
Ga eens pogen los van de server te werken en/of met een andere printer. Heb er ook geen idee van wat het interne geheugen van die printer is.
 
Je kent de 80-20 regel? Volgens mij ben je daar al ver voobij:). Automatiseren ten koste van (veel) andere zaken omdat een bepaalde groep gebruikers te beroerd is om zelf even een afdrukinstelling aan te passen (wat een paar seconden kost) en daar uren dure ontwikkeltijd insteken is (gelukkig) in mijn organisatie prima bespreekbaar. Ik heb dus zwaar medelijden met jou dat bij jullie onredelijke eisen aan de ict worden gesteld...
 
De dames van de bureau zijn andere mensen dan de IT'ers, (gelukkig maar ;) ) en die dames eisen niets maar ze verloren vroeger ENORM veel tijd met het steeds weer opstartten Word, afdrukken gekoppeld documentje, weer afsluiten Word om dan de cyclus te herbeginnen met een volgend documentje. Dat was echt een frustrerend probleem aangezien hier een standaard dossier een 34-tal documentjes heeft.:evil: (Nu is 't opgelost in enkele klikken en 35 seconden PC tijd en 2 minuten printtijd maar dan wel soms niet recto-verso)
 
Ik zeg ook niet dat je alles via Word moet doen; Access rapportjes afdrukken is toch ook niet lastig? Enniewee, daar heb jij je probleem niet mee opgelost :).
 
Heb nu een "wachttijd" ingebouwd in de recordset functie waarbij je via een TxtDelay formulierveldje een getal kan invoeren die de "sleep" functie gebruikt zodat de printer meer tijd krijgt om zijn ding te doen. We denken namelijk dat de toevloed van afdrukopdrachten te groot en te snel gaat. Tevens heb ik de ICT' ers zover gekregen dat ze twee printer's hebben geïnstalleerd (de ene als duplex en de andere normaal) zodat ik elk rapport aan de specifieke printer kan koppelen. Denk dat met een beetje spelen met de sleeptijd (is nu standaard 5 (seconden) we er nu wel zullen geraken om de printsequentie goed te laten verlopen en toch snel te werken.
Is het nodig dat je nog 's een DoEvents commando bijvoegt in de sub? Ik heb ze nu uitgevinkt en 't maakt geen verschil op eerste gezicht en de processorbelasting valt ook nog mee.

Knipsel uit de sub
Code:
              strdelay = Me.TxtDelay
                        If strWZC = True Then
                            For CopieCounter = 1 To Nz(DLookup("WZC_aantal", "Tbl_documenten_benamingen", "Documentid= " & stDocId), "1")
                                stLinkCriteria = "[BNummer] = " & Me!TxtBNummer.Value
                                DoCmd.OpenReport stDocName, acViewNormal, , stLinkCriteria, , "Exemplaar WZC" & "|" & "Residentieel"
                                DoCmd.Close acReport, stDocName, acSaveNo
                            Next CopieCounter
                        End If
                        'X seconden tijd laten verstrijken tussen het printen van de opdrachten vooraleer de volgende opdracht te beginnen.
                        'DoEvents
                        Wait (strdelay)
                        'DoEvents
                    rs.MoveNext
                    Loop

De functie zelf in de basfuncties module
Code:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim i As Integer
Public Function Wait(dblSeconds As Double)
    For i = 1 To dblSeconds * 100
        DoEvents      ' handle events
        Sleep (10)    ' suspend process without a performance hit
    Next
End Function
 
Krijg van de dames te horen dat het systeem goed werkt en alles nu netjes geprint wordt zoals het hoort maar dat de rapporten er in een soort van random volgorde uit de printer komen terwijl ze ze wel mooi in de gevraagde volgorde zien verwerkt worden op de PC. Lijkt alsof de printspooler de rapporten random in de wachtrij zet.; je zou denken dat de laatste opdracht als laatste in de wachtrij worden bijgevoegd maar dat is niet zo; gebeurd een random blijkbaar; Hoe is dit op te lossen, vindt niets bij de printerconfiguratie. Hierdoor moet er achteraf wel een en ander gesorteerd worden.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan