Splitsen en emailen gegroepeerd rapport

  • Onderwerp starter Onderwerp starter mks
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

mks

Gebruiker
Lid geworden
23 okt 2018
Berichten
10
Goedendag. Ik heb in Access 2016 een gegroepeerd rapport "Status Bedrijf" en wil elke groep in een pdf apart opslaan en e-mailen. Hiervoor heb ik na veel gepuzzel een VBA programmacode die tot zover alle groepen in een aparte pdf op de hd plaatst. Dit werkt perfect echter, de bestandsnamen van de pdf is het ID-nummer van de tabel "Bedrijven". In tabel "Bedrijven" staan in kolommen ook de bedrijfsnamen (Veld Bedrijf) en email-adressen (Veld Emailadres). Ik zou die ook in de Query "Query status Bedrijf" kunnen zetten. Ik wil dat de bestandsnaam, de naam van het overeenkomstige bedrijf wordt en iedere afzonderlijke pdf bestand als een bijlage in een email wordt gezet. Dus als er 24 groepen/bedrijven zijn, 24 bestanden en 24 emailberichten. Bijgaande de VBA code.

Waar en hoe moet ik in de Loop de bestandsnaam omzetten van ID nummer naar Bedrijfsnaam? Hoe ziet de code eruit?
Waar en hoe moet ik in de Loop de email code zetten? Hoe ziet de code eruit?

Code:
Private Sub Knop31_Click()
  
  Const Folder = "D:\DB TEST PDF\"             'PAD WAAR DE PDF BESTANDEN WORDEN OPGSLAGEN
  Const Domain = "Query status Bedrijf"       'NAAM QUERY
  Const LoopedField = "[Naam Bedrijf]"         'VELDNAAM VAN DE GROEP
  Const NewFileName = "Status werkzaamheden"
  Const ReportName = "Status Bedrijf"          'NAAM VAN HET TE DOORZOEKEN RAPPORT
  
  Dim rs As DAO.Recordset
  Dim LoopedFieldValue As String
  Dim FileName As String
  Dim FullPath As String
  
  Dim strWhere As String
  Dim NewNewFileName As String
  Set rs = CurrentDb.OpenRecordset(Domain)
 
  Do While Not rs.EOF
    LoopedFieldValue = rs.Fields(LoopedField)
    FileName = LoopedFieldValue & ".pdf"
    FullPath = Folder & FileName
    strWhere = LoopedField & " = " & LoopedFieldValue      'LoopFieldValue is in feite het ID-nummer van de tabel Bedrijven
    Debug.Print FullPath
    Debug.Print strWhere
    DoCmd.OpenReport ReportName, acViewPreview, , strWhere
    DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, FullPath
    DoCmd.Close acReport, ReportName
    rs.MoveNext
  Loop
  
End Sub
 
Ik vind je werkwijze bepaald onhandig zo; ook het aanmaken van de PDF's kan veel slimmer. Kijk eens in het Access forum voor betere oplossingen. Daar wordt ook het mailen van die bestanden regelmatig gevraagd (en behandeld).
 
Goedendag Octafish. Ik was al verheugd dat de code werkt. Hoe kan het eenvoudiger om pdf te maken met mijn code: FileName = LoopedFieldValue & ".pdf". Ik heb op het forum gezocht maar dat is eindeloos om het juiste te vinden. Mijn poging om de overeenkomst te vinden van het ID nummer met de Bedrijfsnaam met DlookUp werkt niet goed. Zonder de code LookUp krijg ik 24 gesplitste pdf bestanden met een nummer als bestandsnaam, nu één bestand met de naam VarX. Hoe krijg ik dit goed? Bijgaande mijn proef code.

Code:
Private Sub Knop31_Click()
  Const Folder = "D:\DB TEST PDF\"             'PAD WAAR DE PDF BESTANDEN WORDEN OPGSLAGEN
  Const Domain = "Query status Bedrijf"       'NAAM QUERY
  Const LoopedField = "[Naam bedrijf]"         'VELDNAAM VAN DE GROEP in de Query
  Const NewFileName = "Status werkzaamheden"
  Const ReportName = "Status bedrijf"          'NAAM VAN HET TE DOORZOEKEN RAPPORT
  
  Dim rs As DAO.Recordset
  Dim LoopedFieldValue As String
  Dim FileName As String
  Dim FullPath As String
  
  Dim strWhere As String
  Dim NewNewFileName As String
  Dim VarX As Variant

  Set rs = CurrentDb.OpenRecordset(Domain)
 
  Do While Not rs.EOF
    LoopedFieldValue = rs.Fields(LoopedField)

    VarX = DLookup("[Bedrijf]", "Bedrijven", LoopedFieldValue = 1)                   'Toegevoegd voor de proef. Bedrijf=bedrijfsnaam. Bedrijven=tabel Bedrijven. LoopedFieldValue=ID nummer. LET OP: verwijst naar de tabel ipv Query
    FileName = "VarX" & ".pdf"   
 
    FullPath = Folder & FileName
    strWhere = LoopedField & " = " & LoopedFieldValue
    Debug.Print FullPath
    Debug.Print strWhere
    DoCmd.OpenReport ReportName, acViewPreview, , strWhere
    DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, FullPath
    DoCmd.Close acReport, ReportName
    rs.MoveNext
  Loop
  
End Sub

Ik weet ook niet waar ik de code moet zetten binnen de Loop voor de email. De Loop wordt bij de uitvoering meerdere keren (40 x) doorlopen dan het aantal gegenereerde bestanden. Dit zou betekenen dat ik bv. 40 emailen krijg ipv het aantal 24.
Ik ben geen expert, al vele dagen gepuzzeld en leer elke dag, maar soms . . .. Help mij svp.
 
Laten we om te beginnen even door jouw foutjes heen lopen, dan kun je wat beter testen of je loop werkt of niet. Beginnen we hier:
Code:
    LoopedFieldValue = rs.Fields(LoopedField)
    VarX = DLookup("[Bedrijf]", "Bedrijven", LoopedFieldValue = 1)
Je probeert een Bedrijfsnaam op te halen uit de tabel m.b.v. DLookup, wat in beginsel prima moet lukken. De reden dat het bij jou fout gaat, komt doordat je geen goed criterium meegeeft. De bedrijfsnaam moet worden opgehaald op basis van het BedrijfsID, wat een getal is. Jouw criterium is een vergelijking, namelijk: is BedrijfsID (variabele LoopedFieldValue) gelijk aan 1? Dat is uiteraard maar in één geval maximaal het geval, dus de uitkomst is dan TRUE. Bij de andere records is de uitkomst van de vergelijking FALSE. Geen enkele BedrijfsID heeft de waarde TRUE (getalwaarde -1) of FALSE (getalwaarde 0). Dus je vindt niks. De juiste syntax is:
Code:
    VarX = DLookup("[Bedrijf]", "Bedrijven", "[BedrijfsID] = " & LoopedFieldValue)

Vervolgens wil je de gevonden naam gebruiken in de variabele FileName. Maar ook dat doe je verkeerd:
Code:
    FileName = "VarX" & ".pdf"
Hiermee combineer je namelijk slechts de ene tekst (VarX) met de andere tekst. Je had net zo goed dit kunnen doen: FileName = "VarX.pdf". En dat is uiteraard niet je bedoeling. Variabelen gebruik je zo:
Code:
    FileName = VarX & ".pdf"
En dan krijg je dus wél de juiste teks (inhoud) van de variabele in de nieuwe FileName.

Kijk maar eens of het nu wat beter gaat.
 
Super OctaFIsh. Ik begin VBA steeds meer te waarderen. De bestandsnamen zijn mbv. je aanwijzingen aangepast, top. Waar ik nog mee zit is email versturen. De Loop wordt 40 keer doorlopen, iedere keer wordt de pdf aangevuld. Als na het aanmaken van de pdf de email-instructie plaats, worden er volgens mij 40 emails aangemaakt ipv 24.
 
Ik begrijp niet waar die 40 vandaan komt. Ja, je hebt een Recordset die je doorloopt. Daar zitten dan blijkbaar 40 records in. Hoe wil je die dan matchen met 24 rapporten?
 
Het zijn er zelfs meer, 60 . Het genereren gaat zo snel dat ik er een paar niet heb gezien. Mogelijk zijn het de namen (records) onder de Groep. Er zijn 20 groepen. De pdf's worden in de loop opgebouwd.

Ik heb de code voor de email in de Loop geplaatst maar dat gaat niet goed (Errorhandling moet nog). Als bijlage van de email wordt een pdf bijgevoegd bestaande uit het complete rapport (ReportName) met alle groepen en dus niet gesplitst. Als ik de email code buiten de Loop houd, dan moet ik de kant en klare bestanden op de HD bijvoegen maar hoe bepaal ik dat alle bestanden als bijlage worden gemaild. Het aantal bestanden kan steeds variëren. Het aantal gegeneerde bestanden in een teller bijhouden maar welk bestand hoort bij welk mailadres (ID nummer versus veld "Bedrijf emailadres in de tabel Bedrijven)?


Code:
Private Sub Knop31_Click()
  Const Folder = "D:\DB TEST PDF\"             'PAD WAAR DE PDF BESTANDEN WORDEN OPGSLAGEN
  Const Domain = "Query status Bedrijf"       'NAAM QUERY
  Const LoopedField = "[Naam bedrijf]"         'VELDNAAM VAN DE GROEP in de Query
  Const ReportName = "Status bedrijf"          'NAAM VAN HET TE DOORZOEKEN RAPPORT
  
  Dim rs As DAO.Recordset
  Dim LoopedFieldValue As String
  Dim FileName As String
  Dim FullPath As String
  
  Dim strWhere As String
  Dim NewNewFileName As String
  Dim VarX As Variant
  Dim MailTekst As String

  Set rs = CurrentDb.OpenRecordset(Domain)
 
  Do While Not rs.EOF
    LoopedFieldValue = rs.Fields(LoopedField)

    VarX = DLookup("[Bedrijf]", "Bedrijven","[Bedrijf ID]=" & LoopedFieldValue)                   ' Bedrijf=bedrijfsnaam. Bedrijven=tabel Bedrijven. LoopedFieldValue=ID nummer.
    FileName = VarX & ".pdf"
 
    FullPath = Folder & FileName
    strWhere = LoopedField & " = " & LoopedFieldValue
    Debug.Print FullPath
    Debug.Print strWhere
    DoCmd.OpenReport ReportName, acViewPreview, , strWhere
    DoCmd.OutputTo acOutputReport, ReportName, acFormatPDF, FullPath
    DoCmd.Close acReport, ReportName
    rs.MoveNext
  
 MailTekst = "Bla, bla, bla"                                                                               'HET EMAIL-ADRES MOET MET dLOOKuP UIT TABEL BEDRIJVEN WORDEN GEHAALD.

    DoCmd.SendObject acSendReport, ReportName, acFormatPDF, , , , "Status levering", MailTekst             'JE ZOU ZEGGEN DAT ReportName HET GESPLITSTE BESTAND IS.
    DoCmd.Close acReport, ReportName, acSaveNo
   
  Loop
  
End Sub
 
Laatst bewerkt:
Ik snap er al minder en minder van. Je hebt een loop die een rapport genereert (niet op de handigste manier, maar alla, dat is niet de oorzaak van het probleem denk ik) en vervolgens datzelfde rapport mailt. Dan zou je evenveel rapporten moeten hebben als mails. There's no two ways about that! Dus Wat ben je aan het doen? Het wordt toch echt tijd voor een voorbeeldje met wat dummy data, dit gaat zo wel erg veel tijd kosten zonder dat je er veel mee op schiet...
 
Het eindresultaat van de Loop is een reeks pdf bestanden (ca. 24) in een directory met de Bedrijfsnaam als bestandsnaam. Ik wil ieder bestand als bijlage in een email aan het specifieke bedrijf sturen. Ik ben de hele dag aan het zoeken, lezen en testen maar kan niets geschikts vinden of er zitten bugs (oude versies Access) in. Ik in andere app wel succesvol emails verstuurt maar met meerdere bijlagen vanuit een directory en meerdere emails.? Weet je een oplossing?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan