Rapport automatisch verzenden als pdf naar mailadres

Status
Niet open voor verdere reacties.

Boomkweker

Gebruiker
Lid geworden
17 nov 2016
Berichten
25
In een access db heb ik tabellen met klanten, orders, producten, specificaties en orderregels. Elke 14 dagen trek ik hieruit facturen. Met een vb module wordt het pdf rapport gegenereerd per klant en opgeslagen in een map, vervolgens genereert de module een mail naar de betreffende mailadressen van de klanten en hangt de opgeslagen facturen als pdf bijlage aan de juiste mail.

Wat ik nu zou willen is dagelijks een verzendlijst sturen naar de klanten, het liefst automatisch om bijvoorbeeld 23 uur. Het liefst zonder deze rapporten op te slaan en dat het mailadres uit het achterliggende gegevensblad wordt gehaald. Dit alles vanwege traceerbaarheid van onze producten (planten)en europese wetgeving hier voor.

Is er iemand die weet of dit mogelijk is en zoja hoe? Wanneer dit toch zou moeten door het eerst opslaan van de pdf hoe krijg ik dan de naamgeving van de rapportnaam voor elkaar(bijvoorbeeld klantID/datum)
 
Laatst bewerkt:
Je kan best een rapport mailen zonder het op te slaan, maar ik snap niet helemaal wat je nu wilt. Moet de nieuwe routine de oude vervangen?
 
Nee de ene is om eens per 14 dagen facturen te sturen en deze zou zijn om dagelijks naar de klanten die op die dag producten hebben ontvangen een verzendlijst(dagrapport) te mailen
 
Dat is dan duidelijk:). Ik zou dat doen via een (eventueel aparte) database die je via een Windows taak automatisch laat starten en die dan de rapporten genereert en mailt.
 
Zit zelf toch ook weer een andere kant op te brainstormen. Stel dat je het volgende hebt
klant 1 artikel 1 10 stuks mailadres 01-01-2020
klant 2 artikel 1 100 stuks mailadres 02-01-2020
klant 1 artikel 2 100 stuks mailadres 01-01-2020
klant 3 artikel 3 100 stuks mailadres 01-01-2020
klant 1 artikel 3 100 stuks mailadres 03-01-2020
klant 1 artikel 5 100 stuks mailadres 01-01-2020
klant 2 artikel 6 100 stuks mailadres 04-01-2020
klant 6 artikel 1 100 stuks mailadres 01-01-2020

Is er dan een query te verzinnen die als uitkomst geeft bij selectie datum 01-01-20

klant1 Mailadres
Klant3 mailadres
Klant 5 mailadres

omdat dit de enige klanten zijn die wat hebben gehad op 01-01-20

Maar dan dus niet 2 keer klant 1 omdat hij 2 keer wat heeft gehad op 01-01
 
Laatst bewerkt:
Ik zie niet hoe je de andere kant op denkt :). Jouw plan wijkt namelijk in niets af van mijn (heel generieke) opzet. Natuurlijk kun je zo’n query maken en gebruiken om te mailen. Zelf zou ik per dag de klanten een overzicht sturen van de afgenomen artikelen, want dat gaat in één moeite door; kwestie van velden aan de query toevoegen of weglaten. De werkwijze blijft hetzelfde.
 
Even de situatie rond mijn facturering: Ik maak een order aan wanneer het eerste artikel in een periode van 14 dagen wordt verkocht aan een desbetreffende klant. Daarna komt er op die order elke vervolgbestelling binnen die 14 dagen. Aan het eind van de 14 dagen komt de factuur. Omdat ik dus een ordertabel hebt met elke keer een klantspecifieke order is er door de koppeling met de tabel klanten een mailadres gekoppeld aan de tabel orders. Dit resulteert in een query met daarin de betreffende gegevens. Door een loop in VB worden betreffende facturen opgeslagen in een map op de PC en mails opgesteld waaraan de juiste factuur als bijlage wordt gehangen.

Doordat ik nu een daglijst(verzendlijst) wil maken en een klant meerdere orders op een dag kan hebben zie ik eigenlijk nog niet(omdat ik geen gebruik kan maken van de orders omdat er ook klanten zijn die niks bestellen op een dag) hoe ik een query kan maken die eigenlijk uit de tabellen [detail orders], [orders], [producten], [productspecificaties], [klanten] een lijstje maakt met hierin klant - mailadres juist omdat dit ook gaat leiden tot klanten die hierin meermaals voorkomen omdat ze 2 of meer producten bestellen
 
Ik snap steeds minder van je probleem, al kan dat zijn omdat je het een beetje onhandig uitlegt.
Ik maak een order aan wanneer het eerste artikel in een periode van 14 dagen wordt verkocht aan een desbetreffende klant. Daarna komt er op die order elke vervolgbestelling binnen die 14 dagen.
Hoe rijm je dat met dit?
Doordat ik nu een daglijst(verzendlijst) wil maken en een klant meerdere orders op een dag kan hebben
Ik zie het niet... Ofwel je maakt één order aan, waar je dan gedurende 14 dagen vervolgbestellingen aan hangt, ofwel je maakt voor elke bestelling een nieuwe order aan.
 
Een factuur beslaat een periode van 14 dagen. In mijn db wordt dit samengebracht in 1 order(tabel orders), aan deze orders worden opdrachtregels(dagbestellingen) gehangen in de tabel DetGegorders. Een dagbestelling kan uit meerdere regels bestaan, bijvoorbeeld klant1 besteld 100 lavendel, 200 wilgen, 250 coniferen in maat 1 en 250 coniferen in maat 2. Dus ja het zit inderdaad in hoe ik mijn woorden kies. Er is een order per 14 dagen waar vervolgens dagbestellingen aangehangen worden
 
Laatst bewerkt:
Dus dan wil je in je dagmails het overzicht zien van de bestellingen van een bepaalde dag. Dan lijkt het mij logisch dat mensen die op een dag niks bestellen, ook niet gemaild worden. Dus ik zie daar het probleem niet wat je hier beschrijft:
... en een klant meerdere orders op een dag kan hebben zie ik eigenlijk nog niet(omdat ik geen gebruik kan maken van de orders omdat er ook klanten zijn die niks bestellen op een dag) hoe ik een query kan maken ...
Je detailorderregels hebben een datum, neem ik aan. Zo niet, dan moet je die er alsnog bijzetten. Want anders gaat het inderdaad niet lukken, want je zult je dagrapport moeten baseren op de besteldatum. En die kan dus afwijken van de orderdatum. Die orderdatum is ook helemaal niet interessant voor je dagmails, want je wilt alleen personen mailen die op een bepaalde dag een bestelling hebben geplaatst.
Ik weet nog steeds niet wat je nou precies wilt mailen; mij lijkt het logisch om een klant te mailen wat hij/zij die dag heeft besteld. Jij hebt het steeds over een query met alleen het email adres en de naam van de klant, wat uiteraard best kan. In je laatste bericht geef je aan dat klant1 5 artikelen bestelt op één dag. Dan is het toch logisch dat die klant 1 mail krijgt met daarin de 5 bestelde artikelen? En niet alleen een mail met de tekst: "U heeft een aantal artikelen besteld, maar ik weet zo gauw ff niet welke"?
 
Het lukt eigenlijk allemaal prima. Ik maak al jaren de daglijst/verzendlijst met daarop dat wat de desbetreffende klant die dag gegeven heeft. Door een veranderde Europese regelgeving moet ik die daglijst ook daadwerkelijk verstrekken maar dan zou het(zowel voor mij als de klant) handig zijn wanneer dit per mail gaat en het liefst automatisch aan het eind van de dag.

Is er dus een loop te maken die het rapport daglijst niet print maar verzend en zelf het mailadres ,"zoekt". In mijn ogen is de systematiek anders dan bij de facturen omdat ik daar de orders kan gebruiken om een loop te creëren door de klanten van die 14 dagen.

Ik denk dat ik het inderdaad niet duidelijk genoeg uitgelegd krijg en zal anders kijken of ik volgend weekend mijn voorbeeld db kan posten
 
Dag Boomkweker,

wat je al kan proberen:
Je hebt dus al een lijst met dagorders met alle artikelen die door een klant die dag besteld zijn. Als je een tweede lijst met een distinct of een groepsquery maakt met alleen de klantnummers die besteld hebben deze dag, dan kan je een loop maken door deze tweede lijst waar elke klant maar één keer voorkomt en een mail sturen naar die klant met de gegevens uit de eerste lijst die je al hebt, maar verder gefiltreerd op het klantnummer waarvoor je de mail aan het opstellen bent.

Vriendelijke groeten
Noëlla
 
NoellaG, hier begin ik inderdaad ergens mee te komen. Ik ben nog een beetje roestig na een aantal jaren geen veranderingen in mijn DB, maar ik krijg is het gegevensblad van de query datum weergave dinsdag 10 maart terwijl i overal gewoon 10-03-2020 gebruik. Ik vind geen eigenschappen om dit te veranderen. Ik kijk denk verkeerd
 
In mijn ogen is de systematiek anders dan bij de facturen omdat ik daar de orders kan gebruiken om een loop te creëren door de klanten van die 14 dagen.
Nee dus, je kunt dezelfde systematiek gebruiken. Ik snap niet dat je een query wilt mailen, terwijl een rapport veel meer voor de hand ligt. Dat is immers al gegroepeerd op KlantID, dus per klant een uniek rapport.
Dus ja, je maakt een rapport speciaal voor je dagoverzichten, die je met een aparte functie per klant genereert en mailt. Simpeler kan het echt niet.

En je laatste ‘probleem’ ( dinsdag 10 maart terwijl i overal gewoon 10-03-2020 gebruik) is dus ook geen probleem, want in beide gevallen is je filtering hetzelfde: een datum is namelijk altijd een getal, dat je hooguit anders laat zien in query of tabelveld. Maar dat maakt voor het filteren dus niet uit. Wél in VBA, waar je uit moet gaan van Amerikaanse datumnotatie, dus de datum 10-3-2020 is dan niet 10 maart, maar 3 oktober.

Hadden we maar een voorbeeldje, dan was je probleem al lang opgelost :).
 
Ik ga, als ik tijd heb, dat voorbeeld wel mailen. Ik wil de query niet mailen. Ik gebruik een query om een maillijst te genereren waar vervolgens de verzendlijsten(daglijsten) heen gemaild worden. Net zoals ik dit in het geval van mijn facturering doe. Hieronder het voorbeeld van die functie

Code:
Public Function SendInvoice()

Dim db As DAO.Database
Dim MailList As DAO.Recordset
Dim MyOutlook As Outlook.Application
Dim MyMail As Outlook.MailItem
Dim Subjectline As String
Dim fso As FileSystemObject
Dim strRptName As String



Set fso = New FileSystemObject
strRptName = "DigitaleFactuur"


Set MyOutlook = New Outlook.Application

Set db = CurrentDb()

Set MailList = db.OpenRecordset("DigitaalFactureren")




Do Until MailList.EOF

' Here we open the report with Invoicenumber of the maillist
' Afther that we save it in our Invoice folder
DoCmd.OpenReport "DigitaleFactuur", acViewPreview, , "Factuurnummer = " & MailList!Factuurnummer
DoCmd.OutputTo acOutputReport, strDocName, acFormatPDF, "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen" & MailList!Factuurnummer & ".pdf"

'We check if there is a mailadres for Invoices when yes then send when no then print out
If Len(MailList("Factuurmailadres") & vbNullString) = 0 Then
  DoCmd.OpenReport "DigitaleFactuur", , , "Factuurnummer = " & MailList!Factuurnummer
Else

'We're going to prepair the mail
Set MyMail = MyOutlook.CreateItemFromTemplate("C:\Users\Gebruiker\AppData\Roaming\Microsoft\Templates\Digitale factuur.oft")
' This addresses it

MyMail.To = MailList("Factuurmailadres")
MyMail.BCC = MailList("Webadres")

'This gives it a subject
MyMail.Subject = "Factuur " & MailList!Ordermaand & " Boomkwekerij de Lange"


'Here we attach the invoice to the mailadress
MyMail.Attachments.Add "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen" & MailList!Factuurnummer & ".pdf", olByValue, 1, "My Displayname"


' "My Displayname" = If you don??t want the attachment??s icon string to be "c:myfile.txt" you
' can use this property to change it to something useful, i.e. "4th Qtr Report"

'This display it ready to send, i like to check if invoice is wright!

MyMail.Display

End If
DoCmd.Close acReport, strRptName, acSaveNo

'And on to the next one...
MailList.MoveNext

Loop

'Cleanup after ourselves

Set MyMail = Nothing

'Uncomment the next line if you want Outlook to shut down when its done.
'Otherwise, it will stay running.

'MyOutlook.Quit
Set MyOutlook = Nothing

MailList.Close
Set MailList = Nothing
db.Close
Set db = Nothing

End Function
 
Laatst bewerkt door een moderator:
Ik wil best naar je laatste bericht kijken, maar pas als de code tussen CODE tags staat :D.
 
Waarom de query niet mailen? Ben je bang dat we gaan lachen om de veldnamen? :D. Er zit in ieder geval een fout in deze regel:
Code:
"O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen" & MailList!Factuurnummer & ".pdf"
Tenzij je natuurlijk al mappen heb aangemaakt die deze structuur hebben: "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen20200310.pdf, "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen20200311.pdf etc. Ik vermoed dat je één map hebt voor je facturen, en dan zou ik het toch zo doen:
Code:
    strRptPath = "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen\"
    DoCmd.OutputTo acOutputReport, strDocName, acFormatPDF, strRptPath & MailList!Factuurnummer & ".pdf"

Of zo:
Code:
"O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen[B][COLOR="#FF0000"]\[/COLOR][/B]" & MailList!Factuurnummer & ".pdf"
En in je code wordt strDocName ook nergens gevuld, dus dat lijkt mij ook niet handig :).
 
Laatst bewerkt:
NoellaG, hier begin ik inderdaad ergens mee te komen. Ik ben nog een beetje roestig na een aantal jaren geen veranderingen in mijn DB, maar ik krijg is het gegevensblad van de query datum weergave dinsdag 10 maart terwijl i overal gewoon 10-03-2020 gebruik. Ik vind geen eigenschappen om dit te veranderen. Ik kijk denk verkeerd

Als je het formaat van een query veld wil aanpassen, dan vind je ook in de query een format eigenschap. Selecteer de kolom in het QBE rooster en plaats via de rechtermuisknop het eigenschapen venster op je scherm. Op de tweede lijn vind je de format eigenschap.
Of je kan in je query natuurlijk een berekend veld aanmaken via de format functie.
fld1:format([Veldnaam]; "formaatstring")
Hou er wel rekening mee dat de uitkomst van deze functie een string is en geen datum.

kind regards
Noëlla
 
Het uploaden van de 2 databases luktniet dus probeer ik het nog een keer uit te leggen

2 keer per maand klik ik een module aan die vervolgens de facturen opslaat in een map facturen en deze vervolgens aan een mail naar de juiste klant hangt

Public Function SendInvoice()

Dim db As DAO.Database
Dim MailList As DAO.Recordset
Dim MyOutlook As Outlook.Application
Dim MyMail As Outlook.MailItem
Dim Subjectline As String
Dim fso As FileSystemObject
Dim strRptName As String



Set fso = New FileSystemObject
strRptName = "DigitaleFactuur"


Set MyOutlook = New Outlook.Application

Set db = CurrentDb()

Set MailList = db.OpenRecordset("DigitaalFactureren")




Do Until MailList.EOF

' Here we open the report with Invoicenumber of the maillist
' Afther that we save it in our Invoice folder
DoCmd.OpenReport "DigitaleFactuur", acViewPreview, , "Factuurnummer = " & MailList!Factuurnummer
DoCmd.OutputTo acOutputReport, strDocName, acFormatPDF, "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen" & MailList!Factuurnummer & ".pdf"

'We check if there is a mailadres for Invoices when yes then send when no then print out
If Len(MailList("Factuurmailadres") & vbNullString) = 0 Then
DoCmd.OpenReport "DigitaleFactuur", , , "Factuurnummer = " & MailList!Factuurnummer
Else

'We're going to prepair the mail
Set MyMail = MyOutlook.CreateItemFromTemplate("C:\Users\Gebruiker\AppData\Roaming\Microsoft\Templates\Digitale factuur.oft")
' This addresses it

MyMail.To = MailList("Factuurmailadres")
MyMail.BCC = MailList("Webadres")

'This gives it a subject
MyMail.Subject = "Factuur " & MailList!Ordermaand & " Boomkwekerij de Lange"


'Here we attach the invoice to the mailadress
MyMail.Attachments.Add "O:\backup\AJ de Lange\Jaaroverzichten\DigitaleFacturen" & MailList!Factuurnummer & ".pdf", olByValue, 1, "My Displayname"


' "My Displayname" = If you don??t want the attachment??s icon string to be "c:myfile.txt" you
' can use this property to change it to something useful, i.e. "4th Qtr Report"

'This display it ready to send, i like to check if invoice is wright!

MyMail.Display

End If
DoCmd.Close acReport, strRptName, acSaveNo

'And on to the next one...
MailList.MoveNext

Loop

'Cleanup after ourselves

Set MyMail = Nothing

'Uncomment the next line if you want Outlook to shut down when its done.
'Otherwise, it will stay running.

'MyOutlook.Quit
Set MyOutlook = Nothing

MailList.Close
Set MailList = Nothing
db.Close
Set db = Nothing

End Function[/SQL]

Nu zou ik willen dat er op een gegeven moment, bij voorkeur dagelijks om 17uur een lijst komt van klanten die op die dag een levering hebben gehad en daar vervolgens de verzendlijst van die betreffende dag naar de desbetreffende klant wordt gestuurd. Met de hulp van NoellaG krijg ik nu een lijst met hierin de velden

[OrderId] [KlantID] [Leverdatum] [Naam Klant] [Mailadres Klant].
[2185] [600061] [19-3-2020] [Groen Direkt] [GD@GD.NL]

Kan ik nu op basis van deze gegevens automatisch(of wanneer het niet anders kan op klik) het rapport Verzendlijst openen voor Groen Direkt van datum 19-3-2020 en dit gelijk als pdf bijlage versturen naar GD@GD.NL
 
Databases uploaden kan alleen als je ze zipt. Doe nog eens een poging, zou ik zeggen. En zet je code in CODE tags, die zijn daarvoor :).
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan