Report verzenden (docmd.sendobject)

Status
Niet open voor verdere reacties.

Pebe1

Gebruiker
Lid geworden
13 feb 2012
Berichten
5
Vanuit een form heeft de gebruiker de mogelijkheid een rapport te versturen.

opdracht voor het verzenden van het rapport:
DoCmd.SendObject acSendReport, "rtpDetail", acFormatPDF, , , , "Header tekst", "Body tekst"

Werkt prima maar de bijlage in de mail heeft als naam "rptDetail.pdf"
(Het betreffende rapport is een filtering op basis van het recordID in de form.)

Ik zou de bijlage graag de naam geven van het record ID.
bijv. voor recordID "100001" zou de bijlage "100001.pdf" moeten worden en niet "rptDetail.pdf".

kan iemand me een tip geven hoe ik dit moet aanpakken?

Thnx,
Peter
 
Niet met SendObject, want dat kan alleen rapporten verzenden die daadwerkelijk bestaan. En je zult toch niet voor elk rapport dat je verzend een apart rapport willen opslaan lijkt mij, want dan zit je binnen de kortste keren aan tientallen kopieën van hetzelfde rapport opgezadeld.
Als je met Outlook werkt, kun je een rapport wel eerst exporteren naar een bestand, en dan een mail genereren via een Outlook sessie waar je het rapport als bijlage inhangt. Dat is wel wat meer programmeren...
 
Thnx Octafisch.

Het gaat maar om 1 rapport, enige probleem is dat ik de naam zou willen overschrijven met iets anders dan de rapportnaam.
Het betreffende rapport wordt geopend op basis van de recordID welke zichtbaar is in het formulier.

Hier kan ik echter geen workarround voor vinden :-(
De door jou beschreven "workarround" had ik al in gedachten maar vind ik een beetje "overkill" voor het beoogde doel...

Thnx,
Peter
 
Helaas, geen overkill. Zelf heb ik er geen moeite mee om een rapport met één en dezelfde naam te mailen. Ik doe dat bijvoorbeeld bij onze eigen bestellingen; ik zet de juiste info zoals bestelnummer etc. er wel dynamisch bij in het onderwerp, en uiteraard heeft de PDF ook de juiste informatie. Levert in ons geval nooit problemen op....
Ik zou die oplossing zeker overwegen, als je het teveel moeite vind om er een Outlook constructie van te maken.

Een alternatief kan nog zijn dat je het rapport tijdelijk opslaat onder de gewenste naam, en na het mailen weer verwijdert.
 
Die werkwijze gebruik ik nu ook.
Het zou alleen "mooier" zijn wanneer de bijlage dan ook nog de juiste naam heeft.

"Nice to have" maar zeker geen showstopper...
 
Een oplossing kan dus zijn via het kopieëren en verwijderen van een tijdelijk rapport. Dat ziet er dan zo uit:

Code:
Function CopyReport(Rapport As String, Nummer As Integer)
Dim sRapport As String

    sRapport = Rapport & "_" & Right("0000" & Nummer, 4)
    DoCmd.CopyObject , sRapport, acReport, Rapport
    DoCmd.SendObject acSendReport, sRapport, acFormatPDF, , , , "Header tekst", "Body tekst"
    DoCmd.DeleteObject acReport, sRapport

End Function

De functie roep je aan met bijvoorbeeld:
Code:
Call CopyReport("rtpDetail",Me.ClientID)
 
Hey Octafisch

Prachtige oplossing :)

Maar... toch nog een probleempje tijdens het uitvoeren.
Het rapport wat verzonden wordt krijgt toch nog altijd de naam van het initiële rapport.
In Debug lees ik nochtans de naam van het nieuw gemaakt rapport???? :-S

Aanmaken van een copy en verwijderen na de uitvoeropdracht loopt perfect...

[Bovendien vraagt deze bewerking wel wat extra tijd (app geeft zelfs een "reageert niet meer" voor enkele seconden)]

Mvg,
Peter
 
Prachtige oplossing inderdaad, maar met een kleine twist :) Het maken van een kopie is op zichzelf zo prima te doen, maar de naam van het rapport dat je mailt wordt niet gehaald uit de Naam van het rapport, zoals je zou verwachten, maar uit het Bijschrift ....
Daar kom je dan achter als je deze procedure uitvoert :) Overigens heb ik nauwelijks last van snelheidsproblemen, dus misschien heeft de traagheid met je rapport zelf te maken.

Maar nu een oplossing.... Die is er uiteraard wel, en die bestaat uit het aanpassen van het bijschrift van het rapport. Omdat het nu eigenlijk niet meer uitmaakt of je het oorspronkelijke rapport mailt of een kopie, mag je zelf bepalen hoe je het wilt doen. Ik doe het nu zo, met een functie. De aanroep ziet er zo uit:
Code:
CopyReport Me.cboSelectReport.Value, 7

En de functie werkt als volgt:
Code:
Function CopyReport(Rapport As String, Optional Nummer As Integer)
Dim sRapport As String

    If Nummer = 0 Then Nummer = 1
    sRapport = Rapport & "_" & Right("0000" & Nummer, 4)
    DoCmd.CopyObject , sRapport, acReport, Nz(Me.cboSelectReport.Value)
    DoCmd.OpenReport sRapport, acViewDesign, , , acHidden
    Reports(sRapport).Report.Caption = sRapport
    DoEvents
    DoCmd.SendObject acSendReport, sRapport, acFormatXLS, strRecipients, , , "Header tekst", "Body tekst"
    DoCmd.Close acReport, sRapport, acSaveYes
    DoCmd.DeleteObject acReport, sRapport

End Function

Je ziet dat ik eerst een kopie maak van het rapport. Vervolgens wordt het rapport geopend in Designview (Hidden), en wordt daarna de Caption aangepast. Daarna wordt het rapport gemaild, gesloten en verwijderd.
Maak je geen kopie, dan kan ik mij voorstellen dat je de oorspronkelijke caption weer terug wilt zetten.

Dan krijg je zoiets:
Code:
Function CopyReport(Rapport As String, Optional Nummer As Integer)
Dim sBijschrift As String

    If Nummer = 0 Then Nummer = 1
    sBijschrift = Rapport & "_" & Right("0000" & Nummer, 4)
    DoCmd.OpenReport Rapport, acViewDesign, , , acHidden
    Reports(Rapport).Report.Caption = sBijschrift
    DoEvents
    DoCmd.SendObject acSendReport, Rapport, acFormatXLS, strRecipients, , , "Header tekst", "Body tekst"
    DoCmd.Close acReport, Rapport, acSaveNo

End Function
Geen idee of dit sneller is, maar dat merk je gauw genoeg ;)
 
Octafish (Michel)

Prachtig :D
Precies wat ik wilde bereiken, zelfs zonder een copy van het betreffende rapport te maken.
Werkt perfect.

Hieronder een voorbeeld van de "oplossing" (zonder gebruik te maken van een "Function", maar kan natuurlijk net zo goed)
['t is maar een voorbeeld, mss kan iemand er nog iets aan hebben...]

En niet te vergeten: oplossing is gevonden dankzij de hulp van Octafish! :thumb:

Thnx,
Peter :D

Code:
Private Sub btnSendMail_Click()
On Error GoTo error_SendMail

    Dim CurrentID As String
    Dim PrintName As String
    Dim lRptCap As String
    
    CurrentID = Format(Me.Opdracht_ID.Value, "1100000")
    PrintName = CurrentID & ".pdf"
        
    DoCmd.SetWarnings False
        
    DoCmd.RunCommand acCmdSaveRecord
        
    DoCmd.OpenReport "Rapportnaam", acViewDesign, , , acHidden
    lRptCap = Reports("Rapportnaam").Report.Caption
    Reports("Rapportnaam").Report.Caption = CurrentID
    
    DoCmd.SendObject acSendReport, _
                        "Rapportnaam", _
                        acFormatPDF, , , , _
                        "doe iets met " & printname & " A.U.B", _
                        "Zie bijlage met details"
    
    Reports("Rapportnaam").Report.Caption = lRptCap
    DoCmd.Close acReport, "Rapportnaam"
    DoCmd.SetWarnings True
           
error_SendMail:
    'hier kan nog een error opgevangen worden
     Exit Sub
    
End Sub
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan