"Persoonlijk" rapport verzenden

Status
Niet open voor verdere reacties.

Inne1981

Gebruiker
Lid geworden
23 feb 2016
Berichten
6
Hallo, ik heb een vraag over het verzenden van een rapport per dienst.

Ik heb een evaluatiedatabank en ik zou met 1 druk op de knop een mail willen versturen waarin alle te evalueren personen van die dienst in staan.
We werken met Lotus Notes.

Voorlopig heb ik onderstaande code (met hulp van dit forum):

Code:
Private Sub Verzenden_Click()

With CurrentDb.OpenRecordset("qryContactPersonen_arb")
    .MoveFirst
    Do While Not .EOF
        'defineren ontvanger en actienemer met veld uit recordset
        Ontvanger = !EmailAdres
        Dienst = !Omschrijving

        'report openen voor eerste naam
        DoCmd.OpenReport "rptoptevolgencontracten_mailingArb", acViewPreview, "Dienst = '" & Dienst & "!"
        'report verzenden naar eerste ontvanger
        DoCmd.SendObject acSendReport, , acFormatPDF, Ontvanger, , , "Op te volgen contracten Arbeiders" _
            , "Gelieve de werknemers in bijlage te evalueren en me de ingevulde formulieren voor eind volgende maand terug te bezorgen. (zowel hardcopy als elektronische versie in excel ", True
        'voorgaande herhalen
        DoCmd.Close acReport, "rptOptevolgencontracten_mailingArb", acSaveNo
        .MoveNext
    'herhalen tot einde van de recordset
    Loop
End With
End Sub

Dit werkt in zoverre dat hij het juiste aantal emails aanmaakt, met de juiste emailadressen in, maar het rapport in bijlage is het ganse rapport en niet gefilterd op dienst (=omschrijving).

Kan iemand mij hierbij helpen?

groetjes!
 
Je techniek is verkeerd. Zelf gebruik ik altijd een vaste query onder het rapport die ik m.b.v. de QueryDefs collectie steeds aanpas. Het rapport krijgt dus elke kee als je het verzend een ander vast filter mee. Dan hoef je het rapport ook nooit meer te openen, wat je nu wel doet.
 
Dag OctaFish,

Hoe doe ik dit dan juist?

Het rapport is gebaseerd op een query, maar ik heb geen idee hoe ik met VBA-code deze kan filteren.

groetjes,
Inne
 
Een rapport filteren heeft niet zoveel zin; dat werkt alleen bij een preview van het rapport. Ik bouw dus de string op die ik nodig heb voor het rapport (dus met filter) en maak dan een object aan. Daarvan verander ik dan de SQL.
Zoek maar in dit forum op QueryDef voor wat voorbeelden. Die zijn overigens redelijk standaard, zul je dan wel zien :).
 
Hoi,

Ik heb het onderstaande in elkaar gepuzzeld:

Code:
Private Sub MailingOTVarb_Click()
On Error GoTo CTG_Fout
    
    MsgBox ("Job gestart")
    
    DoCmd.Hourglass True


    Dim Mydb As Database
    Dim qdfEvaluatie As QueryDef
    Dim myrs, myfout As Recordset
    Dim Myquery As QueryDef
    
    Dim bestem As String
       
        
    Set Mydb = DBEngine.Workspaces(0).Databases(0)
    
    Set myrs = Mydb.OpenRecordset("qryContactPersonen_arb", DB_OPEN_DYNASET)
    
    On Error Resume Next
    
    
    On Error GoTo CTG_Fout
 
  
    Do While Not myrs.EOF
    
        bestem = myrs!emailadres
           
           Set qdfEvaluatie = Mydb.CreateQueryDef("qryOpTeVolgenContracten_mailingArb" _
           , "SELECT * , FROM qryOpTevolgencontracten_mailing where qryOpTeVolgenContracten_mailing.[msgrp] = 01 and qryOpTeVolgenContracten_mailing.[omschrijving] " & myrs!omschrijving)
           

        Set myfout = Mydb.OpenRecordset("qryOpTeVolgenContracten_mailingArb", DB_OPEN_DYNASET)
        If Not myfout.EOF Then
          DoCmd.Echo False, "Evaluatie versturen aan " & bestem
          
        DoCmd.SendObject acSendReport, , acFormatPDF, Ontvanger, , , "Op te volgen contracten Arbeiders" _
         , "Gelieve de werknemers in bijlage te evalueren en me de ingevulde formulieren voor eind volgende maand terug te bezorgen. (zowel hardcopy als elektronische versie in excel ", True
          
          
        End If
    
    
        If Not myrs.EOF Then
          myrs.MoveNext
        End If
    Loop
    
    DoCmd.Echo True
    DoCmd.Hourglass False

    
       

CTG_Exit:
        Exit Sub

CTG_Fout:
    MsgBox Err.Description
    DoCmd.Hourglass False
    Resume CTG_Exit
End Sub

Als ik dit wil uitvoeren, toont hij de gevraagde msgbox (Job gestart), maar daarna krijg ik de melding "Ongeldig gebruik van Null".
 
D'r zitten wel een paar foutjes in je code, groot en klein. Een kleine is bijvoorbeeld dat je code ongeveer 2 keer zo lang is (in lengte) als nodig; komt puur doordat je ongelooflijk vaak op de Enter toets hebt gedrukt. Tenzij je aandelen hebt in muizenfabrieken, zodat het de bedoeling is dat mijn muis sneller slijt van het scrollen, zou ik dat toch netter neerzetten (in ieder geval voor ons :).)
Tweede kleine foutje is: je gebruikt 2 recordsets, maar declareert er maar één als recordset. Dat helpt natuurlijk ook niet echt. Dus dat had zo gemoeten:
Code:
Dim myRS As DAO.Recordset, myFout As DAO.Recordset
Dit:
Code:
    On Error Resume Next
    On Error GoTo CTG_Fout
Werkt natuurlijk ook niet; de eerste regel doet hier helemaal niks.

Veel grotere fout: (we bouwen het op!) is dat je een criterium gebruikt dat nooit kan werken. Dit:
Code:
WHERE [msgrp] = 01 AND [omschrijving] " & myRS!omschrijving
moet zo:
Code:
WHERE [msgrp] = 01 AND [omschrijving] = " & myRS!omschrijving
Verder stuur je de mail naar de variabele (veld?) Ontvanger, die ik nergens terug zie. Wél de variabele Bestem, en daar staat volgens mij het gewenste email adres in.
Als laatste: hier snap ik helemaal niks van; wat wil je hier bereiken?
Code:
        Set qDef = Mydb.CreateQueryDef("qTemp", "SELECT * FROM qryOpTevolgencontracten_mailing WHERE [msgrp] = 01 AND [omschrijving] = " & myrs!omschrijving)
        Set myfout = Mydb.OpenRecordset("qTemp", DB_OPEN_DYNASET)
Ik gebruik querydefs om een (al dan niet tijdelijke) queryobject te maken en daar een SQL achter te hangen. Dat doe je op zich prima met de eerste regel. Het te mailen rapport hang ik dan aan die query, zodat het rapport de gewenste data laat zien. De query zelf hoef je m.i. nooit te openen, want de adressen haal je al uit een andere bron. Ik zou de filtering dus in die andere query hebben gezet; daarmee krijg je een recordset die alle gewenste records bevat en die ga je dan mailen. En wát je mailt, is het rapport dat je met behulp van de QueryDef elke keer voor elk record een andere selectie hebt gegeven.
 
Dag OctaFish,

Bedankt voor je snelle reactie!

:o Ik ben inderdaad een "enter" liefhebber. Heb er ondertussen een aantal uitgehaald ;)

De meeste foutjes heb ik er ook uit gehaald. (Denk ik toch)

Hoe koppel ik die tijdelijke query dan aan het rapport? Nu is het gebaseerd op een "gewone" query.

groetjes,
Inne
 
Ik noem het een 'tijdelijke' query, maar het is bij mij meestal een vaste query. Met wisselende (lees: tijdelijke) inhoud. Ik maak dus meestal voor dat doel één query die ik dan doorgaans qTemp noem, en die de ene keer aan een rapport hangt, de volgende keer aan een formulier, dan voor en Export naar Excel en dan weer een (al dan niet ander) rapport.
 
Als ik dan mijn vaste query gebruik, moet ik misschien geen "CreateQueryDef" gebruiken, maar iets anders?
 
Die heb je nog steeds nodig, want de QueryDef die je maakt gebruik je om de opgeslagen (vaste) query te bewerken. Aan de ene (navigatie) kant heb je dus een query in Query's overzicht, aan de VBA kant maak je een object waarmee je de query manipuleert. Een echte tijdelijke query maak je overigens op dezelfde manier, maar die krijgt geen naam. Je maakt dus een QueryDefs object zonder naam, en daar hang je SQL aan. De query is dan ook weg als je Access afsluit.
 
Momenteel heb ik onderstaande code:

Code:
Private Sub MailingOTVarb_Click()
On Error GoTo CTG_Fout
    MsgBox ("Job gestart")
    DoCmd.Hourglass True

    Dim Mydb As Database
    Dim qdfEvaluatie As QueryDef
    Dim myrs As DAO.Recordset, myfout As DAO.Recordset
    Dim bestem As String
    Set Mydb = CurrentDb
    Set myrs = Mydb.OpenRecordset("tblContactPersonen", DB_OPEN_DYNASET)
    
    On Error GoTo CTG_Fout
  
    Do While Not myrs.EOF
       bestem = myrs!emailadres
       Set qdfEvaluatie = Mydb.CreateQueryDef("qryOpTeVolgenContracten_mailingArb" _
      , "SELECT * , FROM qryOpTevolgencontracten_mailing WHERE [msgrp] = 01 and [omschrijving] = " & myrs!omschrijving)
         
       DoCmd.SendObject acSendReport, "rptOpTeVolgenContracten_mailingArb", acFormatPDF, bestem, , , "Op te volgen contracten Arbeiders" _
         , "Gelieve de werknemers in bijlage te evalueren en me de ingevulde formulieren voor eind volgende maand terug te bezorgen. (zowel hardcopy als elektronische versie in excel ", True
        If Not myrs.EOF Then
          myrs.MoveNext
        End If
  Loop
    DoCmd.Echo True
    DoCmd.Hourglass False

CTG_Exit:
        Exit Sub

CTG_Fout:
    MsgBox Err.Description
    DoCmd.Hourglass False
    Resume CTG_Exit
End Sub

Eerst kreeg ik de melding dat de query al bestond.
Ik heb de query dan even een andere naam gegeven, maar dan krijg ik onderstaande melding:

"De instructie SELECT bevat een gereserveerd woord of een argumentnaam die verkeerd is gespeld, ontbreekt, of een verkeerd leesteken heeft."

Ik zie niet direct waar ik iets fout heb staan...
 
Een query kun je maar één keer maken. Daarom gebruik ik CreateDef eigenlijk nooit. Ik hang de qDef aan een bestaande query. Wel zet ik CreateDef in een foutroutine want als de bewerkte query niet bestaat, moet hij uiteraard aangemaakt worden.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan