venerdì 2 maggio 2008

Problemi con query parametriche

In Access è possibile creare delle query parametriche inserendo il nome del parametro tra parentesi quadrate.
Al momento in cui il query viene lanciato viene richiesto l'inserimento del valore del parametro.
Nel caso di esecuzione di query parametriche da VBA è necessario valorizzare i parametri utilizzando l'oggetto QueryDef e la sua collection Parameters.
In pratica:

Dim QueryDaLanciare as QueryDef
Set QueryDaLanciare = CurrentDB.QueryDefs("NomeQuery")
'--> inserire il nome del parametro senza [ e ].
QueryDaLanciare.Parameters("NomeParametro") = Valore
QueryDaLanciare.Execute

Talvolta ho però riscontrato problemi nel caso che il query sia effettuato su tabelle linkate via ODBC: il passaggio dei parametri non è effettuato correttamente ed il driver ODBC ritorna un errore che non sempre è

Per ovviare al problema si può modificare il testo del query sostituendo manualmente al parametro il valore.

Il codice è il seguente:

Dim OldSQL as String 'mantiene il valore dell'SQL originale
Dim QueryDaLanciare as QueryDef
Set QueryDaLanciare = CurrentDB.QueryDefs("NomeQuery")

'Salvo il valore dell'SQL corrente
OldSQL = QueryDaLanciare.SQL
'Rimpiazzo il SQL del query con un SQL modificato sostituendo al parametro
'il valore
QueryDaLanciare.SQL = Replace(QueryDaLanciare.SQL,"[NomeParametro]",Valore)
QueryDaLanciare.Parameters("NomeParametro") = Valore
QueryDaLanciare.Execute

'Reimposto il valore dell'SQL per successivi usi
QueryDaLanciare.SQL = OldSQL

In queso modo si evita di cablare il codice SQL nel codice VBA, lasciando la possibilità di modificare il Query con il designer.