Concatena email

di il
10 risposte

Concatena email

Un saluto a tutti, sono nuovo del forum e alle prime armi con access. Sto realizzando un data base per l'ufficio dove lavoro. Ho creato una tabella "E-Mail" con i seguenti campi: Cognome, Nome, Selezione(vero/falso) e email. Dovrei adesso riuscire a concatenare tutti gli indirizzi email con la ; in una casella di testo ma solo se il controllo, nel campo seleziona, è vero.
Esempio: ;;;.
Come posso fare? Grazie mille.

10 Risposte

  • Re: Concatena email

    Se non hai competenze in VBA è impossibile...
    Se invece qualche cosa mastichi... apri un Recordset con un predicato SQL avente il criterio da te menzionato e ciclandolo con un Loop, record per record, vai a costruire la stringa per concatenazione.
  • Re: Concatena email

    Ciao Alex, grazie per la tempestiva risposta. Sono acerbo di VBA per questo mi sono iscritto al forum. Se puoi darmi una mano Alex ne sarei estremamente felice. Grazie.
  • Re: Concatena email

    lovangel ha scritto:


    Ciao Alex, grazie per la tempestiva risposta. Sono acerbo di VBA per questo mi sono iscritto al forum. Se puoi darmi una mano Alex ne sarei estremamente felice. Grazie.
    Pochi giorni fa ho dato un suggerimento dove si cicla un recordset proprio per concatenare campi contenenti testo, qui:

    http://forum.masterdrive.it/access-79/funzione-analoga-dsum-lavori-campi-testo-memo-campi-numerici-84011/

    Dove ho scritto
    Set rs = DBEngine(0)(0).OpenRecordset("non_ne_ho_la_minima_idea")
    al posto di "non_ne_ho_la_minima_idea" metti la query o il predicato SQL che restituisce l'elenco che ti interessa. Cerca nella guida in linea Database.OpenRecordset, metodo per capire come/se impostare i parametri opzionali.

    L'esempio che ho segnalato trattava due campi, nel tuo caso è ancora più semplice perché è un campo solo, quindi una sola variabile ecc. (meno righe di codice che ti confondono).
    Scegli poi come visualizzare il risultato. In quel caso finiva in due controlli memo della maschera, ma quella era una "richiesta specifica" di chi aveva aperto il thread.

    Non ho avuto la conferma che funziona però nelle mie prove funzionava quindi lo do per "buono" fino a segnalazione contraria.
  • Re: Concatena email

    Ciao da Philcattivocarattere, grazie al tuo suggerimento ho tirato fuori questo codice:

    Private Sub MailingList_Click()
    Dim strElencoMail As String
    Dim rs As DAO.Recordset
    set rs=DbEngine(0)(0).OpenRecordset("SELECT [EMAIL] FROM [E-MAIL] WHERE [Seleziona]=true")
    If not (rs.BOF end rs.EOF) Then
    rs.MoveFirst
    strElencoMail=rs.Fields("EMAIL").Value
    rs.MoveNext
    Do Until rs.EOF
    strElencoMail = strElencoMail & ";" & rs.Fields("EMAIL").Value
    rs.MoveNext
    Loop
    End If
    rs.Close
    set rs=nothing
    MailingList.value= strElencoMail
    End Sub

    Funziona!!! L'unco intoppo è che se nel campo seleziona ho tutti falso, il codice mi inserisce lo stesso nella casella di testo l'indirizzo email del primo record.
  • Re: Concatena email

    lovangel ha scritto:


    Ciao da Philcattivocarattere, grazie al tuo suggerimento ho tirato fuori questo codice:

    Private Sub MailingList_Click()
    Dim strElencoMail As String
    Dim rs As DAO.Recordset
    set rs=DbEngine(0)(0).OpenRecordset("SELECT [EMAIL] FROM [E-MAIL] WHERE [Seleziona]=true")
    If not (rs.BOF end rs.EOF) Then
    rs.MoveFirst
    strElencoMail=rs.Fields("EMAIL").Value
    rs.MoveNext
    Do Until rs.EOF
    strElencoMail = strElencoMail & ";" & rs.Fields("EMAIL").Value
    rs.MoveNext
    Loop
    End If
    rs.Close
    set rs=nothing
    MailingList.value= strElencoMail
    End Sub

    Funziona!!! L'unco intoppo è che se nel campo seleziona ho tutti falso, il codice mi inserisce lo stesso nella casella di testo l'indirizzo email del primo record.
    Ehm... in teoria non dovrebbe farlo. Prova a scrivere in una query "normale" (quindi fuori vba) lo stesso predicato SQL con il quale apri il recordset: SELECT [EMAIL] FROM [E-MAIL] WHERE [Seleziona]=true e guarda se seleziona qualcosa: quello è il contenuto del recordset
    Il ciclo prende quello che trova nel recorset, non nella tabella [E-MAIL] indicata per la sua apertura. Significa che comunque c'è un record [SELEZIONA] = true.
    Forse.
  • Re: Concatena email

    Me ne sono accorto dopo aver risposto.

    lovangel ha scritto:


    Ciao da Philcattivocarattere,
    If not (rs.BOF end rs.EOF) Then
    Funziona!!! L'unco intoppo è che se nel campo seleziona ho tutti falso, il codice mi inserisce lo stesso nella casella di testo l'indirizzo email del primo record.
    Attento! cos'è quell' end tra rs.BOF e rs.EOF?
    La sintassi giusta è
    If not (rs.BOF and rs.EOF) Then
    Prima sistema questo e riprova. Dopo eventualmente analizza in base a quello che ho scritto nella risposta che precede questa.
  • Re: Concatena email

    Perfetto Philcattivocarattere, funziona alla grande!!!! Prima non funzionava perchè quando modificavo il campo "seleziona" non facevo salva. Grazie sei stato preziosismo!!
  • Re: Concatena email

    Faccio qualche ottimizzazione...
    
    set rs=DbEngine(0)(0).OpenRecordset("SELECT [EMAIL] FROM [E-MAIL] WHERE [Seleziona]=true")
    ' Basta controllare EOF per testare se è VUOTO
    If not rs.EOF Then
       rs.MoveFirst
       Do Until rs.EOF
          strElencoMail = strElencoMail & rs.Fields("EMAIL").Value & ";"
          rs.MoveNext
       Loop
    End If
    ' Rimuovo il [;] finale...
    If Len(strElencoMail)>0 then strElencoMail = Mid$(strElencoMail,1,Len(strElencoMail)-1)
    ....
  • Re: Concatena email

    Ciao Alex, ho appena modificato il codice come da te suggerito. Ho notato che così facendo mi toglie l'ultima lettera dell'indirizzo email anzichè ";" Ho cambiato solo la parte "if not rs.EOF then" l'ho provato e funziona. Grazie a tutti per il prezioso aiuto senza il quale nn ci sarei riuscito.
  • Re: Concatena email

    lovangel ha scritto:


    Ciao Alex, ho appena modificato il codice come da te suggerito. Ho notato che così facendo mi toglie l'ultima lettera dell'indirizzo email anzichè ";" Ho cambiato solo la parte "if not rs.EOF then" l'ho provato e funziona. Grazie a tutti per il prezioso aiuto senza il quale nn ci sarei riuscito.
    Perché, come dici tu stesso, hai modificato solo la parte "if not rs.EOF then".
    Nella versione di @Alex, rispetto "al mio", già il primo record è trattato all'interno del ciclo ed è stato posizionato il segno di separazione tra i campi alla fine dell'istruzione di concatenazione
    strElencoMail = strElencoMail & rs.Fields("EMAIL").Value & ";"
    In questo modo quando analizza il primo record non parte già con il ";" (cosa che aveva costretto me a trattare il primo record prima del ciclo) ma lo mette subito nella posizione corretta.
    Il problema si presenta alla fine, con l'ultimo record, quando la stringa viene chiusa sempre dal segno di separazione.
    Ecco perché @Alex ha aggiunto (con tanto di commento esplicativo)
    ' Rimuovo il [;] finale...
    If Len(strElencoMail)>0 then strElencoMail = Mid$(strElencoMail,1,Len(strElencoMail)-1)
    L'istruzione completa quindi diventa
    Private Sub MailingList_Click()
    Dim strElencoMail As String
    Dim rs As DAO.Recordset
    set rs=DbEngine(0)(0).OpenRecordset("SELECT [EMAIL] FROM [E-MAIL] WHERE [Seleziona]=true")
    ' Basta controllare EOF per testare se è VUOTO
    If not rs.EOF Then
       rs.MoveFirst
       Do Until rs.EOF
          strElencoMail = strElencoMail & rs.Fields("EMAIL").Value & ";"
          rs.MoveNext
       Loop
    End If
    ' Rimuovo il [;] finale...
    If Len(strElencoMail)>0 then strElencoMail = Mid$(strElencoMail,1,Len(strElencoMail)-1)
    rs.Close
    set rs=nothing
    MailingList.value= strElencoMail
    End Sub
Devi accedere o registrarti per scrivere nel forum
10 risposte