VBcode rapport opslaan als PDF

Status
Niet open voor verdere reacties.

Bospeen

Gebruiker
Lid geworden
23 aug 2005
Berichten
150
Beste forumleden,
Ik gebruik bijgevoegde code om een rapport op te slaan als PDF (in een specifieke map).
Deze code werkt goed bij de meeste gebruikers van de applicatie, maar bij een enkeling loopt de applicatie hierna regelmatig vast. Ik kan dit niet verklaren.
Wil iemand mijn code eens reviewen? Misschien schort er toch iets aan.

Code:
Private Sub Knop_PDF_Click()

On Error GoTo Error_Knop_PDF

DoCmd.RunCommand acCmdSaveRecord

If Len(Dir("C:\ARCHIEF\" & Me.dos_id & "\PRS", vbDirectory)) = 0 Then
MsgBox "De archiefmap bestaat (nog) niet, maak deze eerst aan.", vbOKOnly, "Archiefmap ontbreekt"
Exit Sub

End If

MsgBox "Het PDF-bestand wordt opgeslagen in de archiefmap." & _
vbCrLf & "Klik op Ok en wacht op de gereedmelding.", vbOKOnly, "Opslaan als PDF bestand"

DoCmd.OutputTo acOutputReport, "Rapport_1", acFormatPDF, "C:\ARCHIEF\" & Me.dos_id & "\PRS\" & "dossier_" & Me.dos_id & ".pdf", False
DoCmd.Close acReport, "Rapport_1", acSaveNo

MsgBox "Het PDF-bestand is opgeslagen in de map" & _
vbCrLf & "C:\ARCHIEF\" & Me.dos_id & "\PRS", vbOKOnly, "PDF bestand opgeslagen"
Exit Sub

Error_Knop_PDF:
MsgBox "Het PDF-bestand kan niet worden opgeslagen." & _
vbCrLf & "Neem contact op met de systeembeheerder.", vbOKOnly, "PDF bestand niet opgeslagen"
Exit Sub

End Sub
 
Ik snap niet helemaal waarom je de map niet aanmaakt als hij niet bestaat; kleine moeite en de gebruiker kan gewoon door met het werk. Maar dat zal je probleem wel niet zijn. Verder snap ik niet waarom je het rapport sluit; in de code wordt hij niet geopend. En om een export te maken van een rapport hoef je dat niet te openen. Beter van niet lijkt mij.
Verder zitten er naar mijn smaak wel erg veel Messageboxen in je routine; de gebruiker blijft maar klikken! Ik zou zeggen: één keer klikken om het rapport op te slaan, en hooguit een melding als dat gelukt is, of een melding als dat niet lukt.

Je geeft niet aan waar het fout gaat bij de gebruikers; misschien kun je dat nog aangeven?
 
Hi Octafish,

Dat de map hier niet wordt aangemaakt komt omdat de mapstructuur in feite veel complexer is en afhankelijk van 'andere factoren'. Voor het voorbeeld heb ik de code hierop wat vereenvoudigd, omdat ik ook al dacht dat dit niet de oorzaak kan zijn.
Het rapport niet sluiten... dat heb ik over het hoofd gezien, dat ga ik aanpassen. Misschien dat dat het 'vastlopen' in de hand werkt.

Waar het fout gaat bij gebruikers...
Bij de meeste gebruikers gaat het goed, maar bij enkelen loopt de applicatie regelmatig vast (niet altijd). Waar het dan fout gaat: de laatste Messagebox "Het PDF-bestand is opgeslagen etc." wordt niet getoond (of popt niet naar de voorgrond op?) en de gebruiker kan klikken wat ie wil, maar er gebeurt niks meer (de eerste Messagebox verscheen wel, dus de map bestond al)
 
Het zinnetje dat er gebruikers zijn doet me denken aan de mogelijkheid dat die bepaalde gebruiker bij wie het vastloopt geen\onvoldoende rechten hebben om te schrijven naar C:\Archief\..... ? Gedeelde DB 's zet ik nooit in een C:\ maar ergens in een gedeelde andere partitie.
 
Laatst bewerkt:
@Johan: TS zegt nergens dat de gedeelde db op de C-schijf staat; volgens mij gaat het hier om het opslaan op de C-schijf van de rapporten. En elke gebruiker zou rechten moeten hebben op de eigen C-schijf, tenzij je op een virtuele server werkt (zoals wij doen); dan heb je geen C-schijf.
 
Zie toch soms rare zaken dat de gebruiker van de eigen PC niet zomaar iets kan opslaan op de eigen C:\ partitie terwijl het op een andere, aparte D:\ partitie, dus weg van de systeem partitie wel kan.
 
De suggestie
Verder snap ik niet waarom je het rapport sluit; in de code wordt hij niet geopend. En om een export te maken van een rapport hoef je dat niet te openen. Beter van niet lijkt mij.
heb ik opgevolgd en een Me.Refresh toegevoegd.... lijkt na een dagje testen goed te gaan!

Bedankt voor het meedenken!!
 
oeps, te vroeg gejuichd

Helaas, het probleem blijft zich toch nog voordoen!
De gebruiker bij wie zich deze "vastlopers" voordoen, kan de applicatie hierna via Taakbeheer "activeren", waarna deze wél weer correct werkt. Het Pdf-bestand blijkt dan ook keurig opgeslagen.
Het lijkt eerder op een geheugenprobleem... de code draait wel goed af, maar het scherm wordt hierna niet goed getoond of zoiets.

Als iemand hier nog iets zinnigs op kan zeggen, dan hou ik me aanbevolen!

Ps. de database staat inderdaad niet op C.
 
Dat lijkt niet zozeer op een ‘vastloper’ maar op een verlies van focus waardoor de db niet zichtbaar is.
 
De database staat niet op de c:\ maar je probeert wel je PDf op te slaan op de C:\ al eens geprobeerd om die PDF op te slaan waar je DB staat in een bepaalde submap?
 
Het pad wordt hard geprogrammeerd; dat zou totaal niet uit mogen maken. Ik zou hooguit de controle anders doen:
PHP:
If Dir("C:\ARCHIEF\" & Me.dos_id & "\PRS", vbDirectory) = "" Then
En zeker weten dat Me.dos_id niet leeg is, want dan gaat het geheid fout.
 
Alle gebruikers hebben schrijfrechten op C, dat kan het probleem niet zijn.
De controle op de aanwezigheid van de map gaat ook goed en een dos_id is er altijd, want die controle wordt elders al gedaan (bij aanmaak van de archiefmap)
Het lijkt inderdaad op een verlies van focus, die zich soms bij een enkele gebruiker voordoet... alsof die een geheugenprobleem heeft of zoiets, want het merendeel van de gebruikers hebben dit probleem niet.

Zou een me.refresh of me.requery aan het einde van de code kunnen helpen om de focus af te dwingen?
 
Bij ons loopt Access vast als er tegrote rapporten tegelijk naar de printspooler van de server worden gestuurd, dus moesten we een soort "wait" functie inbouwen, maar jij maakt er maar één tegelijk en dan nog in PDF. Zou mij sterk verbazen dat het om een gehuegen probleem gaat.
Je hebt ook nog het .setfocus commando in VBA? Misschien kun je dat ergens gebruiken?
 
de PDF-knop bevindt zich op een pop-up formulier. Iedere keer dat de gebruiker de "vastloper" constateert verschijnt wel de melding dat het Pdf-bestand is opgeslagen, maar het formulier verschijnt niet meer terug. Het blijft ergens op de achtergrond en wordt pas weer zichtbaar na opnieuw activeren van de applicatie in taakbeheer. Zou een setfocus op het formulier bij einde van de code dit kunnen voorkomen?
 
Dan kun je eens proberen om je verborgen formulier terug naar voor te halen door op het einde van de PDF code maken deze code toe te voegen die een verborgen formulier naar voor haalt/zichtbaar maakt als het geladen was maar ergens verborgen zat.
Code:
If CurrentProject.AllForms("UwFormulierNaam").IsLoaded Then
        Forms.UwFormulierNaam.Visible = True
End If
 
Ik heb het geprobeerd, maar ook met deze aanpassing blijft de storing zich voordoen, dus dat het formulier waarop zich de knop bevindt niet meer "actief" wordt.

Ik heb nu de eerste messagebox eruit gehaald, zodat de code meteen begint met opslaan en niet pas nadat gebruikers eerst op Ok moeten klikken in de messagebox.
Wordt vervolgd...
 
Hoe ziet je complete code er nu uit?
 
Code:
Private Sub Knop_PDF_Click()

On Error GoTo Error_Knop_PDF

If Len(Dir("C:\ARCHIEF\" & Me.dos_id & "\PRS", vbDirectory)) = 0 Then
MsgBox "De archiefmap bestaat (nog) niet, maak deze eerst aan.", vbOKOnly, "Archiefmap ontbreekt"
Exit Sub

End If

DoCmd.OutputTo acOutputReport, "Rapport_1", acFormatPDF, "C:\ARCHIEF\" & Me.dos_id & "\PRS\" & "dossier_" & Me.dos_id & ".pdf", False

MsgBox "Het PDF-bestand is opgeslagen in de map" & _
vbCrLf & "C:\ARCHIEF\" & Me.dos_id & "\PRS", vbOKOnly, "PDF bestand opgeslagen"
Exit Sub

Error_Knop_PDF:
MsgBox "Het PDF-bestand kan niet worden opgeslagen." & _
vbCrLf & "Neem contact op met de systeembeheerder.", vbOKOnly, "PDF bestand niet opgeslagen"
Exit Sub

End Sub

Het opslaan duurt ca. 20 seconden, daarom de messagebox om de gebruiker erop te attenderen dat het opslaan is voltooid (de zandloper stopt namelijk al eerder)
 
Laatst bewerkt:
En je weet zeker dat de gebruiker ondertussen niet wat anders is gaan doen? 20 seconden is best lang als je moet wachten. Dan gaat een gebruiker al gauw ergens anders op klikken. En dan snap ik het wel. Maar als je de computer gewoon zijn werk laat doen, zou de focus gewoon op het formulier moeten blijven staan.
Je zou dat formulier nog in acDialog modus kunnen openen, zodat de gebruiker in ieder geval binnen de applicatie niks anders kan doen. Al voorkom je daar dus niet mee dat ze in de tussentijd even de mail gaan lezen. Om maar eens wat te noemen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan