Discussione:
errore da openquery a execute
(troppo vecchio per rispondere)
Michele
2023-12-05 10:40:56 UTC
Permalink
Buongiorno a tutti,
come ho detto un po' di tempo fa ho alcune query molto lente.
Ho provato a riscriverle in modalità pass-through, però alcune volte mi hanno dato errore ed essendo importante che queste query non generino errori, ho lasciato tutto così.
Adesso ci sto riprovando quindi vi descrivo la situazione attuale.
Ho una select query1s che ha come parametro forms!form1!comm che coinvolge sia tabelle collegate tramite odbc che una tabella locale.
io eseguo la query1i che è del tipo
insert into tblLocale ( ) ... select .... from query1s

al momento quindi il codice è
forms!form1!comm = mycomm
docmd.openquery "query1i"

e questo è diventato
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
set dbs = currentdb
Set qdf = dbs.QueryDefs("query1i")
qdf.Parameters("[ncomm]") = mycomm
qdf.Execute dbFailOnError

e questo funziona!

adesso ho una seconda query query2s che utilizza la prima query, query1s, collegata ad altre tabelle (tutte collegate tramite odbc) e io eseguo la query query2i che prende i valori di query2s e li mette nella stessa tabella locale di query1s.

la query2i mi dà errore 3146 "ODBC - Connessione al server fallita"
se invece di Execute provo a lanciare
set rst = qdf.OpenRecordset("query2s")
ottengo un errore 3001 "Argomento non valido"
Ovviamente invece con RunSql oppure OpenQuery le stesse query non danno problemi inserendo come "parametro" forms!form1!comm.
Cosa posso fare per capirci qualcosa in più secondo voi?
Karl Donaubauer
2023-12-05 11:03:38 UTC
Permalink
Salve,
Post by Michele
come ho detto un po' di tempo fa ho alcune query molto lente.
Ho provato a riscriverle in modalità pass-through, però alcune volte mi hanno dato errore ed essendo importante che queste query non generino errori, ho lasciato tutto così.
Adesso ci sto riprovando quindi vi descrivo la situazione attuale.
Ho una select query1s che ha come parametro forms!form1!comm che coinvolge sia tabelle collegate tramite odbc che una tabella locale.
io eseguo la query1i che è del tipo
insert into tblLocale ( ) ... select .... from query1s
al momento quindi il codice è
forms!form1!comm = mycomm
docmd.openquery "query1i"
e questo è diventato
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
set dbs = currentdb
Set qdf = dbs.QueryDefs("query1i")
qdf.Parameters("[ncomm]") = mycomm
qdf.Execute dbFailOnError
e questo funziona!
adesso ho una seconda query query2s che utilizza la prima query, query1s, collegata ad altre tabelle (tutte collegate tramite odbc) e io eseguo la query query2i che prende i valori di query2s e li mette nella stessa tabella locale di query1s.
la query2i mi dà errore 3146 "ODBC - Connessione al server fallita"
se invece di Execute provo a lanciare
set rst = qdf.OpenRecordset("query2s")
ottengo un errore 3001 "Argomento non valido"
Ovviamente invece con RunSql oppure OpenQuery le stesse query non danno problemi inserendo come "parametro" forms!form1!comm.
Cosa posso fare per capirci qualcosa in più secondo voi?
Non sono sicuro di aver capito tutto, ma penso che invece di passare i
parametri e per evitare l'errore con DAO sia più semplice usare Eval()
come descritto qui: https://www.donkarl.com/it?FAQ6.4
--
Ciao
Karl
*********
Access Info: https://AccessForever.org
Access News:

Access DevCon: https://www.donkarl.com/devcon
Access FAQ: https://www.donkarl.com/it
Michele
2023-12-05 11:29:34 UTC
Permalink
Post by Karl Donaubauer
Salve,
Post by Michele
come ho detto un po' di tempo fa ho alcune query molto lente.
Ho provato a riscriverle in modalità pass-through, però alcune volte mi hanno dato errore ed essendo importante che queste query non generino errori, ho lasciato tutto così.
Adesso ci sto riprovando quindi vi descrivo la situazione attuale.
Ho una select query1s che ha come parametro forms!form1!comm che coinvolge sia tabelle collegate tramite odbc che una tabella locale.
io eseguo la query1i che è del tipo
insert into tblLocale ( ) ... select .... from query1s
al momento quindi il codice è
forms!form1!comm = mycomm
docmd.openquery "query1i"
e questo è diventato
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
set dbs = currentdb
Set qdf = dbs.QueryDefs("query1i")
qdf.Parameters("[ncomm]") = mycomm
qdf.Execute dbFailOnError
e questo funziona!
adesso ho una seconda query query2s che utilizza la prima query, query1s, collegata ad altre tabelle (tutte collegate tramite odbc) e io eseguo la query query2i che prende i valori di query2s e li mette nella stessa tabella locale di query1s.
la query2i mi dà errore 3146 "ODBC - Connessione al server fallita"
se invece di Execute provo a lanciare
set rst = qdf.OpenRecordset("query2s")
ottengo un errore 3001 "Argomento non valido"
Ovviamente invece con RunSql oppure OpenQuery le stesse query non danno problemi inserendo come "parametro" forms!form1!comm.
Cosa posso fare per capirci qualcosa in più secondo voi?
Non sono sicuro di aver capito tutto, ma penso che invece di passare i
parametri e per evitare l'errore con DAO sia più semplice usare Eval()
come descritto qui: https://www.donkarl.com/it?FAQ6.4
--
Ciao
Karl
*********
Access Info: https://AccessForever.org
Access News: http://youtu.be/cs_mZvaKYeY
Access DevCon: https://www.donkarl.com/devcon
Access FAQ: https://www.donkarl.com/it
Ciao Karl,
grazie per la risposta.
Eval lo uso e lo conosco proprio grazie alla tua faq.
ma pensavo di rendere il programma più efficiente in questo modo...
ultimamente si è detto che il metodo Execute è più performante.
una possibilità (se non ho capito male) è passare la tabella locale su sql server e usare ADO. Giusto?
oppure potrei farlo già così?
Michele
2023-12-07 09:21:03 UTC
Permalink
Post by Michele
Post by Karl Donaubauer
Salve,
Post by Michele
come ho detto un po' di tempo fa ho alcune query molto lente.
Ho provato a riscriverle in modalità pass-through, però alcune volte mi hanno dato errore ed essendo importante che queste query non generino errori, ho lasciato tutto così.
Adesso ci sto riprovando quindi vi descrivo la situazione attuale.
Ho una select query1s che ha come parametro forms!form1!comm che coinvolge sia tabelle collegate tramite odbc che una tabella locale.
io eseguo la query1i che è del tipo
insert into tblLocale ( ) ... select .... from query1s
al momento quindi il codice è
forms!form1!comm = mycomm
docmd.openquery "query1i"
e questo è diventato
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
set dbs = currentdb
Set qdf = dbs.QueryDefs("query1i")
qdf.Parameters("[ncomm]") = mycomm
qdf.Execute dbFailOnError
e questo funziona!
adesso ho una seconda query query2s che utilizza la prima query, query1s, collegata ad altre tabelle (tutte collegate tramite odbc) e io eseguo la query query2i che prende i valori di query2s e li mette nella stessa tabella locale di query1s.
la query2i mi dà errore 3146 "ODBC - Connessione al server fallita"
se invece di Execute provo a lanciare
set rst = qdf.OpenRecordset("query2s")
ottengo un errore 3001 "Argomento non valido"
Ovviamente invece con RunSql oppure OpenQuery le stesse query non danno problemi inserendo come "parametro" forms!form1!comm.
Cosa posso fare per capirci qualcosa in più secondo voi?
Non sono sicuro di aver capito tutto, ma penso che invece di passare i
parametri e per evitare l'errore con DAO sia più semplice usare Eval()
come descritto qui: https://www.donkarl.com/it?FAQ6.4
--
Ciao
Karl
*********
Access Info: https://AccessForever.org
Access News: http://youtu.be/cs_mZvaKYeY
Access DevCon: https://www.donkarl.com/devcon
Access FAQ: https://www.donkarl.com/it
Ciao Karl,
grazie per la risposta.
Eval lo uso e lo conosco proprio grazie alla tua faq.
ma pensavo di rendere il programma più efficiente in questo modo...
ultimamente si è detto che il metodo Execute è più performante.
una possibilità (se non ho capito male) è passare la tabella locale su sql server e usare ADO. Giusto?
oppure potrei farlo già così?
ho capito che mi sfugge qualcosa, ma non sto capendo cosa...

Continua a leggere su narkive:
Loading...