Le query sono utilizzate per estrarre informazioni da una o più tabelle di un database, possono essere utilizzate per interrogare il database per determinare il numero di record presenti in una tabella, il valore di una specifica colonna in un determinato record o per estrarre tutti i record che soddisfano una particolare condizione.
Le query possono anche essere utilizzate per creare nuove tabelle a partire da informazioni estratte da altre tabelle, ad esempio combinando i valori di più colonne in un unico record.
In questo articolo vedremo come creare tabelle e query in modo dinamico utilizzando il codice vba.
Descriviamo lo scenario in cui potrebbe essere utile ricorrere a questa tecnica.
Supponiamo di avere un database con una tabella per ogni centro di costo per registrare tutti i movimenti del centro di costo ed una query corrispondente per estrarre i dati da ogni centro di costo.
Ogni tabella dovrà essere chiamata con il nome o il codice del centro di costo e così la query corrispondente.
Quando aggiungiamo un nuovo centro di costo dovremo creare la tabella e la query corrispondente, operazione che possiamo automatizzare chiedendo in input con una maschera il nome del nuovo centro di costo.
Supponiamo che il nome del nuovo centro di costo inserito nella maschera di input venga memorizzato nella variabile NuovoCC.
Ora dobbiamo eleggere una tabella di un centro di costo qualsiasi già esistente nel database come modello di riferimento. Ipotizziamo che il nome di questa tabella corrisponda al codice XYZ.
Vediamo gli oggetti di cui abbiamo bisogno. Avremo bisogno del database object QueryDef, un oggetto che rappresenta una query SQL. Può essere usato per eseguire query, per modificarle o per estrarne i risultati.
Dim QD As DAO.QueryDef |
Avremo bisogno di una funzione che restituisca la definizione testuale della query, chiamiamola Get_QuerySQL.
Function Get_QuerySQL(MyQueryName As String) As String Dim QD As DAO.QueryDefSet QD = CurrentDb.QueryDefs(MyQueryName) Get_QuerySQL = QD.SQL End Function |
Ecco quindi il codice da eseguire dopo la conferma dell’ inserimento del nuovo centro di costo.
If MsgBox(“Nessun oggetto. Creare tabella e query per ” & NuovoCC & ” ?”, vbYesNo Or vbQuestion Or vbDefaultButton2, “Confermi?”) = vbYes Then DoCmd.SetWarnings False DoCmd.CopyObject , NuovoCC, acTable, XYZ DoCmd.RunSQL “DELETE * FROM [” & NuovoCC & “];” DoCmd.CopyObject , NuovoCC & ” ” & “QueryCC”, acQuery, “XYZ QueryCC” Set QD = CurrentDb.QueryDefs(NuovoCC & ” ” & “QueryCC”) nuovaquery = Replace(Get_QuerySQL(“XYZ QueryCC”), “XYZ”, NuovoCC, 1) QD.SQL = nuovaquery |
Se in input è stato inserito come nuovo centro di costo il codice ABC, il risultato finale sarà la nuova tabella ‘ABC’ vuota e con la struttura delle altre tabelle dei centri di costo e la nuova query ‘ABC QueryCC’ operante sulla tabella ‘ABC’