Rapport per mail verzenden per record

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

PiaP

Gebruiker
Lid geworden
15 jun 2010
Berichten
8
Hallo, ik heb een vraag over het mailen per record van een rapport. Ik heb wel informatie gevonden over het mailen van 1 record, maar ik wil alle records per stuk verzenden. Ik zal proberen mijn vraag duidelijk neer te zetten.

Op dit moment print ik regelmatig een rapport voor meerdere personen. Per persoon pak ik de pagina's bij elkaar en zo verdeel ik de complete output. Echter ik wil af van de papieren afhandeling en wil alles gaan mailen.
Als ik het rapport mail, dan wordt echter het complete rapport (voor alle personen) gemaild. Ik wil per persoon het rapport mailen.

Op het forum zie ik wel hoe je een rapport kunt mailen vanuit een formulier waar je vooraf een id selecteert. Maar ik wil alles met 1 druk op de knop mailen.

Er moet dus niet 1 rapport voor 10 personen geprint worden, maar 10 rapporten (per persoon) gemaild worden.

Het verzenden op zichzelf is (nog) niet het probleem:
DoCmd.SendObject acSendReport, "rptPeriodiek", acFormatPDF, "mailadres@mail.com", , , "subject", "message", False

Maar hoe verwerk ik hieromheen het filter en/of de loop die vanuit de query bovenstaande opdracht per ID verstuurd?

Ik kom er niet uit (of ik kom er niet op).:confused: Kan iemand hierbij helpen?
 
Laatst bewerkt:
Je zult dan vantevoren een filter naar je rapport mee moeten sturen zodat het rapport alleen wordt gegenereerd met de gegevens voor die persoon.
Anders gaat dit niet lukken.

Dus, formulier gebruiken, id's selecteren (gebruik een multiselect keuzelijst), rapport draaien per id en rapport mailen per id.
In ieder geval zul je met VBA aan de slag moeten en dus over VBA kennis moeten beschikken c.q. die je eigen willen maken.

Kijk ook hier eens

http://bytes.com/topic/access/answers/540273-send-multiple-custom-e-mails-access

Tardis
 
Ik heb de pagina gelezen en ga ermee aan de slag. Geeft me wel een zetje in de goede richting. Ik zal binnenkort melden of het gelukt is of ik kom met aanvullende vragen :confused:
 
Volgens mij ben ik nu een stukje verder... alleen krijg ik nu toch het hele rapport in de mail (dus alle personen).

Code:
Dim dbcur As Database
Dim rs As Recordset

Set dbcur = CurrentDb()
Set rs = dbcur.QueryDefs("rptPeriodiek").OpenRecordset

Do Until rs.EOF
     rs.Filter = "Nummer=" & rs.Fields("Nummer")
     DoCmd.SendObject acSendReport, "rptPeriodiek", acFormatPDF, "mailadres@mail.com", , , "subject", "message", False
Loop

Kan je me weer een zetje geven? Of is dit een hopeloze zaak?
 
Laatst bewerkt door een moderator:
Je moet een filter meesturen aan het rapport.
Zie mijn eerdere opmerkingen en zie de link waar ik naar verwees.

Tardis
 
http://office.microsoft.com/nl-be/a...-van-rapporten-automatiseren-HP005261218.aspx

hier kun je precies vinden hoe je een macro kunt maken voor het verzenden van een rapport of record of wat dan ook per email.
ik heb hem zelf ook gebruikt en voor mij werkt hij goed.
het enig wat je dus hoeft te zoen is een macro te maken met als Actie: ObjectVerzenden en in die macro kun je dan al neer zetten naar welk mail adres hij moet en het bericht wat er bij moet komen te staan.
en als het per week of maand verschilt dan kun je zeggen bericht bewerken: ja
Dan opent hij een outlook scherm met het object als bijlage en dan kun je de tekst nog bewerken.
bijvoorbeeld als het om een wekelijkse factuur gaat dan kun je dus elke week het bericht aanpassen naar factuur week 1 en dan factuur week 2.

Deze macro koppel je dan op 1 van je formulieren aan een opdracht knop.

Ik hoop dat je er wat aan hebt.
:thumb:
 
De tip van Sjoemie is als ik de pagina zo bekijk niet echt bruikbaar, omdat die één rapport verstuurt; zoals je al hebt aangegeven is dat nu net niet de bedoeling...
Wat ik nog wel eens doe, is het rapport in Word maken, en via Afdruk Samenvoegen dan individueel versturen.
Andere optie is het rapport voor elke mailontvanger apart genereren, en versturen. Daartoe kun je bijvoorbeeld een query maken met de geselecteerde personen en met een Recordset (via VBA dus) op basis van elk record uit die query het rapport genereren en mailen.
 
is het dan wel weer mogelijk dit aan een opdracht knop te hangen, dus dat als je op de knop drukt dat hij alles genereert?
 
Dat kan altijd, als je e.e.a. via VBA aanstuurt.
 
Een oplossing zou er zo uit kunnen zien:

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, "mailadres@mail.com", , , "Subject", "Message", False
		.MoveNext
	End If
	.Close
End With
DoCmd.Echo True
 
OctaFish, ik geloof dat ik inderdaad op zoek ben naar iets als jouw oplossing. Eerder kwam ik niet echt verder en helaas kan ik er ook niet iedere dag aan werken, dus lag het even stil.
Maar ik zal proberen een dezer dagen jouw code te implementeren, jullie horen verder van m!
 
OK, dit begint te werken. Op zich mailt hij nu inderdaad 1 pagina uit het hele rapport. Dat is goed. :thumb:
Gek is alleen dat de query qryPeriodiek 5 records telt, maar via de VBA code

strSQL = "SELECT * FROM qryPeriodiek"
With CurrentDb.OpenRecordset(strSQL)
iAantal = .RecordCount


slechts 1 record telt :confused:
Dus op die manier wordt alleen het rapport gemaild van het eerste record.

Goed, ik laat het weer even rusten en denk er weer een uurtje (of een paar uurtjes) over na. Wellicht heeft iemand een suggestie?

Dank tot zo ver in ieder geval!
 
Je kunt het nog uitbreiden met de volgende regels:

Code:
strSQL = "SELECT * FROM qryPeriodiek"
With CurrentDb.OpenRecordset(strSQL)
[B]     .MoveLast
     .MoveFirst[/B]
     iAantal = .RecordCount
Daarmee verplaats je de dbcursor eerst naar het eind, en daarna weer terug.
Daarmee zorg je er voor, dat het aantal records goed wordt ingelezen.
 
Ja, volgens mij herken ik dat van toen ik nog dagelijks met VBA bezig was. Ik ga het proberen!
 
Hm :confused: hij telt nu 5 records, dus dat gaat goed. Maar helaas gaat hij naar de .movenext gelijk door naar het einde van de code. Kindje huilt, dus ik moet de fles geven. Dus weer even pauze. Wordt vervolgd.
 
Dan heb ik even de tijd om een nieuwe code te posten:

Code:
With CurrentDb.OpenRecordset(strSQL)
    'Records doorlopen, en rapport voor elk record instellen en mailen
[COLOR="blue"][B]    .MoveLast
    .MoveFirst[/B][/COLOR]
    iAantal = .RecordCount
    If iAantal > 0 Then
[B][COLOR="blue"]        For x = 1 To iAantal[/COLOR][/B]
            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
            Reports(sRapport).RecordSource = strSQL_Rapport
            DoCmd.Close acReport, sRapport, acSaveYes
            DoCmd.SendObject acSendReport, sRapport, acFormatPDF, "mailadres@mail.com", , , "Subject", "Message", False
            .MoveNext
[B][COLOR="blue"]        Next[/COLOR][/B]
    End If
    .Close
End With
 
Done! Michel ( OctaFish), dank voor je hulp. Of eigenlijk... dank voor de code :rolleyes:
Nu moet ik nog wat bijschaven natuurlijk (mailadressen per rapport, de achterliggende query bijstellen, etc) Maar het principe is me nu duidelijk. Stom, als je het nu zo ziet is het helder Waarom kon ik het niet bedenken?

Enfin, ik ben blij en ga door,
Groet,
Pia
 
Dank voor de code zover! Mag ik nog aansluiten met een vraag?
De mailadressen per rapport. Hoe doe ik dat?
Groet, Veggy
 
Deze vraag is ruim een jaar oud, en opgelost. Maak een eigen vraag aan als je met de hier gegeven oplossing niet uit de voeten kunt. Dan krijg je geheid meer antwoorden...
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan