Rapport mailen

Status
Niet open voor verdere reacties.

Dragoon

Gebruiker
Lid geworden
18 jun 2009
Berichten
31
Ten eerste bedankt voor alle hulp die ik hier al gekregen heb.

Dan de volgende vraag ik wil een rapport e-mailen naar een e-mail adres wat in een tabel is opgeslagen. Ik krijg het nu zover voor elkaar dat alle rapporten naar een mail adres gaan.

Wat ik wil is:
Een macro/query/module die kijkt wat de end user id is (uniek nummer van klant) welk e-mail erbij hoort vervolgens het rapport wat hierbij hoort van een te selecteren maand mailt naar de end user

Weet niet of het mogelijk is of dat ik voor elke mail opdracht een apparte query/macro/module moet maken.
 
Je kunt je voorwaarden vermoedelijk wel via VBA uitfilteren.

Zelf gebruik ik onderstaande code om een Access rapport te mailen naar een leverancier:

sEmail = Me.cboBedrijf.Column(5)
sEmail = Replace(sEmail, "#", "")
sEmail = Mid(sEmail, 8, Len(sEmail) - 7)

sTekst = "Hierbij willen wij de volgende artikelen bestellen. Zie bijgande bestelbon." & vbCrLf & "Bestelling " & sBon
Me.txtVerzonden = Date
dtDatum = CDate(Date)
iDatum = CDbl(dtDatum)
strSQL = "UPDATE tBestellingen SET Verzonden = cdate(" & iDatum & ") " & vbCrLf
strSQL = strSQL & "WHERE (BonID=" & sBon & ");"
DoCmd.RunSQL strSQL
sBijlage = "rBestellingen"

Call SendEmail(sBijlage, sEmail, sBon, sTekst)

Sub SendEmail(Optional Bijlage, Optional Email, Optional Bon, Optional Tekst)
DoCmd.SendObject acSendReport, Bijlage, "SnapshotFormat(*.snp)", sAdres, , , "Bestelling " & Bon, Tekst, False
End Sub

Met een beetje goede wil kun je e.e.a. wel aanpassen, denk ik.
 
Waar zet je dit neer achter een knop op het formulier of aparte macro ofzo ??
 
Deze code zit achter een knop, dat klopt. Als je naar verschillende personen wilt kunnen mailen, heb je weinig aan een macro. (geloof ik; ik doe niet zoveel met macro's)
Dus: knopje aanmaken, en de (aangepaste, uiteraard) code er onder hangen...

P.S. Ik mail het rapport als Snapshot; dan krijgt de ontvanger precies wat ik heb gemaakt, en geen HTML veminking of nog erger. Kun je uiteraard aanpassen...
 
Laatst bewerkt:
Deze code zit achter een knop, dat klopt. Als je naar verschillende personen wilt kunnen mailen, heb je weinig aan een macro. (geloof ik; ik doe niet zoveel met macro's)
Dus: knopje aanmaken, en de (aangepaste, uiteraard) code er onder hangen...

P.S. Ik mail het rapport als Snapshot; dan krijgt de ontvanger precies wat ik heb gemaakt, en geen HTML veminking of nog erger. Kun je uiteraard aanpassen...



Kan dit ook in pdf ??
 
PDF wordt wat lastiger, omdat je dan een print-opdracht moet geven vanuit het rapport. Access <2007 kan namelijk niet rechtstreeks PDF versturen. En als je dan een PDF hebt aangemaakt, dan moet je dus niet een rapport versturen, maar dat PDF bestand.
Dat kan overigens wel, maar vereist dus dat je eerst op de juiste manier naar PDF kunt printen. En dat hangt dan weer van de PDF-printer af.
 
Ok iig bedankt voor het antwoord krijg het nog niet helemaal werkend maar zal wel komen denk ik zit even te puzzelen met de veldnamen en wat ik aan moet passen :S

PS zie er een optie bij zitten om verzonden in te laten vullen. Deze heb ik tot nu toe niet nodig (later wel) moet eerst alleen het mailen voor elkaar hebben en heb deadline tot einde van de maand :S

Misschien dat ik de db nog wel even upload
 
Laatst bewerkt:
Idee:

Eerst met een print macro pdf rapport af laten drukken (moet wel end user id + maand ofzo uitkomen) en dan e-mail en attachment laten versturen ??

Heb je eing idee of dit mogelijk is ?
 
Dat is absoluut mogelijk; je kunt Outlook prima aansturen vanuit Access, zoals je in het voorbeeld ziet, en het maakt daarbij niet uit welk document je als bijlage meestuurt.
Je kunt er zelfs een apart (modaal te openen) formulier in hangen, dat het printen verzorgt, en verder gaat met de mailprocedure als je dat tussenformulier hebt afgesloten. Je kunt alles wel achter elkaar laten uitvoeren, maar je weet nooit precies wanneer het genereren van de PDF klaar is, dus daar moet je eigenlijk altijd op wachten, vandaar het modale formulier.
 
Met onderstaande code heb ik het op dit moment zover dat hij gaat mailen. Alleen verstuurt hij nog alle raporten (vanuit formulier) dus 16 pagina's terwijl ik alleen de huidige pagina(formulier) wil versturen. En ik moet het e-mail adres nog handmatig invoeren.

Ik heb in de tabel klanten het veld e-mail adres.

HELP !!

Code:
Option Compare Database

Sub SendMessage(strRecipient As String, strSubject As String, varBody As Variant, Optional strCC As String, Optional AttachmentPath)

On Error GoTo Err_subSendMessage
If Not (varBody > " ") Then
    MsgBox "Hierbij uw factuur van deze maand."
    Exit Sub
End If

Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim objOutlookAttach As Outlook.Attachment

' Maak de Outlook-sessie.
Set objOutlook = CreateObject("Outlook.Application")

' Maak het bericht.
Set objOutlookMsg = objOutlook.CreateItem(olMailItem)

With objOutlookMsg
' Voeg de geadresseerden voor het vak Aan toe aan het bericht.
Set objOutlookRecip = .Recipients.Add(strRecipient)
objOutlookRecip.Type = olTo

' Voeg de geadresseerden voor het vak CC toe aan het bericht.
If strCC > " " Then
Set objOutlookRecip = .Recipients.Add(strCC)
objOutlookRecip.Type = olCC
End If

' Stel het onderwerp, de berichttekst en de urgentie voor het bericht in.
.Subject = strSubject
.Body = varBody< /FONT >

'Stel eventueel in dat het bericht urgent is (hier uitgezet)
'.Importance = olImportanceHigh 'Hoge urgentie

' Voeg bijlagen toe aan het bericht.
If Not IsMissing(AttachmentPath) Then
Set objOutlookAttach = .Attachments.Add(AttachmentPath)
End If

' Zet de naam van elke geadresseerde om.
For Each objOutlookRecip In .Recipients
objOutlookRecip.Resolve
If Not objOutlookRecip.Resolve Then
objOutlookMsg.Display
End If
Next

'Verstuur het e-mail bericht
.Send

End With
Set objOutlookMsg = Nothing
Set objOutlook = Nothing < /FONT >

Exit_subSendMessage:
Exit Sub

Err_subSendMessage:
MsgBox Error
Resume Exit_subSendMessage

End Sub
 
Ik neem aan, dat in [AttachmentPath] de rapportverwijzing zit? Als je een rapport wilt mailen, dan moet je ervoor zorgen dat de Recordset onder het rapport alleen die records bevat die je wilt versturen. Alleen een filter toepassen helpt hierbij (waarschijnlijk) niet; zelf verander ik daarom altijd de RecordSource van het rapport.
Daarvoor moet je het rapport met AcHidden openen, en de query met de Filtering toewijzen aan het rapport, waarna je het rapport weer opslaat. Ongeveer zoals bijgaand voorbeeld:

Code:
Sub RapportCode(sRapport As String, sBon As String) Dim tmp
    DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
    sTabel = Reports(sRapport).RecordSource
    If InStr(1, UCase(sTabel), "WHERE") > 0 Then
        strSQL = 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 = "SELECT * FROM " & sTabel & " "
        Else
            strSQL = sTabel
        End If
    End If

    'Extra loopje, om de punt-komma's te verwijderen.
    Do Until Right(strSQL, 1) <> ";"
        strSQL = Left(strSQL, Len(strSQL) - 1)
    Loop

    sFilter = " WHERE (OpdrachtID=" & sBon & ");"
    strSQL = strSQL & sFilter
    Reports(sRapport).RecordSource = strSQL
    DoCmd.Close acReport, sRapport, acSaveYes

End Sub

Nu heb je een rapport met een vaste bron, die zich dus prima laat mailen.
Voor het emailadres heb je neem ik aan wel een tekstveld op je formulier staan? Want die kun je gewoon als parameter meegeven met de mailopdracht.
 
Ok en waar moet ik dit plaatsen ??

Ja VBA noob sorry :S

Heb dit bereikt met knippen en plakken
 
Laatst bewerkt:
Je hebt anders een net stukkie VBA gepost hierboven ;)

Waar wordt deze routine (Sub SendMessage) aangeroepen? Want daarvoor zou het ergens moeten. Ik neem aan, dat je hiervoor een knop gebruikt op een formulier?
 
Wat je met knippen en plakken al niet kunt doen ;)

Maar het klopt de code staat achter een knop op het formulier (overzicht van de kosten van die maand)

Het is mij nog niet helemaal duidelijk waar jou code moet komen te staan.

Neem aan dat ik sTabel voor de naam van de tabel moet vervangen ?
 
Laatst bewerkt:
Dat klopt :thumb:
De code moet in ieder geval vóór het SendEmail commando komen, want voordat je gaat verzenden, moet het rapport op orde zijn. Dus ergens in het begin, zou ik zo zeggen.
Er vanuit gaande overigens, dat je selectie wordt bepaald door de keuzes op het formulier
 
SORRY SORRY SORRY Ik heb een fout gemaakt

De code achter de knop is als volgt.

Code:
Private Sub Knop50_Click()
On Error GoTo Err_verzenden_Click

If Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord
DoCmd.SendObject acReport, "Klanten", _
"SnapshotFormat(*.snp)", "johan@telecombinatiebakker.nl", _
"", "", "Onderwerp", "Tekst wat in je email komt te staan!", False, ""

Exit_verzenden_Click:
Exit Sub

Err_verzenden_Click:
MsgBox "Fout meldingsbericht.", vbInformation, "Attentie !"
Resume Exit_verzenden_Click

End Sub

SORRY
 
Om te beginnen zou ik deze aanpassing maken:

If Me.Dirty Then Me.Dirty=False
Daarmee wordt de wijziging in je onderliggende record wat beter opgeslagen.

Verder moet je de Recordsource aanpassing van het rapport vóór het Docmd.Sendobject zetten.

Code:
    sRapport="Klanten"
    If Me.Dirty Then [B][COLOR="Blue"]Me.Dirty=False[/COLOR][/B]
    DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
    sTabel = Reports(sRapport).RecordSource
    If InStr(1, UCase(sTabel), "WHERE") > 0 Then
        strSQL = 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 = "SELECT * FROM " & sTabel & " "
        Else
            strSQL = sTabel
        End If
    End If

    'Extra loopje, om de punt-komma's te verwijderen.
    Do Until Right(strSQL, 1) <> ";"
        strSQL = Left(strSQL, Len(strSQL) - 1)
    Loop

    sFilter = " [B][COLOR="blue"]WHERE (OpdrachtID=" & sBon & ")[/COLOR][/B];"
    strSQL = strSQL & sFilter
    Reports(sRapport).RecordSource = strSQL
    DoCmd.Close acReport, sRapport, acSaveYes

    DoCmd.SendObject acReport, sRapport, _
    "SnapshotFormat(*.snp)", "johan@telecombinatiebakker.nl", _
    "", "", "Onderwerp", "Tekst wat in je email komt te staan!", False, ""

Of zoiets...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan