Se vi è mai capitato di dover generare un elenco delimitato di valori di campi/query insieme ad altre informazioni dal vostro database, saprete che può essere un'impresa ardua, se non impossibile. Ad esempio, se vi viene chiesto di creare un report che elenchi i 5 migliori venditori, in ordine decrescente, per ogni mese dell'anno, o i 3 negozi più vicini a ciascun cliente, potreste trovarvi a dover gestire query a doppia entrata o a combinare manualmente i risultati al di fuori di Access. Ma con l'aiuto di un po' di codice VBA, potrete ottenere risultati come il seguente in pochi minuti...
| Gen | John, Sally, Bill |
| Febbraio | Sally, Adamo, John |
| Mar | Adam, Sally, Bill |
Ci sono molte volte in cui sarebbe utile poter visualizzare un elenco delimitato di risultati come parte di una query più ampia: un elenco dei primi 3 maggiori clienti per ogni rappresentante di vendita, i 5 negozi più vicini a ciascuno dei tuoi clienti che spendono di più , l'elenco potrebbe continuare.
Smetti di ricucire il tuo rapporto
Sebbene sia più che possibile ottenere i dettagli per creare quel tipo di rapporto, di solito si finisce per dover unire manualmente i risultati al di fuori di Access come parte di un foglio di calcolo o di un rapporto.
Il codice seguente elimina la necessità di giocherellare con i risultati della query al di fuori di Access e, invece, ti consentirà di produrre facilmente il tipo di risultati sopra indicato.
Per prima cosa, descriviamo cosa vogliamo che il codice sia in grado di fare:
"Data una query, restituisce un numero x di risultati, combinati in un'unica stringa delimitata da y"
Prima di iniziare
Prima di esaminare il codice, è importante notare che sebbene sia possibile creare una funzione VBA più generica e in grado di gestire qualsiasi combinazione di query, ciò comporterebbe un codice piuttosto lungo, quindi cosa faremo in questo articolo è definire un caso di esempio e scrivere la funzione per gestire quel caso. In questo modo sarà molto più facile per te essere in grado di ricreare il codice per soddisfare le tue esigenze specifiche.
Il caso campione
Abbiamo un database delle vendite che memorizza i dettagli degli acquisti dei clienti, insieme alla categoria di prodotto a cui appartiene l'acquisto. Vogliamo produrre un report che mostri, per mese, le prime 3 categorie in ordine decrescente.
Per semplicità terremo l'esempio su una singola tabella, anche se il principal funzionerà indipendentemente dalla tua configurazione. La tabella che useremo è impostata come segue:
| Sales |
| Nome del cliente |
| Data transazione |
| Valore transazione |
| Categoria |
Ovviamente questa è una configurazione eccessivamente semplificata, ma hai avuto l'idea.
Ora - il codice
Public Function CategoryList(Month As String, NumResults As Integer, SortAscending As Boolean, Delimiter As String) As String
Dim sSql, resultString As String
Dim rst As Recordset
Dim firstLine As Boolean
'Create our SQL string using the supplied parameters
sSql = "SELECT TOP " & NumResults & " [category] FROM sales GROUP BY Format([TransactionDate],""mmm""), sales.Category HAVING (((Format([TransactionDate], ""mmm"")) = """ & Month & """))"
If SortAscending Then sSql = sSql & " ORDER BY Sum(sales.TransactionValue) DESC;"
Set rst = CurrentDb.OpenRecordset(sSql)
firstLine = True
'Loop through the results, and create the string to return
With rst
Do While Not .EOF
If Not firstLine Then
resultString = resultString & Delimiter & .Fields("category")
Else
resultString = resultString & .Fields("category")
firstLine = False
End If
.MoveNext
Loop
End With
Set rs = Nothing
CategoryList = resultString
End Function
Il codice – spiegato

Noterai che controlliamo se aggiungere o meno un delimitatore alla stringa o meno - senza questo controllo ti ritroveresti con una stringa di risultato formattata male o dovresti aggiungere codice per rimuovere delimitatori indesiderati - in questo modo mantiene le cose belle e ordinate fin dall'inizio.
La funzione stessa può ovviamente essere richiamata da una query, un report o ovunque tu voglia da Access.
Correggi il database di Access danneggiato
Se incontri database di Access corrotti quando esegui il codice sopra, allora è meglio usare uno strumento specializzato per ripararli e recuperare tutte le tabelle dai database corrotti.
Introduzione dell'autore:
Mitchell Pond è un esperto di recupero dati in DataNumen, Inc., che è il leader mondiale nelle tecnologie di recupero dati, tra cui riparare il problema SQL ed eccellere prodotti software di recupero. Per maggiori informazioni visita www.datanumen.com