Avatar billede bmads Nybegynder
08. juni 2009 - 13:39 Der er 19 kommentarer og
2 løsninger

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?
Avatar billede Slettet bruger
08. juni 2009 - 14:14 #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.
Avatar billede bmads Nybegynder
08. juni 2009 - 19:51 #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.
Avatar billede Slettet bruger
08. juni 2009 - 21:25 #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.
Avatar billede Slettet bruger
08. juni 2009 - 21:46 #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!~)
Avatar billede bmads Nybegynder
08. juni 2009 - 23:38 #5
OK ellebe, men tak for din interesse
Avatar billede bmads Nybegynder
08. juni 2009 - 23:46 #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
Avatar billede hugopedersen Nybegynder
09. juni 2009 - 07:11 #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.
Avatar billede Slettet bruger
09. juni 2009 - 09:34 #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!~)
Avatar billede hugopedersen Nybegynder
09. juni 2009 - 09: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
Avatar billede hugopedersen Nybegynder
09. juni 2009 - 09:50 #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
Avatar billede Slettet bruger
09. juni 2009 - 09:59 #11
man kunne også sætte & Date() & ind i filnavnet!~)
Avatar billede Slettet bruger
09. juni 2009 - 10:00 #12
eller noget lignende...
Avatar billede bmads Nybegynder
09. juni 2009 - 15:54 #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.
Avatar billede bmads Nybegynder
09. juni 2009 - 17:29 #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)
Avatar billede Slettet bruger
09. juni 2009 - 21:47 #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!~)
Avatar billede bmads Nybegynder
09. juni 2009 - 22:35 #16
Det er kanon-godt.
Tak til begge for jeres deltagelse. Jeg håber, det er ok at dele point'ene
Avatar billede Slettet bruger
09. juni 2009 - 23:05 #17
!~)
Avatar billede Slettet bruger
09. juni 2009 - 23:06 #18
...bare af interesse... hvad sker der når du fyrer dine 1000 rapporter af?~)
Avatar billede hugopedersen Nybegynder
10. juni 2009 - 07:06 #19
Mit bud:  en hel masse aktivitet på disken :-)

Eksemplet er sendt til bmads.

(tak for point)
Avatar billede fogh Nybegynder
05. marts 2010 - 17:51 #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
Avatar billede fogh Nybegynder
05. marts 2010 - 18:03 #21
"Mit recordset er en query er det et problem?"

Ja, det var problemet - forsøgte med en tabel, nu spiller det ;O)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester