Access export naar pdf

Status
Niet open voor verdere reacties.

arnoderuig

Gebruiker
Lid geworden
8 sep 2000
Berichten
577
In dit forum (en op het internet in andere fora) heb ik al verschrikkelijk veel kunnen terugvinden over de export van rapporten naar pdf-bestanden. Op zich heb ik dat ook werkbaar kunnen maken. Waar ik nu naar op zoek ben is naar een methode om (bijvoorbeeld) facturen in individuele pdf-bestanden te kunnen krijgen.

In de huidige sitiuatie wordt een facturenbestand (qryFacturenMaken) naar pdf geëxporteerd middels een rapport dat de query leest en er één facturenbestand van maakt (dus één pdf-bestand van alle facturen die in de query staan). Nu zou ik willen dat voor elke individuele factuur dus één bestand wordt aangemaakt. Elk bestand moet dan als naam een klantnummer en factuurnummer bevatten. De methode om bij de export naar pdf een bestandsnaam mee te geven beheers ik. Het gaat er nu dus waarschijnlijk om dat de query record voor record wordt gelezen en daarna de exportopdracht (met verwijzing naar het reeds aangemaakte rapport) wordt gegeven.

Is er iemand die mij op weg kan helpen dit te realiseren?

Dank,
Arno.
 
Binnen Access weet ik de oplossing niet. Je gedachte is naar mijn idee wel juist.

Alternatief kun je het gratis pdftk builder downloaden. Deze kan je pdf in losse pagina's uit elkaar halen. Eventueel kun je dit programma ook aansturen vanaf de command-line, zodat je dit ook als geplande taak of script kunt uitvoeren.
 
De oplossing is niet zo moeilijk, en je hoeft er zeker geen extern voor programma voor te gebruiken. De truc is om een query te gebruiken als basis voor je rapport (heb je al) en die te openen met een Recordset. Vervolgens loop je daar door heen, en voor elk record maak je sla je apart het rapport op, met de naam uit de recordset.
 
Octafish, bedankt voor je reactie. Ik heb één en ander nu uitgewerkt maar loop toch nog even tegen het probleem aan hoe een individueel record uit de query wordt gekoppeld aan het rapport.

Ik heb nu de volgende code:

Code:
Dim db As Database
Dim rst As Recordset
Dim strSQL As String
Dim vFactuur As String
Dim vDatum As String
Set db = CurrentDb()
Set strSQL = "SELECT * from tblFactuurVoorlopig"
Set rst = db.OpenRecordset(strSQL, dbOpenDynaset)
vDatum = Forms!frmAfdrukkenFacturen!DatumJJJJMMDD
rst.MoveFirst
Do While Not rst.EOF
vKlant = rst!KlantID
vFactuur = rst!FactuurID
DoCmd.OutputTo acOutputReport, "rptFacturenPrintenPDFindividueel", acFormatPDF, "X:\BAS\PDF\Factuur\Factuur-" & vKlant & "-" & vFactuur & "-" & vDatum & ".PDF"
rst.MoveNext
Loop
rst.Close

Ten opzichte van mijn oorspronkelijke vraag valt misschien op dat ik niet met een query werk. Dat bleek namelijk niet te werken. Op internet heb ik kunnen terugvinden dat dit heel vaak niet blijkt te werken. Ik heb de boel dus omgegooid en ga nu uit van een tabel tblFactuurVoorlopig waarin alle benodigde factuurgegevens zitten. Het rapport rptFacturenPrintenPDFindividueel is gekoppeld aan deze tabel.

De tabel bevat nu 119 records. Wat er nu gebeurt is dat de loop keurig 119 keer wordt doorlopen maar dat elke keer voor alle 119 records één pdf-bestand wordt gemaakt. Kennelijk krijg ik met deze code niet voor elkaar dat het rapport slechts de gegevens van één record bevat.

Wat doe ik fout?
 
Laatst bewerkt door een moderator:
Wat je fout doet is simpel te zien, en nogal elementair: je koppelt steeds de complete recordset van de tabel aan je rapport. Wel elke keer onder een nieuwe naam, maar dat schiet uiteraard niet op.

Op internet heb ik kunnen terugvinden dat dit heel vaak niet blijkt te werken.

Dat bevreemdt mij; ik doe eigenlijk niet anders, en het gaat altijd goed. Ik gebruik blijkbaar een ander internet ;)
Een simpele oplossing is om de filtering uit je tabel hard in het rapport te zetten. Daartoe open je het rapport in Hidden modus, en verander je de recordsource van het rapport. Vervolgens weer sluiten, en het rapport verder verwerken.
 
Octafish, wederom bedankt voor je reactie.

Ik heb niet het idee dat we op een verschillend internet zoeken. Over het algemeen leveren mijn zoekacties de informatie op die ik zoek. In dit geval moet je aannemen dat vanaf je vorige reactie tot het moment dat ik mijn bericht stuurde heb gezocht. Ik heb daartussen door gelukkig wel eens even geslapen. Ik ben blij te horen dat het kennelijk wel kan, gebruik maken van queries binnen sql. Dat klopt ook wel. Ik kreeg alleen bepaalde foutmeldingen en die wezen er op het internet op dat in dat soort gevallen de query te ingewikkeld was. Kennelijk was ik niet de enige die dat probeelm ervaarde.

Je geeft een ander methode aan die ik zou kunnen gebruiken. Juist die filtering levert mij een probleem op. Ik heb dus geen idee hoe ik binnen dat rapport kan regelen dat steeds één record aan het rapport wordt aangeboden. Ik wijs er nog even op dat het er hier om gaat dat het rapport een pdf-bestand oplevert waarvan ik heb begrepen dat dat alleen voor elkaar te krijgen is via het docmd.outputto-commando. Is het nu mogelijk een groot deel van mijn vba-instructies (zoals die hierboven staan) in het RapportOpenen komen te staan? En hoe krijg ik dan dus die filtering voor elkaar?

Heb je nog wat sluiers die kunnen worden opgelicht (al is het maar een tipje).

Bedankt,
Arno.
 
Ik heb hier een stukje code dat ik zelf gebruik. Daarbij wordt dus de recordsource van het rapport geopend, het filter aangepast en het rapport opgeslagen. De code ziet er zo uit:

Code:
Dim strSQL As String, strSQL_Rapport As String
Dim sFilter as String,  sTabel as String, sKlantNr as String
Dim x As Integer
strSQL = "SELECT * FROM qRapport"
sRapport = "rptPeriodiek"
DoCmd.Echo False, "Bezig met openen van recordset."
With CurrentDb.OpenRecordset(strSQL)
 'Records doorlopen, en rapport voor elk record instellen en mailen
 iAantal = .RecordCount
 If iAantal > 0 Then
  x=x+1
  sKlantNr=rst.Fields("KlantID").Value
  DoCmd.Echo False, "Samenvoegen van Record " & x & " van " & iAantal & " records..."
  DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
  sTabel = Reports(sRapport).RecordSource
  If InStr(1, UCase(sTabel), "WHERE") > 0 Then
   strSQL_Rapport = Left(sTabel, InStr(1, sTabel, "WHERE ") - 1)
  Else
   If InStr(1, UCase(sTabel), "SELECT") = 0 Then
    If InStr(1, sTabel, " ") > 0 And InStr(1, sTabel, "[") = 0 Then
     sTabel = "[" & sTabel & "]"
    End If
    strSQL_Rapport = "SELECT * FROM " & sTabel & " "
   Else
    strSQL_Rapport = sTabel
   End If
  End If
  'Extra loopje, om de punt-komma's te verwijderen.
  Do Until Right(strSQL_Rapport, 1) <> ";"
   strSQL = Left(strSQL_Rapport, Len(strSQL_Rapport) - 1)
  Loop
  'Klantfilter op rapport zetten
  sFilter = " WHERE (KlantID=" & sKlantNr & ");"
  strSQL_Rapport = strSQL_Rapport & sFilter
 ''tmp = InputBox("", "", strSQL)
  Reports(sRapport).RecordSource = strSQL_Rapport
  DoCmd.Close acReport, sRapport, acSaveYes
  DoCmd.SendObject acSendReport, sRapport, acFormatPDF, "[EMAIL="mailadres@mail.com"]mailadres@mail.com[/EMAIL]", , , "Subject", "Message", False
  .MoveNext
 End If
 .Close
End With
DoCmd.Echo True

Je zult de code uiteraard wel naar eigen inzichten moeten aanpassen, maar je krijgt hopelijk wel een duwtje in de goede richting. Zoals je in de naamgeving ziet, gebruik ik dus een query als bron (qRapport).
 
Octafish, wederom bedankt; nu voor je indrukwekkende code waarmee je me een eind op weg helpt. Uit je code begrijp ik dat je filtert op KlantID. Bij mij zou het voldoende zijn om de opeenvolgende records door te lopen. Het filter zou in dat geval het recordnummer moeten zijn; als ik je code goed begrijp. En juist daarmee heb ik een probleem. De sql-string zou naar een recordnummer moeten verwijzen. Ook weer op het internet gezocht en gevonden dat daarvoor veelal het woord 'rownum' wordt gebruikt aangevuld met = [getal], dus bijvoorbeeld"

Select * from [tabelnaam] where rownum = [recordnummer]

Je weet al dat bij mijn oorspronkelijke oplossing ik alle records selecteerde; die string op zich was goed geschreven (helaas voor mij selecteerde ik daarmee teveel records). Vul ik die string aan met 'where rownum = 1' (om één en ander te testen) dan krijg ik een foutmelding dat 2 parameters ontbreken.

Het lukt me dus nog steeds niet een goede selectie te maken.

Heb je nog één tip?

Arno.
 
Vergeet Rownum, dat lijkt mij in dit geval niet nodig. In mijn voorbeeld gebruik ik inderdaad een KlantID. Dat is daar het sleutelveld. In de query zitten dus alleen unieke KlantID's. Bij jou zal dat ongetwijfeld ook het geval zijn; je hoeft dus alleen het Unieke veld te benoemen, en te gebruiken, dan ben je volgens mij klaar.
 
Octafish,

Ontzettend bedankt. Ik denk dat ik het nu geheel werkend zal krijgen.

Groet,
Arno.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan