>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