Presentazione
Fondamentalmente, per ottenere i risultati che vogliamo, dobbiamo partire da una base di dati coerente (tabella mail_list) che contenga i dati utili per ogni singolo utente (destinatario) e che includa qualche dettaglio per le personalizzazioni (un titolo, una motivazione per l’invio, l’indirizzo email ecc.).
Affinché lo strumento sia minimamente funzionale, dobbiamo avere la possibilità di creare gruppi d’invio (tabella mail_groups) in modo tale da non dover scegliere ogni volta “a chi spedire” ma svolgere questo lavoro una sola volta, associando ogni destinatario a uno o più gruppi d’invio. Per fare questo ci serviamo della relazione molti-a-molti per il tramite di una tabella di scambio (tabella sc_ruolo).
Ovviamente è necessaria anche un’altra tabella (tabella Campagne) che contiene tutti i dati necessari a contenere ciò che verrà stampato: Un attestato, una certificazione, una semplice lettera ecc.)
Dal momento che spesso le campagne d’invio tendono ad essere molto simili tra di loro, è importante disporre di una tabella (tabella campagne) in grado di memorizzare tutti gli elementi che verranno variamente distribuiti sullo “stampato” generato dallo strumento Report di Access (report Campagne) e successivamente convertito in un file PDF.
Dal momento che i Report di Access sono pensati come strumento in grado di rendere a video e stampa un insieme di record risultato di una query e non un singolo record, è necessario trovare un artificio che ci consenta, ciclicamente, di creare una tabella temporanea contenente un singolo record con TUTTI i dati che saranno necessari per la stampa. A questo scopo ho pensato di creare due tabelle temporanee (tabella _temp e tabella _record). La prima (_temp) conterrà TUTTI i record da stampare in base alla campagna scelta e al gruppo d’invio selezionato, la seconda (_record) verrà creata e cancellata ciclicamente tramite VBA per darci modo da creare (ciclicamente) report basati su un singolo set di dati.
Il trucco è quindi assai semplice, come semplice è il codice strettamente necessario a svolgere queste specifiche funzioni.
Alcune “curiosità”
Ho utilizzato un artificio molto particolare per la creazione della query di selezione (query1) che ha il compito di “mettere insieme” tutti i dati necessari per la stampa del Report. Se osserverete bene le tabelle Campagne e mail_groups noterete che entrambe contengono un campo “fakeid” valorizzato, in entrambe le tabelle, a Zero.
Ciò è reso necessario dal particolare comportamento delle query di Access: Affinché il motore di calcolo prenda in considerazione una tabella (quando la query è basata su 2 o più tabelle, ovviamente) è necessaria una relazione tra tutte le tabelle componenti la query. Dal momento che nel mio progetto non esiste alcuna relazione “strutturata” tra la tabella campagna e un gruppo d’invio (tabella mail_groups) ma, d’altro canto, è necessario fare comparire sul report i dati di stampa, ho sceltola curiosa soluzione di mettere in relazione due fakeid (falsi id), a valore sempre costante, in modo tale da non interferire nella selezione degli indirizzi ma di fornire nel contempo, per ogni indirizzo, tutti i dati di stampa.
Troverete nel DB, inoltre, un paio di query “speciali” (query crea_temp e query crea_record) assolutamente inutili “a regime”: esse creano le relative tabelle temporanee che poi verranno cancellate e ricreate dal codice VBA. Lo scopo è quello di mantenere semplice ed essenziale il codice e quindi, per il “primo avvio” dell’applicazione, è necessario che le due tabelle “esistano” dal momento che VBA le andrà a cancellare. (si, esiste la possibilità di controllarne la presenza da codice, è vero, ma leggi quanto appena detto e ciò che segue). Inoltre ho pensato che sarebbe stata un’ottima occasione per mostrare il funzionamento di una query “di creazione tabella“, basata com’è ovvio, su una più nota “query di selezione“.
ADDENDUM – Inviare email da uno specifico account Outlook
Qualora il vostro Outlook fosse configurato con più di un account, come spesso accade, potreste desiderare di inviare il vostro materiale da uno specifico account, diverso da quello predefinito.
Gli account sono numerati da 1 a n, a seconda del numero
Solitamente non ne avrete più di due o tre e quindi potreste procedere per tentativi, altrimenti più avanti vi spiegherò come individuarli con precisione. Magari potreste su quella base architettare una routine per una scelta “caso per caso o sessione per sessione” dell’account d’invio da utilizzare.
Nel codice VBA, Modulo1, in prossimità della fine della function SendEmail, appena PRIMA dell’istruzione “.Send” inserite:
'usa l'account numero item.SendUsingAccount = obj.Session.Accounts(2)
com’è probabilmente ovvio, in questo esempio invierò utilizzando l’account numero 2!
il codice che segue, rintracciato per voi qui, scriverà nella finestra immediata i dati relativi agli account attualmente presenti nel vostro Outlook e ve ne fornirà il numero progressivo:
Sub sendCaller() 'creates outlook application 'chooses an email address and finds the corresponding account number Dim OutApp As Object Dim i As Integer, accNo As Integer Set OutApp = CreateObject("Outlook.Application") emailToSendTo = "This email address is being protected from spambots. You need JavaScript enabled to view it." 'put required email address 'if smtp address=email we want to send to, acc no we are looking for is identified For i = 1 To OutApp.Session.Accounts.Count 'Uncomment the Debug.Print command to see all email addresses that belongs to you Debug.Print "Acc name: " & OutApp.Session.Accounts.item(i) & " Acc number: " & i & " email: " & OutApp.Session.Accounts.item(i).SmtpAddress If OutApp.Session.Accounts.item(i).SmtpAddress = emailToSendTo Then accNo = i Next i End Sub
Prima Parte
[mx_youtuber type="video" id="Mh_k0SfnlXc"]
Seconda Parte [mx_youtuber type="video" id="YbE3SNZySZo"]