pdf creëren in access geeft overbodig bestand

Status
Niet open voor verdere reacties.

steve3

Gebruiker
Lid geworden
26 nov 2017
Berichten
27
Omdat ik vaak dossiers dien in te scannen (pdf-formaat), en heel wat moet scrollen als ik dat
dossier dan in het klantendossier wil plaatsen, vond ik het een goed idee om
dat eindelijk eens te automatiseren.
Ik werk in access 97 en 2003, dus de later ingebouwde methode kon ik niet gebruiken.
Er bestaat nog zoiets als de Stephen Leban-code, maar die krijg ik niet aan de praat.

Nà veel probeerwerk (en googelen) heb ik de volgende code samengesteld en ze werkt.
(weet al dat ik commentaar ga krijgen, maar dat mag)


Ik heb een knop met 'event' on click. Ik werk vanuit een FORM [KREDIETEN] Met daarin een subform, waar de verschillende contractnummers en andere
dossiergegevens van de geopende klant inzitten.

Ik roep een rapport aan (VOORBLADKREDIETDOSSIER). DAT ZET IK EERST OM IN PDF FORMAAT
(Niet via Adobe, want dat lukt niet). IK zet dit dossier wel al in een hoofdmap, maar nog niet in
de correcte map, want om de één of andere reden blokkeerde dat. Ik gebruik de
'Sendkeys'-methode omdat ik daar de code van vond.

Vervolgens verander ik het gecreëerde bestand van naam en verplaats het naar de juiste map.
(Met Name .... AS werkt niet in 97, wel in 2003)
Hiernà open ik de pdf-file (met de normale PDF-writer, bij mij is dat Foxit, maar op kantoor is dat Adobe)
zodat ik meteen kan beginnen scannen.

Tot daar ben ik een tevreden man...
-------------------------

Het volgende gebeurt nog fout: Ik creëer wel mijn rapport als pdf ,
maar er wordt ook een pdf van mijn subform gecreëerd. (Als de pdf-writer
vraagt om het te 'saven' druk ik gewoon op annuleren, maar dat is niet echt
zoals het hoort).


2 vragen:
1)Hoe krijg ik die subform-pdf (KREDIETEN.PDF) weg?
2)Kan ik mijn normale pdf (in dit geval VOORBLADKREDIETDOSSIER)
automatisch laten saven, dus zonder dat ik zelf nog op ok-toets
dien te drukken.


Als er iemand een idee heeft hoor ik het graag.
(Ik heb voor de leesbaarheid de lange codes gesplitst met 'underscore' _ )
Ik weet niet of dat zo hoort...




Code:
Private Sub pdf_creëren_en_openen_Click()
   
   
    Dim rptName As String
   rptName = "VOORBLADKREDIETDOSSIER"
    Dim Filename As String
    Dim sPDFPath As String
    sPDFPath = "C:\Users\Documents\KREDIETMAP\" & LCase(Me.ACHTERNAAM & " " & Me.VOORNAAM)

   
    If Dir(sPDFPath, vbDirectory) = "" Then MkDir sPDFPath
   
   
Dim tmpPrinter As Printer
Set tmpPrinter = Application.Printer 'Default Printer
Set Application.Printer = Application.Printers("CutePDF Writer")
'Change the application printer to CutePdf writer or("another PDF Printer")

DoCmd.OpenReport (rptName), acHidden = 1
'Send the Open Report to a .pdf file
SendKeys "^p~" & Filename & "~", vbNormalFocus
'Close report
DoCmd.Close acReport, "RptPenalized"

' Restore Default printers
Set tmpPrinter = Application.Printer
Set Application.Printer = Application.Printers(0)


Dim started As Single: started = Timer
'het volgende commando even laten wachten tot het huidige uitgevoerd is
Do: DoEvents: Loop Until Timer - started >= 15
  
'het volgende commando even laten wachten tot het huidige uitgevoerd is

Do: DoEvents: Loop Until Timer - started >= 10

'het zopas gecreeerde pdf document van naam veranderen en naar de juiste map verplaatsen
Name "C:\Users\Documents\KREDIETMAP\VOORBLADKREDIETDOSSIER.pdf"_
 As "C:\Users\Documents\KREDIETMAP\" & LCase(Me.[ACHTERNAAM]_
 & " " & Me.[VOORNAAM]) & "\" & (Me.[ACHTERNAAM] & "" & Me.[VOORNAAM])_
 & " " & (Forms![KREDIETEN]![KREDIETEN SUBFORMULIER].Form![contractnummer]) & ".pdf"
 
 'het volgende commando voor de zekerheid even laten wachten tot het huidige uitgevoerd is
 
Do: DoEvents: Loop Until Timer - started >= 10

'het nieuwe pdf document openen zodat de overige documentenkunnen ingescand worden en meteen
'in de correcte map en met de juiste filename gesaved kunnen worden

Application.FollowHyperlink "C:\Users\Documents\KREDIETMAP\" & LCase(Me.[ACHTERNAAM]_
 & " " & Me.[VOORNAAM]) & "\" & (Me.[ACHTERNAAM] & "" & Me.[VOORNAAM])_
 & " " & (Forms![KREDIETEN]![KREDIETEN SUBFORMULIER].Form![contractnummer]) & ".pdf"


DoCmd.Close acReport, rptName, acSaveNo
End Sub
 
Ik snap weinig van je werkwijze, en al helemaal niks van je code want daarin zit geen enkele printopdracht van welk rapport dan ook. Al wordt er wel een rapport gesloten.... De code van Leban is best aan de praat te krijgen, ik heb 'm ook toegepast, maar heel fijne pdf-jes levert hij niet op. Alleen daarom al zou ik een overstap op 2010 overwegen als ik jou was, Sowieso had Access 97 al jaren stof moeten vangen in een hoek. A2k3 snap ik dan nog wel, want dat beschouw ik nog steeds als de beste Access versie, al heeft die dan dus wat beperkingen als het om pdf-jes gaat.

Formulieren afdrukken naar PDF? Lees ik dat goed? Dat zou ik sowieso nooit doen, want daar zijn formulieren niet voor ontworpen. Adrukken doe je per definitie vanuit een rapport. Rapporten een specifieke naam geven bij de export is inderdaad een beetje lastig. De truc die ik zelf gebruik, en die een stuk eenvoudiger is, is om eerst het te exporteren rapport te hernoemen naar de gewenste naam, dan te exporteren en vervolgens weer terug te zetten naar de oude naam. Dan heb je dus een stabieler systeem. Maar ik ben dus benieuwd naar de rest van de code...
 
Hey Octafish,


Dat afdrukken van een form is dus inderdaad niet de bedoeling. Bedoeling
is dat ik enkel mijn rapport omvorm tot pdf. Waarom ook mijn form afdrukt
begrijp ik dus niet. (maar ik kan die 'sendkeys' niet manipuleren, ik vind
er maar weinig over op het internet) -

Maar ik wil het rapport dus ook niet adrukken, want daar ben ik niets mee.
Het moet een pdf zijn op basis van het rapport. Zo kan ik meteen beginnen inscannen.
En dat doet de code dus wel. (ik heb het ook maar gevonden nà veel scrollen. Ik was er al twee
dagen mee zoet). En dit geeft een perfect resultaat -access kan een mens
gelukkig maken
- (buiten dan die formafdruk natuurlijk)
 
Bedoeling is dat ik enkel mijn rapport omvorm tot pdf. Waarom ook mijn form afdrukt begrijp ik dus niet. (maar ik kan die 'sendkeys' niet manipuleren, ik vind er maar weinig over op het internet)
Maar ik wil het rapport dus ook niet adrukken, want daar ben ik niets mee. Het moet een pdf zijn op basis van het rapport.
Ik snap echt niet waarom je met Sendkeys werkt, maar zolang ik de rest van de code niet kan zien, kan ik daar ook niks van zeggen. Een rapport druk je af als PDF, veel simpeler kan het niet zijn. Kwestie van een PDF printer gebruiken i.p.v. een echte printer. Ik heb geen flauw idee waarom er een formulier wordt afgedrukt, daarvoor hebben we echt de db nodig.
 
Ik heb het als volgt opgelost: met de alt+letter (Sendkeys) het 'save as' commando van de pdfwriter uitgevoerd
Dit zowel gedaan voor de correcte als voor de overbodige file.
Daarna de overbodige file terug gedeleted
Ik heb een beetje moeten spelen met de timer voor het correct werkte.

Het is een omweg, maar het werkt alleszins.
Resultaat: ik heb een cliëntenmap gecreëerd en er meteen de nieuwe pdf file in geplaatst
Deze wordt geopend met een hyperlink die me toelaat om meteen de rest van
het dossier in te scannen (met append) en nadien terug te saven zonder zoekwerk.

(volgens mij moet je access 2007 of hoger hebben om het op een makkelijke manier te doen)

Het enige wat ik nu nog moet doen is aan het einde van de code een regel toevoegen die de
hyperlink kopieert naar een veld in m'n tabel zodat ik
er maar op hoef te drukken om het dossier later terug te voorschijn te halen.
iets als 'strNewValue =kredietdossier("Link") & "#" & kredietdossier("Link")


Kan je me hier nog bij op weg helpen?


Code:
Private Sub pdf_creëren_en_openen_Click()
   
 


   Dim rptName As String
   Dim sPDFName As String
   sPDFName = "LCase(ACHTERNAAM & "" & VOORNAAM)"
   rptName = "VOORBLADKREDIETDOSSIER"
    Dim Filename As String
    Dim sPDFPath As String
    sPDFPath = "C:\Users\Documents\" & LCase(Me.ACHTERNAAM & " " & Me.VOORNAAM)

   
    If Dir(sPDFPath, vbDirectory) = "" Then MkDir sPDFPath
   
   
Dim tmpPrinter As Printer
Set tmpPrinter = Application.Printer 'Default Printer
Set Application.Printer = Application.Printers("CutePDF Writer")
'Change the application printer to CutePdf writer or("Bullzip PDF Printer")
Dim started As Single: started = Timer  'timer functie aanroepen voor gebruik in de code

DoCmd.OpenReport (rptName), acHidden = 1
'Send the Open Report to a .pdf file
SendKeys "^p~" & Filename & "~", vbNormalFocus
Do: DoEvents: Loop Until Timer - started >= 10
SendKeys "%O"
'de pdf writer vraagt of je ook het form kredieten wil opslaan als pd form , om dit te onderdrukken
'doen we sendkeys %O we zeggen in dit geval alt+O wat voor de pdf-writer wil zeggenslaop.Er is blijkbaar
'geen sneltoetscode om het te annuleren,dus we zullen in een volgend commando de file terug deleten
'de sendkeys vind je hier https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

Do: DoEvents: Loop Until Timer - started >= 15
'de timer op 5 seconden zetten was te kort dus maar op 15 gezet- nu het commando om de overbodige file te saven
SendKeys "%O"

'Close report
DoCmd.Close acReport, "RptPenalized"
' Restore Default printers
Set tmpPrinter = Application.Printer

Set Application.Printer = Application.Printers(0)


'het volgende commando even laten wachten tot het huidige uitgevoerd is
Do: DoEvents: Loop Until Timer - started >= 15
  


'het zopas gecreeerde pdf document van naam veranderenen en naar de juiste map verplaatsen
Name "C:\Users\Documents\KREDIETMAP\VOORBLADKREDIETDOSSIER.pdf" As "C:\Users\Documents\KREDIETMAP\"_
 & LCase(Me.[ACHTERNAAM] & " " & Me.[VOORNAAM]) & "\" & (Me.[ACHTERNAAM] & "" & Me.[VOORNAAM]) & " "_
 & (Forms![KREDIETEN]![KREDIETEN SUBFORMULIER].Form![polisnummer]) & ".pdf"
 
 'het volgende commando voor de zekerheid even laten wachten tot het huidige uitgevoerd is
 'ondertussen de overbodige file deleten met het Kill comando

     On Error Resume Next
     Dim aFile As String
aFile = "C:\Users\Documents\KREDIETMAP\KREDIETEN.pdf"
Kill aFile

   
Do: DoEvents: Loop Until Timer - started >= 10

'het nieuwe pdf document openen zodat de overige documentenkunnen ingescand worden en meteen in de correcte
' mappen met de juiste filename gesaved kunnen worden

Application.FollowHyperlink "C:\Users\Documents\KREDIETMAP\" & LCase(Me.[ACHTERNAAM] & " " & Me.[VOORNAAM])_
 & "\" & (Me.[ACHTERNAAM] & "" & Me.[VOORNAAM]) & " " & (Forms![KREDIETEN]![KREDIETEN SUBFORMULIER].Form![polisnummer]) & ".pdf"


DoCmd.Close acReport, rptName, acSaveNo
End Sub
 
oplossing gevonden:

Forms![KREDIETEN]![KREDIETEN SUBFORMULIER].Form![KREDIETDOSSIER] = "C:\Users\Documents\kredietentest" & LCase(Me.[ACHTERNAAM] & " " & Me.[VOORNAAM]) & "" & (Me.[ACHTERNAAM] & "" & Me.[VOORNAAM]) & " " & (Forms![KREDIETEN]![KREDIETEN SUBFORMULIER].Form![polisnummer]) & ".pdf"

genereert de link in het formulierveld
op de voorbeeldjpg kan je het resultaat zien in het hyperlinkveld 'KREDIETDOSSIER'

0001-1.jpg

Hier geraak ik echter zelf niet uit: in het subformulier staan 2 records (die elk staan voor een dossier): 123 en 124
(allebei dus gelinked aan dezelfde klant)
Als ik op mijn button druk (hier als voorbeeld button 26 genoemd) krijg ik de vraag naar het dossiernummer. Als ik het eerste
nummer opgeef (123)krijg ik als resultaat de nieuwe pdf met 123 en ook de hyperlink wordt ingevuld met 123 Dat is dus ok.

Maar als ik hetzelfde doe met dossiernummer 124 (het volgende in de lijst dus), dan bekom ik hiervan wel de correcte pdf,
maar de hyperlink blijft 123 en wordt bovendien ingevuld in het eerste record ipv het tweede.

Als iemand een idee heeft hoe dit op te lossen, dan hoor ik het graag.
 
Ik neem maar even aan dat je eerste record in het subformulier nog steeds actief is. Ik hou niet van dit soort oplossingen (aparte knop in een subformulier). Zelf zou ik dus ofwel een knop achter het record in het subformulier zetten, die dan automatisch de waarde van het juiste record in het subformulier overneemt (en dus jouw probleem oplost) ofwel een transparante knop maken over het hele record met dezelfde werking.
 
Ik heb het nu (bijna) in orde. De correcte files worden gecreëerd en in de juiste mappen geplaatst, waarna
het pdf-document geopend wordt.
Ik blijf in mijn subformulier echter de hyperlink altijd in het bovenste record geplaatst krijgen.
Dat wil zeggen als ik het document creëer met het tweede record, dan gaat alles correct, behalve
dat de hyperlink naar boven wordt geplaatst (in het eerste record dus).
( maw de eerste hyperlink wordt overschreven)

Octafish, ik heb jouw methode gebruikt. Lijkt me ook logisch. Probleem is dan echter dat de code blijkbaar ook naar het
eerste record springt, en dus een foutmelding geeft omdat access het document dezelfde naam
wil geven als het eerste record.
Ik krijg geen unieke verwijzing naar het contractnummer geplaatst.

Een tweede probleem is dat je niet meteen op de hyperlinks kan klikken. Access plaatst hyperlinks immers
met '##' tekens erachter. Die moeten eerst verwijderd worden.

Ik heb het geprobeerd met
Code:
 Replace("hier de hyperlink", "#", "")
maar access trapt er niet in.

ik doe het nu manueel, het is voor eigen gebruik, dus ik kan er wel mee leven, maar
als je een oplossing hebt hoor ik het graag.
 
Een tweede probleem is dat je niet meteen op de hyperlinks kan klikken.
Dit probleem snap ik niet helemaal; wellicht gebruik je een Hyperlink veld i.p.v. een tekstveld. In dat geval is de oplossing simpel (en sowieso aan te bevelen). Gebruik nooit hyperlink velden in een database maar altijd tekstvelden. Met de opdracht FollowHyperlink gaat het namelijk altijd goed.
 
Ik heb er een tekstvak van gemaakt met Followhyperlink in de code. Werkt perfect.
(alleen dat jumpen naar het eerste record van het subform
vind ik niet. Heel veel over geschreven, maar blijkbaar niet
op te lossen).

Bedankt Octafish
 
Heel veel over geschreven, maar blijkbaar niet op te lossen.
Wel door mij.... Ik heb je zelfs al een werkende oplossing aangereikt. Wat heet: twee :). Ik heb er in ieder geval nooit problemen mee gehad. Dus het kan echt wel opgelost worden.
 
octafish, ik ben dankbaar voor de hints die je me geeft,
maar ik heb het geprobeerd met jouw methode
(code in de knop op het subform zetten) ,
maar de cursor blijft springen naar het eerste record.
Enkel als ik tijdens de uitvoering van de code met de cursor op
de tweede rij ga staan - dus manueel - (de rij van waaruit de code wordt bestuurd)
wordt de hyperlink (tekstvak) ook echt in het correcte vak ingevuld.
(en bij het googlen blijk ik daarin niet de enige te zijn. Ik heb ook al
het subform via de wizard opnieuw gecreëeerd, maar zonder resultaat).
master en subform zijn gelinked via idklantnummer één op veel
Ik vrees dat ik enkel met een soort regel: setfocus where [...] = [......]
code uit de problemen kom. Maar ik vind de correcte code niet.
(blijkbaar een sql vermengd met vba - waar ik nog minder van ken dus).
Mocht je me daar nog verder in kunnen helpen hoor ik het graag.

P.S.: ik heb nu de 'hyperlink' on event double click in een tekstvak geplaatst,
wat perfect werkt (voor het eerste record dan)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan