bmads
(18.015 point. Point ude: 360)
Masseproduktion af PDF-filer
Jeg har nogle rapporter i min O2007-database, der skal masseproduceres til PDF-filer med ganske små ændringer.
Hver rapport skal ende med at blive til omkring 1.000 PDF-filer, der hver især er ændret på et eller flere kriterier.
Mine kriterier er gemt i en separat tabel.
Jeg kan danne ét langt dokument, hvor der er sideskift for hver ny værdi i kriteriet, men mit ønsker er et nyt dokument, for hver ny værdi.
Mit bedste bud har hidtil været en fancy makro, men min fantasi rækker ikke mere, og jeg er "gået død" i min efterforskning efter nye muligheder.
Er der hjælp at hente derude?
Skrevet man. d. 08. juni 2009 kl. 14:14:00| #1
Først må jeg lige sige, at jeg ikke kender access 2007 og dermed dens eventuelle pdf færdigheder.
Men, jeg ville ikke løse den opgave i ms-access - altså raportgenereringen
Fint nok, med access database og datafangst, men der printerdims der har fået sit faneblad - thumbs down!
Jeg har selv tænkt på noget bedre, men har ikke haft tid til at chekke det ud: iText og java over odbc.
Skrevet man. d. 08. juni 2009 kl. 19:51:29| #2
Tak for indlægget, men jeg er lidt bundet af Access, da det er der, dataene ligger.
Så indtil videre er det den vej, jeg vil forsøge at finde en løsning.
Hvis du har en ide til en kombination, hvor de "flade data" fra Access kan viderebehandles på anden måde, er jeg meget lydhør.
Skrevet man. d. 08. juni 2009 kl. 21:25:32| #3
Nej - den eneste hvorpå du ikke er bundet af access er mht. hvor data ligger.
Heldigvis er implementationen af en database i windows vha. ms-access ikke mere åndsvag, end der er adgang til databasen fra et hvert ordentligt programmeringssprog.
I MS regi: C,C++,C#, asp (vbscript) og sikkert flere, på samme måde som når man anvender recordset i vba.
I java kender jeg til det over ODBC.
Grunden til at det er spild af tid, er at en access raport aldrig bliver andet en noget der skal printes.
Når man bruger tid på at lave en præsentation, er det rimmeligt at have en ambition om det det skal være en generelt anvendelig stream: - kunne sendes, præsenteres i forskellige sammenhænge, kunne renderes som komponent i ander setup, og konvereret til forskellige formaterer.
En access raport (kender kun til access 2000) - kan konvertes til en .rtf fil - dvs. alt hvad der ikke er kontrolelementer eller billeder - så, hvis man er til ascii grafik kan man lave noget anno 1990, der kan sendes eller bruges andre steder.
Ingen anvisninger herfra på at bruge tid på at sammensætte 'viderebehandlet data' i en ms-access raport.
Skrevet man. d. 08. juni 2009 kl. 21:46:41| #4
det er lidt svært når man ikke kan se opbygningen af din/dine rapporter... men du er nød til at styre det fra vba'en lav din forespørgsel, som jo nok er dine ca. 1000 poster, som hver især skal være en rapport, så kører du en løkke, som åbner en rapport op med teksterne fra den pågældende post...
Rapporten er så sat op til at udskrive til en pdf-writer. Du skal nok ind og styre navngivning og hvor den skal gemme fra vba, men det kan helt sikkert lade sig gøre!~)
Jeg kan ikke hjælpe dig meget mere lige nu, da jeg sidder med et andet projekt, men jeg kigger lige på det imorgen.... eller ser interesseret til hvis en anden har smidt en løsning!~)
Skrevet man. d. 08. juni 2009 kl. 23:38:33| #5
OK ellebe, men tak for din interesse
Skrevet man. d. 08. juni 2009 kl. 23:46:54| #6
Hej spg
For lige at give dig et indtryk af problemet, så har jeg en tabel med omkring 30.000 records. Disse informationer er lagt ind af omkring 1.000 personer.
Tabellen har også en kolonne, hvor personernes ID er angivet, og der er dermed ca. 30 informationer pr. person.
Det er derfor disse rapporter skal genereres med et eksemplar (1 pdf-fil) til hver person, der således kan se egne opdateringer.
Alt er samlet i denne ene tabel af hensyn til min behandling af data.
Jeg håber det giver mening.
Endelig er det af hensyn til kompleksitet og andre personers mulighed for at gennemskue systemet, at jeg har valgt at beholde Access og gøre processerne så enkle som muligt.
Altså ikke noget C eller C++, men VBA er OK
Skrevet tir. d. 09. juni 2009 kl. 07:11:45| #7
Før du begynder med noget fancy til Adobe PDF så check lige M$' egen PDF 'plugin' til Office 2007.
Den er rent faktisk ikke så tosset og den er kontrollerbar direkte fra VBA
DoCmd.OutputTo acOutputReport, 'reportname', acFormatPDF, 'FileName'
Og det du skal ud i er at danne kriterier for rapporten i et recordsetloop og så udskrive for hver record. I recordsettet vil du nok også kunne finde værdier der kan bruge til navngivning.
Skrevet tir. d. 09. juni 2009 kl. 09:34:07| #8
enig med hugopedersen og hvis M$ har lavet et plugin, så bliver det ikke meget nemmere.
I forespørgslen som er postkilde for rapporten, der laver du et kriterie for eks. id på personen: get_global('HentId')
Modul:
************
option compare database
option explicit
public Gbl_id as string
public function get_global(i as string)
select case i
case "HentId"
get_global=gbl_id
end select
end function
public function SendPdf
dim db as dao.database
dim rst as dao.recordset
set db=currentdb()
set rst=db.openrecordset("NavnPåPersonTabel")
with rst
.movefirst
do
Gbl_id = !idPåPerson
docmd.outputto acoutputreport, "NavnPåRapport", acformatpdf, "StiHvorDerSkalGemmes\RapportNavn" & !IdEllerNavnPerson & ".pdf"
.movenext
loop until .eof
.close
end with
end function
***************
Så laver du en knap med: call sendpdf
eller du går i immidiate vinduet og skriver sendpdf!~)
Skrevet tir. d. 09. juni 2009 kl. 09:47:47| #9
Nøjagtig som jeg har gjort det :-)
Og hvis jeg får en mail på oz8hp snabelting hotmail punktum com
så har jeg et eksempel der kan illustrere funktionen i Access 2007
Skrevet tir. d. 09. juni 2009 kl. 09:50:51| #10
PS: der er dog en lille detalje ved metoden - Access kommer med et spørgsmål om man vil overskrive hvis filen eksisterer.
Det betyder at man skal lave en funktion der forsøger at slette filen før output hvis det skal være helt automatisk.
PPS: eksemplet kræver at du har et directory på c: der hedder Temp
Skrevet tir. d. 09. juni 2009 kl. 09:59:25| #11
man kunne også sætte & Date() & ind i filnavnet!~)
Skrevet tir. d. 09. juni 2009 kl. 10:00:02| #12
Skrevet tir. d. 09. juni 2009 kl. 15:54:32| #13
Nu rolig - og indtil videre tak.
Det er ret vildt - og sikkert rigtig godt - alt det I har givet indtil nu. Budskabet er opfattet (og vistnok også forstået)
Jeg trækker lige vejret, mens jeg afprøver i praksis. I hører begge fra mig inden længe.
Skrevet tir. d. 09. juni 2009 kl. 17:29:55| #14
Så har jeg afprøvet modulet, og det virker - dog ikke optimalt endnu.
Jeg har midlertidigt ændret output til xlsx filer, og det giver ingen problemer.
MEN - i linien Gbl_id = !idPåPerson kan jeg ikke gennemskue, hvad der skal stå efter lighedstegnet.
Hvis jeg selv angiver en værdi fra personlisten, virker programmet som det skal (for den person, der er angivet), men hvad skal der skrives, for at programmet selv henter alle de aktuelle værdier?
(det ser ellers rigtig godt ud)
Skrevet tir. d. 09. juni 2009 kl. 21:47:27| #15
du skal skrive ! og så navnet på det felt i din forespørgsel, som har den værdi du skal bruge i dit kriterie!~)
Skrevet tir. d. 09. juni 2009 kl. 22:35:46| #16
Det er kanon-godt.
Tak til begge for jeres deltagelse. Jeg håber, det er ok at dele point'ene
Skrevet tir. d. 09. juni 2009 kl. 23:05:44| #17
Skrevet tir. d. 09. juni 2009 kl. 23:06:37| #18
...bare af interesse... hvad sker der når du fyrer dine 1000 rapporter af?~)
Skrevet ons. d. 10. juni 2009 kl. 07:06:14| #19
Mit bud: en hel masse aktivitet på disken :-)
Eksemplet er sendt til bmads.
(tak for point)
Skrevet fre. d. 05. marts 2010 kl. 17:51:26| #20
Hej spg og hugopedersen.
Jeg har forsøgt mig med koden fra kommentar #8, rettet til, men ved "sendpdf" fra Immidiate-vinduet får jeg en Run-time Error 3061, "Der er for få parametre. Der var ventet 1."
Mit recordset er en query er det et problem?
Kan jeg evt. få eksemplet tilsendt på mail også?
(thomas.fogh.dk snabelting gmail punktum com)
på forhånd tak
mvh Thomas
Skrevet fre. d. 05. marts 2010 kl. 18:03:15| #21
"Mit recordset er en query er det et problem?"
Ja, det var problemet - forsøgte med en tabel, nu spiller det ;O)