Newsgroup: it.comp.appl.access
Titolo: Invio multiplo di report via email

Ciao a tutti,
Avrei la necessità di inviare un report (estratto conto) a tutti i clienti via email simultaneamente. Attualmente invio il report singolarmente via outlook utilizzando questo semplice funzione:
 
DoCmd.SendObject acSendReport, "estratto_conto", acFormatPDF, Me.email, , , "Estratto Conto", "Trasmettiamo in allegato estratto conto", True
 
Riesco in qualche modo a inviare tutti i report contemporaneamente (ovviamente tali report sono filtrati in base alla scadenza)?
 
Grazie a tutti per l'eventuale risposta.

mettila in un ciclo
 
dim db as database
dim rs as recordset
 
set db = currentdb
set rs=db.openrecordset(TuaTabella)
 
rs.movelast
rs.movefirst
 
' rs!email e' quello che filtra il report
do 
 DoCmd.SendObject acSendReport, "estratto_conto", acFormatPDF, rs!email, , , "Estratto Conto", "Trasmettiamo in allegato estratto conto", True
   rs.movenext   
 
   if rs.eof
      exit do
   endif
loop


I dati per il report, che ovviamente è diverso per ogni cliente, li prendo da una query indirizzi email compresi. Non sono molto pratico... posso utilizzare sempre questa funzione?
Ciao


i dati ovviamente sono diversi ma la struttura del record e' la stessa
 
come si chiama la query che utilizzi per puntare il cliente?
es. se la query di chiama qClienti
 
alla riga metti
 
set rs = db.openrecordset("qclienti")
 
fammi sapere


Niente da fare, probabilmente sbaglio qualcosa...
Penso sia colpa del report in quanto la query da cui è generato la filtro ulteriormente con il codice cliente in modo che mi esca l'estratto conto relativo solo a quel cliente. 
 
Io parto da x tabelle (non modificabili e facenti parti di altra procedura), tramite query mi prendo tutti i dati che mi interessano dalle varie tabelle e il risultato della querty è grossomodo qualcosa del genere:
 
CodCliente NomeCliente Importo Email (+ ovviamente altri campi)
001 Rossi 1000,00 
ro...@email.com
 
002 Bianchi 2000,00 
bia...@email.com
 
003 Verdi 3000,00 
ve...@email.com
 
 
Il report come ti dicevo è agganciato al codice cliente.
Dove sbaglio?
 
Grazie


1- la query funziona?
2- prova a filtrare la query WHERE cod_cli=1 ES ESEMPIO e salvala
3- se lanci il report funziona?
4- riapri la query e togli il filtro e salva
5- se lanci il report funziona?
 
mi metti la stinga sql della query?
 
Grazie


non e' che basta modificare la riga
 
 DoCmd.SendObject acSendReport, "estratto_conto", acFormatPDF, rs!Cod_cli, , , "Estratto Conto", "Trasmettiamo in allegato estratto conto", True


Ho fatto diverse prove... 
Se nella query non metto filtri la procedura funziona solo che ovviamente il report contiene i dati di tutti i clienti e non del singolo cliente. 
La modifica alla riga che proponi non può funzionare in quanto a quel punto si aspetta di trovare l'indirizzo email e non il codice cliente. 
 
Questa è la query: 
SELECT SCADENZE.dat_scadenza, DOCUMENTI.cod_clifor, ANAGRAFICHE.des_ragsoc, SCADENZE.val_da_pagare, ANAGRAFICHE.des_email1 
FROM (DOCUMENTI INNER JOIN SCADENZE ON DOCUMENTI.prg_documento = SCADENZE.prg_documento) INNER JOIN ANAGRAFICHE ON DOCUMENTI.cod_clifor = ANAGRAFICHE.cod_anagra 
WHERE (((DOCUMENTI.ind_clifor)="C") AND ((SCADENZE.cod_tipo_pag)="RB")) 
GROUP BY SCADENZE.dat_scadenza, DOCUMENTI.cod_clifor, ANAGRAFICHE.des_ragsoc, SCADENZE.val_da_pagare, ANAGRAFICHE.des_email1 
HAVING (((SCADENZE.dat_scadenza) Between #7/1/2013# And #7/31/2013#)); 
 
I tre filtri presenti, che ora sono valori fissi, li prendo da una maschera sempre aperta e non dovrebbero esserci problemi. 
 
Io dovrei creare un report per ogni DOCUMENTI.cod_clifor 
 
Penso che più che "ciclare" l'email si dovrebbe ciclare cod_clifor e in qualche modo passare questo al report solo che non idea di come si faccia.
 
Grazie ancora per l'aiuto :)


se la query che hai trascritto e' giusta
 
DOCUMENTI.cod_clifor
 
docmd.openreport(nomereport,acpdf,,"DOCUMENTI.cod_clifor = " & ![DOCUMENTI].[cod_clifor],.....
 
cosi' lanci il report con la condizione aggiuntiva del clifor

Faccio qualche cazzata io a questo punto...
 
Dim db As Database
Dim rs As Recordset
Dim stDocName As String 'aggiunto
 
Set db = CurrentDb
Set rs = db.OpenRecordset("scadenze_cliente2")
stDocName = "scadenze_cliente2" 'aggiunto
 
 
rs.MoveLast
rs.MoveFirst
 
' rs!email e' quello che filtra il report
Do
DoCmd.OpenReport stDocName, acViewPreview, , "DOCUMENTI.cod_clifor = '" & CO_DOCUMENTI].[cod_clifor] & "'"
DoCmd.SendObject acSendReport, stDocName, acFormatPDF, rs!des_email1, , , "Estratto Conto", "Trasmettiamo in allegato estratto conto", True
 rs.MoveNext
 
If rs.EOF Then
      Exit Do
   End If
Loop
 
Se metto un valore fisso:
 
DoCmd.OpenReport stDocName, acViewPreview, , "DOCUMENTI.cod_clifor = '1111'"
 
Funziona ma ovviamente manda sempre lo stesso report legato al cliente 1111


Il giorno giovedì 25 luglio 2013 15:33:24 UTC+2, slumpolo ha scritto:


 
la mail (se funziona il report )


Si query e report funzionano senza problemi ed hanno lo stesso nome (li ho creati al volo ad hoc per fare esperimenti). Penso di sbagliare qualcosa nella condizione where in:
 
DoCmd.OpenReport stDocName, acViewPreview, , "DOCUMENTI.cod_clifor = '" & èCO_DOCUMENTI].[cod_clifor] & "'" 
 
Ho provato a mettere anche cod_clifor in questo modo !rs ma niente da fare...


 
prova a 
scrivere 
debug.print "DOCUMENTI.cod_clifor = '" & [CO_DOCUMENTI].[cod_clifor] & "'" 
 
e vedere se nella finestra di debug se' corretta
 
piuttosto apri la query e aggiungi alla fine di WHERE .... AND con la parte incollata e vedi se funziona la query


Niente da fare... ci rinuncio...
In ogni caso non guadagnerei tempo in quanto ad ogni ciclo mi apre outlook e devo cliccare su invia per far uscire l'email.
Ti ringrazio tantissimo per l'aiuto.
Andrea


Alla fine sono riuscito a ottenere un codice funzionante prendendo spunto qua e la. Lo posto nel caso in cui a qualcuno tornasse utile:
 
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim ConteggioRecord As Long
    Dim codice As String
    Dim email As String
    Dim stDocName As String
 
      ' Apre la query "email"
    Set db = CurrentDb
    Set rst = db.OpenRecordset("email")
 
    ' Va avanti in caso di errore
    On Error Resume Next
 
    ' Conteggio record presenti nella query
    ConteggioRecord = rst.RecordCount
 
    ' Se nessun record crea messaggio apposito
    If ConteggioRecord = 0 Then
      MsgBox "Nessuna report da creare", vbInformation
 
    ' Altrimenti inizia loop
    Else
      rst.MoveLast
      rst.MoveFirst
      Do Until rst.EOF
      ConteggioRecord = ConteggioRecord + 1
 
    ' Imposta indirizzo destinatario, da utilizzare nel caso di invio email
    email = rst![des_email1]
 
    ' Imposta codice cliente
    codice = rst![cod_cliente]
 
'imposta report - il report chiaramente è filtrato per codice cliente
    stDocName = "email"
 
    ' Compila il messaggio email
 
   DoCmd.OpenReport stDocName, acViewPreview, , "cod_cliente = " & "'" & codice & "'"
   DoCmd.OutputTo acOutputReport, stDocName, acFormatPDF, "h:\report_" & codice & ".pdf", True
    DoCmd.Close acReport, stDocName
    ' Passa al record successivo
 
    rst.MoveNext
    Loop
 
    ' Messaggio di conferma
    ConteggioRecord = ConteggioRecord - 1
    MsgBox "Creati correttamente " & ConteggioRecord & " report."
    End If
 
    'Chiude query e database
    rst.Close
    db.Close
    Set rst = Nothing
    Set db = Nothing
    Close
 
Ciao


grazie slumpolo!
riesci a postare un file esemplificativo del tuo per comprendere meglio i passaggi?
Grazie per l'aiuto.


No mi dispiace, tutte le tabelle sono su SQL e dovrei creare un esempio ad hoc.
Cmq è abbastanza semplice:
1) Parti da x tabelle dove ovviamente sono presenti i tuoi dati
2) Ti crei una query con i dati che ti interessano (nell'esempio la query si chiama "email")
3) Ti crei un report dalla query in questione (nell'esempio anche il report si chiama email) che viene filtrato, ad esempio, per codice cliente
 
Ciao
