Hoe kan ik een filter zetten in DoCmd.SendObject

Status
Niet open voor verdere reacties.

castella

Gebruiker
Lid geworden
1 mrt 2013
Berichten
13
Ik heb een stukje code geschreven om eenvoudig alle medewerkers in een tabel een update hun activiteiten te kunnen mailen.
Ik was in eerste instantie begonnen met het Docmd.openReport om wat dingen uit te proberen.
Deze functie beschikt zowel over een "Filter" als ove reen "WhereCondition" parameter.
Toen ik he omzette naar de .SendObject kwam ik erachter dat die parameters daar niet in zitten.

Ik heb het nu als volgt opgelost maar vraag me af of ik niet op een andere manier een filter in .sendobject can toevoegen.
Ik heb die preview van het report namelijk niet nodig.

Code:
For i = 0 To RecordCount - 1
         Dim sText As String
         intId = anarray(i, 0)
         DoCmd.OpenReport "q_StatusUpdateMail", acViewPreview, , "tPersoon1.id = " & [intId], , _
         sText = "Body Tekst " & anarray(i, 1) & "." & " Body tekst"
         DoCmd.SendObject acSendReport, , acFormatPDF, _
         anarray(i, 2), , , "Subject " & anarray(i, 1), sText, False
         DoCmd.Close acReport, "q_StatusUpdateMail"
       Next i

M.v.g.
 
Je kunt geen filter aan Sendobject toevoegen. Dus ofwel deze techniek blijven gebruiken, ofwel een procedure maken die het rapport fysiek filtert, en dan verstuurt met Sendobject. In het laatste geval moet je het rapport in Design modus openen, de Recordsource instellen op het filter, het rapport opslaan en versturen met Sendobject. Is waarschijnlijk niet of nauwelijks sneller, dus of je er veel mee opschiet... Je kunt overigens het rapport Hidden zetten door acHidden toe te voegen aan je opdrachtregel. Zie je 'm ook niet.
 
Dank je wel

Hidden had ik overigens ook geprobeerd maar dan werk het tweede commando niet zonder het Report specifiek te benoemen in de sendobject.
En als ik dat doe werkt het filter dus niet meer.
Het is me nog niet gelukt om de variabele die als filter werkt in de query te krijgen. Zal wel komen doordat het een private is.

M.v.g.
 
Verbaast me niks, want dat is een hele andere werkwijze ;) Zo doe ik het:
Code:
Private Sub cmdMailRapport_Click()
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
        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
End Sub
Voorbeeldje is denk ik wel aan te passen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan