Newsgroup: it.comp.appl.access
Titolo: Access e Stored Procedure

Sono impazzito su un problema, poi ho risolto con VBA. Vorrei sapere se c'è 
qualcuno che ha la pazienza di scrivere una stored procedure, almeno capisco 
come si fa.
Allora: ho una tabella di anagrafica ed una di qualifiche; in mezzo c'è una 
tabella molti a molti. Il risultato finale deve essere un recordset
ID, Cognome,Nome, Qualifiche
dove qualifiche sono le qualifiche concatenate, ossia, se uno è panettiere 
ed amante e si chiama Gioacchino Rossi, voglio:
1, Rossi, Gioacchino, Amante - Panettiere
In una sola select non dovrebbe essere possibile farlo. Ho tentato di fare 
una stored procedure che, con un cursore si scorre la tabella anagrafica e 
per ogni ID si costruisce la stringa "qualifiche", ma mi sono arreso :-)
Per chiarire ulteriormente le cose, allego il codice VBA
------------- Inizio codice -----------------
    Dim rstO As New ADODB.Recordset
    Dim rstD As New ADODB.Recordset
    Dim lngIDAna As Long
    Dim varCognome As Variant
    Dim varNome As Variant
    Dim strQualifiche As String
    Dim blnAggiungeRecord As Boolean
    CurrentProject.Connection.Execute "DELETE FROM 
tblElencoConfratelliConQualifiche"
    rstO.Open "procElencoConfratelliConQualifiche", 
CurrentProject.Connection, adOpenStatic, adLockOptimistic
    rstD.Open "SELECT * FROM tblElencoConfratelliConQualifiche", 
CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    Do While Not rstO.EOF
        ' Quando cambia IDAna, inizia un nuovo record
        If lngIDAna <> rstO!IDAna Then
            lngIDAna = rstO!IDAna
            varCognome = rstO!Cognome
            varNome = rstO!Nome
            strQualifiche = ""
        End If
        strQualifiche = strQualifiche & rstO!Qualifiche & ", "
        rstO.MoveNext
        If rstO.EOF Then
            blnAggiungeRecord = True
        Else
            If lngIDAna <> rstO!IDAna Then blnAggiungeRecord = True
        End If
        ' Aggiunge il record
        If blnAggiungeRecord Then
            blnAggiungeRecord = False
            If Len(strQualifiche) > 1 Then strQualifiche = 
Left(strQualifiche, Len(strQualifiche) - 2)
            With rstD
                .AddNew
                !IDAna = lngIDAna
                !Cognome = varCognome
                !Nome = varNome
                !Qualifiche = strQualifiche
                .Update
            End With
        End If
    Loop
    rstO.Close
    rstD.Close
    Set rstO = Nothing
    Set rstD = Nothing
------------- Fine codice -----------------
-- 
Jonathan Canova
infoCHIOCCIOLAaladinoinformatica.com
www.aladinoinformatica.com
 

 1, Rossi, Gioacchino, Amante - Panettiere
Il bello della function č che la puoi utilizzare direttamente in una select 
dopo.
ovvero select idanagrafica, cognome, dbo.fnz_Estrai (idanagrafica) as 
qualifica from tblanagrafica
eccoti la function come dovrebbe piů o meno risultare, tieni conto che i 
cursori sono lentini, per cui valuta bene le prestazioni.
CREATE function dbo.fnz_Estrai (@lngIDAna int)
returns varchar(255)
as
begin
declare @qualifica varchar(50)
declare @risultato varchar(255)
declare curFigli cursor for select Qualifiche from 
dbo.tblElencoConfratelliConQualifiche
 where (IDAna = @lngIDAna)
open curFigli
set @risultato = ''
fetch next from curFigli into @qualifica
while @@fetch_status=0
 begin
  set @risultato = @risultato + ',' + @qualifica
  fetch next from curFigli into @qualifica
 end
close curfigli
deallocate curfigli
return @risultato
end
Ciao,
Massimo 

 dove qualifiche sono le qualifiche concatenate, ossia, se uno č panettiere

Ciao Jonathan,
se ti scarichi il mio db SQL di esempio del CISA troverai un esempio, se non
ricordo male c'č una function GetAutori che restituisce per l'appunto tutti
gli autori di un determinato libro.
Cinzia

 function (che ti posto sotto più o meno adattata, sistemala un attimino)
Finito! Ringrazio tantissimo te e Cinzia. A parte aggiustare le query 
(ovviamente!), l'unica cosa che ho aggiunto è il pezzo sotto, che toglie 
l'ultima virgola.
IF Len(@risultato) > 1
  BEGIN
     SELECT @risultato=Left(@Risultato, Len(@risultato)-1)
  END
