Ciao,
Volevo lasciare un feedback su cosa ha funzionato nel mio caso, nell'eventualità che possa servire di spunto a qualcun altro.
Ho cercato di far tesoro dei consigli di Alex e Alka ma non sono ancora in grado di effettuare verifiche sulle query da sql server quindi la via verifica è solo di tipo empirico --> soluzione più lenta vs soluzione più veloce.
La maschera di cui lamentavo la lentezza di apertura è una maschera continua e si basava su una query di access a cui passavo un parametro da una form, la query leggeva i dati da una tabella di sql server che collegava in left outer join con delle tabelle di access.
Per aumetare la velocità di apertura della maschera ho
- spezzato la query in due --> la query A legge da SQL server e filtra i dati, la query B legge dalla query A e collega quei dati già filtrati alle tabelle di access
- risolto i parametri in VBA e creato una stringa SQL da utilizzare come origine dati della query A
- inserito un comando, nella routine che si occupa di aprire la maschera, per cambiare l'origine dati della query A prima di aprire la maschera
Public Sub OrigineQry(Query As String, TxtSql As String)
Dim db As Database
Dim q As QueryDef
Dim rq As Recordset
'imposta il db di riferimento
Set db = CurrentDb
'
Set q = db.QueryDefs(Query) 'la query di cui cambiare la stringa sql
q.SQL = TxtSql
Set rq = q.OpenRecordset(dbOpenDynaset, dbSeeChanges) 'apre il recordset
rq.Close 'chiude il recordset
Set q = Nothing 'libera l'oggetto
Set db = Nothing
End Sub
In questo modo la velocità di apertura della maschera è migliorata sia da dentro l'azienda che da fuori sede.
La soluzione che avevo ipotizzato in un precedente post di aprire la maschera vuota e di passare l'origine dati direttamente alla maschera invece da fuori sede risultava lenta.
La maschera risultava lenta anche in fase di gestione. La lentezza era da collegare alle performance delle query di update che vengono lanciate in fase di aggiornamento di un record della maschera.
gli update avevano dei riferimenti a dei parametri contenuti in una maschera e venivano lanciati attraverso l'istruzione currentdb.execute
in questo caso ho combinato gli spunti ricevuti con quelli contenuti in alcuni altri topics del forum.
- ho risolto i parametri in una stringa di testo via VBA
- lanciato gli aggiornamenti dopo aver specificato il DB
Dim db As Database
Dim TxtSql As String
'imposto la connessione al DB sql server via runtime
Set db = DBEngine(0).OpenDatabase("", dbDriverComplete, False, ConnStr)
'esegue lo script SQL sul server
db.Execute TxtSql, dbSQLPassThrough
'chiude la connessione ODBC al server SQl
db.Close
Set db = Nothing
Nel mio caso ConnStr è una costante che contiene i parametri di connessione ODBC.
Purtroppo in questo modo ho dovuto lasciare ID e PW della connessione ODBC nel codice ma non sono riuscito a trovare altro modo di farlo funzionare
Public Const ConnStr As String = "ODBC;DSN=NOME_CONNESSIONE;UID=UTENTE_RW_DB_SQL;PWD=PW_UTENTE_DB"
Grazie degli spunti che mi avete dato
Andrea