Newsgroup: it.comp.appl.access
Titolo: Concatenazione record in un record solo

Buon giorno
vi ricordate la problematica, risolta, in questo post di seguito riportato?
 
https://groups.google.com/d/msg/it.comp.appl.access/BWORQDr_1Ag/wC9siXwUEQAJ
 
 
 
=========================================
RIPORTO IL PROBLEMA IN SINTESI
=========================================
Ho il seguente problema: 
Utilizzo ACCESS 2003 
Concatenare una colonna di record in un unico record spaziandolo tra di loro con un simbolo/segno, mi spiego meglio. 
 
NOME     VERSIONE      CILINDRATA     TARGA 
500         L            1200         ABCD 
500         L            1200         ABCA 
500         L            1200         ABCE 
500         L            1300         ABCD 
500         L            1300         ABCA 
500         L            1300         ABBB 
 
 
il risultato che vorrei è 
 
NOME     VERSIONE      CILINDRATA           QUANTITA       TARGHE 
500        L            1200            3        ABCD,ABCA,ABCE 
500        L            1300            3        ABCD,ABCA,ABBB 
 
Come posso fare, significando che non sono molto ferrato con il VBA e vorrei riportare il tutto su un report. grazie 
=========================================
La risposta che mi ha risolto il problema è stata questa
=========================================
Public Function strTarghe(Cilindrata) As String 
    Dim rs As DAO.Recordset 
    Dim db As DAO.Database 
    strTarghe = "" 
    Set db = CurrentDb 
    Set rs = db.OpenRecordset("miaTabella", dbOpenDynaset, dbFailOnError + dbSeeChanges) 
    Do Until rs.EOF 
        If rs!Cilindrata = Cilindrata Then 
            strTarghe = strTarghe & rs!targa & ", " 
        End If 
        rs.MoveNext 
    Loop 
    If Len(strTarghe) > 0 Then 
        strTarghe = Left(strTarghe, Len(strTarghe) - 2) 
    End If 
    Set rs = Nothing 
End Function 
 
E poi la richiami in una query: 
 
SELECT First(miaTabella.Nome) AS PrimoDiNome, First(miaTabella.Versione) AS PrimoDiVersione, miaTabella.Cilindrata, Count(miaTabella.Cilindrata) AS Quantita, strTarghe([Cilindrata]) AS Targhe 
FROM miaTabella 
GROUP BY miaTabella.Cilindrata; 
=========================================
=========================================
 
 
Ebbene, seppur funzioni bene, in questo momento sto utilizzando MAccess 2010, al momento della domanda utilizzavo la versione 2013, la risposta alla query è lentissima, esiste un altro sistema per fare ciò? 
Aggiungo inoltre che il campo TARGA, purtroppo, ultimamente si è ingrandito di molto, se può aiutare la risultanza mi serve da mettere in un report. 
 
Grazie

 Buon giorno
[Cut]

Ciao,
credo che il problema della lentezza sia dato dalla combinazione dell'uso nella query di una funzione che impiega tempo per essere eseguita e dal fatto che sia eseguita diverse volte perché è compresa nel raggruppamento su cui è basata la query.
In questo modo la funzione di concatenamento viene eseguita tante volte quanti sono i records da raggruppare portando al tempo di attesa che hai visto.
 
Arrivando al sodo, per ridurre i tempi di esecuzione proverei per prima cosa a dividere in due la query attuale:
una prima query (Q1) che esegue il raggruppamento e il conteggio delle targhe
una seconda query basata su Q1 che esegue la concatenazione dei campi targa:
 
Q1) SELECT First(miaTabella.Nome) AS PrimoDiNome, First(miaTabella.Versione) AS PrimoDiVersione, miaTabella.Cilindrata, Count(miaTabella.Cilindrata) AS Quantita
FROM miaTabella 
GROUP BY miaTabella.Cilindrata; 
 
Q2) SELECT Q1.PrimoDiNome, Q1.PrimoDiVersione, Q1.Cilindrata, Q1.Quantita, strTarghe(Q1.Cilindrata) AS Targhe 
FROM Q1 
 
In questo modo la funzione viene eseguita una singola volta per ogni gruppo.
 
Riguardo la funzione io la modificherei in due punti:
l'apertura di un recordset di tipo ForwardOnly (da un po' di sprint visto che i record sono solo da leggere) ma in particolare applicherei un filtro sulla cilindrata direttamente nell'sql anziché scorrere tutti i record e verificare uno per uno se appartiene alla cilindrata richiesta
 
Set rs = db.OpenRecordset("SELECT Targa FROM miaTabella WHERE Cilindrata=" & Cilindrata, dbOpenForwardOnly, dbFailOnError + dbSeeChanges)
Do Until rs.EOF
    strTarghe = strTarghe & rs!targa & ", "
 
    rs.MoveNext
Loop
 
Se il campo Cilindrata è di tipo testo devi aggiungere gli apici nella clausola del filtro: ... WHERE Cilindrata='" & Cilindrata & "'" ...
 
Per il fatto che il campo Targa si sta allungando la prima cosa che mi viene in mente è che potresti aggiungere una condizione all'interno della funzione che inserisca una coppia di caratteri di ritorno a capo ogni x targhe aggiunte al risultato in modo che nel tuo report tu possa controllare un po' meglio la larghezza del testo che viene visualizzato nel controllo (ovviamente la dimensione aumenterà in altezza).
 
Ciao
Mat.


Nello scusarmi per il ritardo
Grazie è perfetta
di nuovo scusami

 di nuovo scusami
 
Prego :-)
ciao
Mat.