Concatenare più dati da una query

lunedì 23 aprile 2007 - 15.34

mponte Profilo | Newbie

Ciao a tutti,
sono alle prime armi con access ed ho bisogno del vs aiuto.
Il risultato della query "querymascheraMTV" è il seguente:

numson email
107 tizio@mycompany.com
107 caio@mycompany.com
107 sempronio@mycompany.com
etc...

Ho bisogno di concatenare gli indirizzi email in un unico campo di una maschera in modo da ottenere (incluso ";"):
tizio@mycompany.com; caio@mycompany.com; sempronio@mycompany.com

Come faccio? Mi date una mano?
Grazie mille,
ciao

Massimo

lbenaglia Profilo | Guru


>numson email
>107 tizio@mycompany.com
>107 caio@mycompany.com
>107 sempronio@mycompany.com
>etc...
>
>Ho bisogno di concatenare gli indirizzi email in un unico campo
>di una maschera in modo da ottenere (incluso ";"):
>tizio@mycompany.com; caio@mycompany.com; sempronio@mycompany.com
>
>Come faccio? Mi date una mano?

Ciao Massimo,

prova a leggere questo thread:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=6630

>Grazie mille,
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mponte Profilo | Newbie

Ciao Lorenzo,
scusa ma sono proprio alle prime armi ...

cosa intendi per:
Infine richiamerò la funzione dalla seguente query:
SELECT StudenteID, MAX(Concatena(StudenteID, Nome, ', ')) AS Nomi
FROM Studenti
GROUP BY StudenteID;

devo creare una query che prende i dati StudenteID della tabella Studenti ...
ma non capisco come usare .. MAX(Concatena(StudenteID, Nome, ', ')) AS Nomi

ciao

Massimo

mponte Profilo | Newbie

come non detto, funziona alla grande!
Grazie Lorenzo

ciao

Massimo

lbenaglia Profilo | Guru

>scusa ma sono proprio alle prime armi ...

Ciao Massimo,

Devi definire la funzione VBA Concatena in un modulo, poi definire un oggetto Query con quella SELECT.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mponte Profilo | Newbie

Un'ultima info:
ogni volta che lancio la query viene memorizzato il risultato precedente e solo chiudendo e riaprendo ottengo l'azzeramento.
Come faccio ad evitare che vengano concatenati tutti i risultati ogni volta che viene lanciata la query?

Grazie e ciao

Massimo

lbenaglia Profilo | Guru

>ogni volta che lancio la query viene memorizzato il risultato
>precedente e solo chiudendo e riaprendo ottengo l'azzeramento.
>Come faccio ad evitare che vengano concatenati tutti i risultati
>ogni volta che viene lanciata la query?

Ciao Massimo,

a me non succede
Andando a rivedere il codice, come prima cosa eseguo la seguente If:

' Verifico se si tratta di un nuovo studente If s_intStudenteID <> StudenteID Then ' Memorizzo lo studente s_intStudenteID = StudenteID ' Inizializzo la variabile di output con il nome dello studente s_strOutput = Nome Else ' Concateno il nome s_strOutput = s_strOutput & Separatore & Nome End If

Alla nuova esecuzione, la variabile statica s_intStudenteID sarà valorizzata con l'ultimo StudenteID.
Il confronto s_intStudenteID <> StudenteID sarà vero dato che StudenteID è valorizzato con il primo studente della tabella (ovviamente se non hai specificato una ORDER BY StudenteID).
Di conseguenza la variabile statica s_strOutput verrà ripulita, valorizzandola con il nome dello studente corrente.

Non capisco come possa concatenarti i valori...

>Grazie e ciao
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mponte Profilo | Newbie

Ciao Lorenzo,
ho capito dov'è l'inghippo ...
la query su cui lavoro io filtra lo StudenteID in modo da averne uno solo, quindi una cosa simile a questa :
StudenteID Nome
------------ ------------
1 Claudio
1 Chiara

Se provi la funzione sulla tua tabella assegnando a tutti i record lo stesso StudenteID noterai che la prima volta che esegui la query l'output è corretto, ma dalla seconda volta in poi vengono concatenati i risultati precedenti.
es:
StudenteID Nomi
------------ -----------------
1 Claudio, Chiara, Claudio, Chiara

Grazie ancora,
ciao

lbenaglia Profilo | Guru

>ho capito dov'è l'inghippo ...
>la query su cui lavoro io filtra lo StudenteID in modo da averne
>uno solo, quindi una cosa simile a questa :
>StudenteID Nome
>------------ ------------
>1 Claudio
>1 Chiara

mponte Profilo | Newbie

Lorenzo,
manca un pezzo alla tua risposta o sono tanto scarso da non capire??

Ciao

Massimo

lbenaglia Profilo | Guru

>manca un pezzo alla tua risposta o sono tanto scarso da non capire??
>

No, mi è scappata quella risposta
Il problema è dovuto al fatto che nell'esempio che ti ho proposto, il trucchetto si basa sulla variabile statica s_StudenteID che mantiene il valore ad ogni chiamata della funzione.
Nel caso in cui tutti i valori di StudenteID sono uguali, le chiamate successive alla prima non soddisferanno mai la condizione

If s_intStudenteID <> StudenteID Then

pertanto la variabile statica s_strOutput non verrà mai più inizializzata.

Ho provato ad affrontare il problema da un altro punto di vista con l'aiuto di Giorgio Rancati (Access MVP) e abbiamo pensato ad una soluzione alternativa:

Option Compare Database Public Function Concatena(ByVal StudenteID As Integer, _ ByVal Separatore As String) As String Dim rs As DAO.Recordset Dim strQuery As String Dim strOutput As String ' Apro un Recordset con l'elenco degli studenti relativi all'ID passato ' come argomento alla funzione strQuery = "SELECT Nome FROM Studenti WHERE StudenteID = " & StudenteID Set rs = CurrentDb.OpenRecordset(strQuery, dbOpenForwardOnly, dbReadOnly) ' Ciclo il Recordset With rs Do Until .EOF ' Concateno i nomi strOutput = strOutput & .Fields("Nome").Value & Separatore ' Mi sposto sulla riga successiva .MoveNext Loop ' Chiudo il Recordset .Close End With ' Distruggo l'oggetto Recordset Set rs = Nothing ' Elimino l'ultimo separatore accodato If Len(strOutput) > 0 Then strOutput = Left$(strOutput, Len(strOutput) - Len(Separatore)) End If ' Valorizzo la funzione Concatena = strOutput End Function

Possiamo richiamare la funzione Concatena nel seguente modo:

SELECT StudenteID, Concatena(StudenteID, ', ') AS Nomi FROM Studenti GROUP BY StudenteID;

Come vedi la query non fa altro che raggruppare tutte le righe della tabella per StudenteID.
La funzione Concatena esegue al suo interno una seconda query che recupera tutti i nomi relativi all'ID passato come argomento, cicla le righe concatenando i nomi e poi valorizza la funzione.

In questo modo ogni chiamata è completamente indipendente rispetto alla precedente, ovviando al problema riscontrato nella prima soluzione

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mponte Profilo | Newbie

Giorgio, Lorenzo ... Grazie!
il nuovo codice è perfetto per la mia esigenza.

Grazie ancora,

ciao

Massimo

ps: buon 25 aprile a tutti

rat86 Profilo | Newbie

Ciao avevo un probelma simile, ho provato il tuo codice ma quando eseguo la quer, dopo aver creato il modulo mi da il seguente errore:
Funzione 'Concatena' non definita nell'espressione.

Sapete dirmi come mai?

lbenaglia Profilo | Guru

>Ciao avevo un probelma simile, ho provato il tuo codice ma quando
>eseguo la quer, dopo aver creato il modulo mi da il seguente
>errore:
>Funzione 'Concatena' non definita nell'espressione.
>
>Sapete dirmi come mai?
No
Allega l'.mdb ad un nuovo post e cercheremo di capire cosa c'è che non va.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

freemind7719 Profilo | Newbie

Salve, sono nuovo del sito a sto muovendo i primi passi nel mondo del db.
Utilizzo Access come DBMS e ho trovato particolarmente utile la funzione di concatenazione che funziona perfettamente nel mio db. Avrei però bisogno di un ulteriore raggruppamento, mi spiego:

Ho questa situazione:

Tipo ID Struttura_Operativa
Com_Ord 1 PE00R1
Com_Ord 1 PE00R2
Com_Ord 1 PE00R3
Com_Ord 10 PE00R1
Com_Ord 10 PE00R2
Com_Ord 10 PE00R3
Spec_Amb 1 PEC09A
Spec_Amb 1 PEC09A1
Spec_Amb 1 PEC09A2
Spec_Amb 10 PEC10A

Vorrei che prima di concatenare i campi di "struttura_operativa" rispetto ad "ID" la funzione raggruppasse rispetto al campo "Tipo" con il seguente risultato:

Com_Ord 1 PE00R1; PE00R2; PE00R3
Com_Ord 10 PE00R1; PE00R2; PE00R3
Spec_Amb 1 PEC09A; PEC09A1; PEC09A2
Spec_Amb 10 PEC10A

Anticipatamente Grazie

freemind7719 Profilo | Newbie

Scusa, ho forse formulato male la domanda??

etambasco Profilo | Newbie

scusate sono nuovo
ho lo steso problema ed ho usato la vostra soluzione, ma la query da un errore:

Funzione 'Concatena' non definita nell'espressione

cosa posso fare

lbenaglia Profilo | Guru

>Funzione 'Concatena' non definita nell'espressione
>
>cosa posso fare
L'hai definita in un modulo come scritto sopra?

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/

etambasco Profilo | Newbie

Si la vedo presente in eleco dei moduli definiti col nome "Concatena"
ed anche la vado nel generatore di espressione di Access la trovo disponibile...

ho fatto una prova vi aggiungo le immagini

672x714 76Kb

601x276 27Kb

etambasco Profilo | Newbie

ho fatto mille prove ma il risultao non cambia, aiutoooooo! avete visto le immagini che vi ho allegato nella risposta precedente????
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5