Newsgroup: it.comp.appl.access
Titolo: Filtri e query SQL su server

Ho notato che aprendo le maschere con filtro, per avendo una origine
dati su database MySQL in realtaè Access scarica tutto il risultato
della query SQL e poi IN LOCALE applica il filtro. C'e' un modo di
forzare, specie nei casi in cui in realta' la select si limiti a una
tabella sola, una vera ricerca con "where="  ???
Forse non sono stato chiaro. Ma non capisco come mai access faccia
cosi' (gli indici allora quando mai li usa ?)

Frank Adim Costa ha scritto:

usa una query come origine maschera con all'interno la condizione where
che ti interessa.
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ciao
Anche in questo modo Access scarica tutto il Recordset e la
Clausola WHERE viene elaborata in locale.
C'è da dire che se la Clausola Where viene applicata ad un
campo Indicizzato per l'ottimizzazione di JET il traffico
di dati in rete si riduce.
Per avere realmente quello che chiedi devi usare una Query PassTrought
ma con i problemi del Recordset in sola lettura.
Se invece di MySQL usassi SQL_SERVER allora sfruttando ADP
potresti legare l'origine dati della Form direttamente a SP residenti
lato Server.
Ciao.
@ALex
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio
news:l70sh05va2kfdl0ks...@4ax.com...

Ciao Frank,
L'applicazione Access non usa indici, nel caso di un'applicazione Access con
dati su  Db di Access gli indici vengono usati dal Motore Jet.
Nel tuo caso Jet di Access non sa di essere collegato a MySql e MySql non sa
di essere interrogato da Access, l'interprete tra i due è il Driver ODBC che
fa da Data Pump verso Jet.
In questi casi è meglio cambiare l'origine record mettendo una clausola
WHERE appropriata, se usi solo istruzioni SQL standard senza sconfinare
nelle funzioni vba ( mid() Format()  o altro che non possa essere
interpretato da MySql) l'istruzione SQL verrà passata integralmente quindi
valutata da MySql che userà gli indici necessari e applicherà la where. In
altro caso l'unico modo è richiedere tutte le righe e applicare le
condizioni in locale.
Ciao Giorgio

lato Server.
Permetti un commento colorito ?
Bella incu##ta !!!

di dati in rete si riduce.
Mi spieghi meglio per cortesia la frase "campo Indicizzato per
l'ottimizzazione di JET ".
Scusa l'ignoranza.

Quindi la "where" che si passa alla openform in realta' non è una
"where" appesa alla stringa SQL ma solo un filtro. PErche' la chiamano
"where" ?
Di conseguenza l'unico modo è modificare la recordsource della
maschera all'apertura della stessa ?
Come faccio a passare piu' di un parametro alla form (OpenArgs) ?
GRAZIE

 ha scritto nel messaggio
news:b1j3i01g7i54ah0vr...@4ax.com...

Ciao Frank,
ti puoi inventare un separatore ad es il carattere | equivalente ad Ascii
124, poi con la funzione Slpit memorizzi automaticamente i parametri in un
vettore.
Visto che devi comporre la stringa SQL nell'evento load ti consiglio di
mettere come origine record predefinita della maschera una query che non
ritorna righe
-----------
SELECT * FROM Clienti WHERE 1=0
-----------
in questo modo interrogherai il server solo quando è necessario.
Ciao Giorgio

 maschera all'apertura della stessa ?
No, la condizione WHERE è una WHERE vera e propria, se rientra in un
linguaggio SQL standard viene trasmessa al server.
Questo è il codice generato dal driver ODBC all'apertura di una maschera con
condizione WHERE che ha come origine record una tabella su Sql Server.
io ho aperto la maschera in questo modo
----------
docmd.OpenForm "Maschera1",acNormal,,"C1=12"
---------
e Sql server ha ricevuto questi comandi
----------------
SELECT "dbo_Tabella"."ID" FROM "dbo"."Tabella" "dbo_Tabella" WHERE ("C1" =
12 )
exec sp_prepexec @P1 output, N'@P1 int', N'SELECT * FROM "dbo"."Tabella"
WHERE "ID" = @P1', 14
----------------
Come vedi la WHERE viene applicata.
Se hai un Profiler per MySql ti aiuterà a capire dove puoi intervenire per
ottimizzare l'applicazione.
Ciao Giorgio

WHERE "ID" = @P1', 14
Ma allora cio' non contraddice quanto abbiamo detto sopra (che access
usa quello che e' dato come where) ?
Perche' se metto la condizione where alla docmd.OpenForm č moooolto
piu' lento su gradi tabelle, anche con indici giusti, che se assegno
la form.recordsource dopo l'apertura ?
 

WHERE "ID" = @P1', 14
Come fai a vedere la query SLQ su lato MySQL ?

 la form.recordsource dopo l'apertura ?
L'unica cosa che mi viene in mente è che il driver ODBC di MySql non è
ottimizzato come quello per Sql Server.
Ciao Giorgio

cosi' (gli indici allora quando mai li usa ?)
------------
volevo solo farti notare che Access non c'entra nulla con questo
comportamento, chi ha progettato il driver ODBC per MySql forse non riteneva
interessante ottimizzare questo aspetto.
Ciao Giorgio

 wrote:

Ti ringrazio.
Tutto sommato mi consigleresti di passare a un server SQL di mamma
microsoft ?


Ti consiglierei vivamente di provarlo, poi la decisione spetta a te. Con Sql
Server avrai la possibiletà di usare Stored Procedure, User Function,
Trigger. (In MySql saranno disponibili dalla versione 5.0), usare le foreifn
Key per l'integrità referenziale (in MySql questa funzione è attiva dalla
versione 3.23.44 e con tabelle di tipo InnoDB, che sono ?), usare le
SubQuery (In MySql sono supportate dalla versione 4.1).
Con Sql server avrai la possibilità di poter chiarire dubbi e problemi in un
NG in lingua italiana *microsoft.public.it.sql*.
Puoi scaricare e distribuire la versione gratuita MSDE 2000 Release A
http://www.microsoft.com/italy/sql/msde/
 nella lingua che vuoi manuali
compresi.
Nella versione MSDE c'è un limite nelle dimensioni per ogni singolo database
che è di 2Gb (altrimenti non vendono più la versione standard) ma nel
prossimo Sql Server Express
http://lab.msdn.microsoft.com/express/sql/default.aspx
 (sempre gratuito)
tale limite è stato innalzato a 4Gb per database
Direi che vale la pena di provarlo
Ciao Giorgio