Newsgroup: it.comp.lang.visual-basic
Titolo: ADO.recordset.filter

Ciao a tutti !!!
Come posso fare a applicare ad un recorset un filtro che ha cone stringa di
where la seguente :
( codice >= 20020415 AND codice <= 20020725) AND (ID = 604 OR ID = 609 OR ID
= 648 OR ID = 649) AND (Contenitore = 'n°04' OR Contenitore = 'n°14')
Grazie
Ciao

 ha scritto nel messaggio
news:YRS%8.867$lu5....@twister1.libero.it...

Intanto le prime due parentesi sono superflue (anche se credo tu le abbia
messe per leggibilità), poi devi considerare le limitazioni sintattiche
booleane di ADO nel Filter:
Da MSDN: you cannot group clauses joined by an OR and then join the group to
another clause with an AND, like this: (LastName = 'Smith' OR LastName =
'Jones') AND FirstName = 'John'
Quindi devi riscrivere la proposizione in questo modo:
(codice >= 20020415 AND codice <= 20020725 AND ID = 604 AND Contenitore =
'n°04')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID = 604 AND Contenitore =
'n°14')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID = 609 AND Contenitore =
'n°04')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID = 609 AND Contenitore =
'n°14')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID = 649AND Contenitore =
'n°04')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID = 649 AND Contenitore =
'n°14')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID > = 648 AND Contenitore =
'n°04')
OR
(codice >= 20020415 AND codice <= 20020725 AND ID > = 648 AND Contenitore =
'n°14')
E' un po' lungo, ma credo sia l'unico modo.
Ciao
Alberto

 ha scritto nel messaggio
news:YRS%8.867$lu5....@twister1.libero.it...

fregatene del filtro...!
riapri il recordset con la nuova SQL!...ne guadagnerai in salute tu e il
programma in velocità!

Approfitto spudoratamente (sia per Luca che per Wodka), visto che il mio
problema è molto simile:
Scrivo qui le conclusioni cui sono arrivato e già messe nel topic "[?]
ADO+SQLSrv-Errore 80040E14-Access Violation"
-------------------------
Win XP Pro, VB6 SP5, ADO 2.5 (anche 2.7), SQL Server 7.0 SP2, SQLOLEDB
Sono riuscito a ridurre il problema già indicato "al minimo":
Avendo una tabella (anche assolutamente vuota) denominata "prove" con i
campi:
c_long, c_integer, c_single, c_long (tutti di qualunque tipo numerico)
ed eseguendo questa query:
Select c_long, (Select Sum(c_integer) From prove Where c_single<>0 Or
c_long<>0) As somma From prove
A me, solo con VB+ADO+SQL Server via SQLOLEDB, non con Query Analyzer (non
ho provato con archivio di tipo Access), genera questo errore:
-
2147217900
 (80040E14)
la cui proprietà Description riporta:
"SqlDumpExceptionHandler: Process 8 generated fatal exception c0000005
EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process."
Il problema è concentrato nella SubQuery ed è causato dalla presenza della
condizione "Or".
Cambiando la query in:
Select c_long, (Select Sum(c_integer) From prove Where c_single<>0) As somma
From prove
oppure in:
Select c_long, (Select Sum(c_integer) From prove Where c_long<>0) As somma
From prove
oppure in (ma è un'altra cosa):
Select Sum(c_integer) As somma From prove Where c_single<>0 Or c_long<>0
allora va tutto bene.
Mi piacerebbe, se qualcuno ha tempo e voglia di provare, avere conferma o
smentita e, magari, qualche suggerimento per bypassare il problema (su MSDN
non ho trovato nulla che descriva tali, direi semplici, condizioni). Grazie
infinite.

 Approfitto spudoratamente (sia per Luca che per Wodka),
oppsss, volevo dire Albe, non Luca

 programma in velocità!
Se ha bisogno di applicare il filtro potrebbe esserci un problema di diversa
natura:
1) chi ti dice che l'origine del recordset è un database? Io ho dei
recordset che creo a runtime e popolo con dati letti da file vari, da
seriali ecc...
2) la query potrebbe essere lunghissima, o la rete lentissima. Su alcuni
nostri sw, il server è visto attraverso una VPN a 64k, e i dati vengono
scaricati il meno possibile, e stoccati su recordset lato client
disconnessi.
3) il database server potrebbe avere problemi di licenze, o di accessi
contemporanei. Tipico il caso di ASP, in cui conviene di gran lunga ridurre
le query e cercare di sfruttare la cache dei dati della sessione.
Se invece quella del filtro era una 'voglina', devo ammettere che anche io,
come dice Wodka4U, cerco sempre di riaprire il recordset cambiando la
source, anzichè applicare i filter (anche perchè con alcuni controlli il
filter dà dei problemi).
Ciao
Alberto

 problema č molto simile:
Ho notato che diverse volte Lupo confonde Ado con Sql, imputando problemi di
Ado al DB o, piů spesso, problemi di Sql ad Ado.
Il problema di Roberta era squisitamente Ado (tant'č che non le ho neppure
chiesto che DB c'č sotto).
Il tuo, credo sia puramente SQL o SQL-Server
Ho provato la seguente query:
select potenza, (select sum(coppia) from tb_collaudi where fumo<>0 or
consumo<>0) as totale From tb_collaudi
e non ho ricevuto alcun errore (provata sia da Query Analyzer 2000 sia da VB
in debug)
La condizione d'ambiente č:
Client
VB60SP4+Ado2.7 su W2kSP2
AdOpenStatic, AdUseCLient, SQLOLEDB.1
Server SQL-Server 7.0SP3 su W2kProSP2
Non mi sembra diversa dalla tua situazione, per cui il tuo problema mi č un
po' misterioso.
Certo perň che mi sembra un problema di Sql-Server (del resto lo stesso
messaggio cita un SqlDump).
Prova a mettere SP3 di Sql-Server 7.0
Ciao
Alberto

 ha scritto nel messaggio
news:UpT%8.1043$lu5....@twister1.libero.it...
se non hai "prescia".....devo finire un lavoro col tuo amico DAO! (
:oP )...fino a sabato son li!
poi installo sul notebook MSDE (deve essere per forza SQLserv???? dimmelo
!)..e nel weekend (tanto dicono piove!) posso provare!

 Prova a mettere SP3 di Sql-Server 7.0
Lo farň, ma potresti, cortesemente, darmi una tua ipotetica spiegazione del
perchč, pur con SP2, Query Analyzer funziona regolarmente?

 !)..e nel weekend (tanto dicono piove!) posso provare!
No, non dev'essere per forza SQL Server, pare (cosě si dice in giro) che
MSDE sia il "figlio povero" di SQL Server, ma fatto a sua misura e
somiglianza ;-)
Grazie.

 perchč, pur con SP2, Query Analyzer funziona regolarmente?
Non ne ho.
Forse quel AdUseServer....
Prova a giocare un po' con i parametri del recordset, o ancora meglio a
mettere la query in un command e farla girare.
Ciao
Alberto

 weekend (tanto dicono piove!)
te possino....
Alberto

 Forse quel AdUseServer....
Beccato! Con adUseClient funziona.
Grazie e ... (vedi come sono bravo? ) non faccio polemica alcuna... ;-))

Lascia stare (grazie lo stesso), risolto (vedi risposta a Albe)

 Grazie e ... (vedi come sono bravo? ) non faccio polemica alcuna... ;-))
Non vedo perchè dovresti...
Con AdUseServer utilizzavi il servizio Cursor del data-provider, che
evidentemente ha qualche problema (torna in ballo SQL-SP3?), o quantomeno
non supporta un certo tipo di query, mentre con AdUseClient ti affidi al
servizio Cursor del tuo OleDb, che invece va benissimo.
:-)))
Alberto

 servizio Cursor del tuo OleDb, che invece va benissimo.
Alberto, ok, ti autorizzo a scrivere che sono un rompi, ma, per fare 31,
saresti così gentile (con tutto comodo) di rifare la prova che hai scritto
qualche post indietro con adUseServer? Visto che tu hai SQL 7.0 SP3 (mentre
io il SP2), vorrei capire se quel SP risolve o meno il problema. Grazie.

 io il SP2), vorrei capire se quel SP risolve o meno il problema. Grazie.
Fatto.
Tutto OK anche con AdUseServer.
Ciao
Alberto


... az ho letto!
ehm faccio il "micragnino"....(senza malizia eh!)
allora stavolta "funziona" grazie ad ADO non "malgrado" ADO!!!
Eh eh!
:-P
Lupo perchè non lo scrivi? Scrivi solo il "male" (o quello che ti pare male)
di ADO???
;-)

 Tutto OK anche con AdUseServer.
Grazie, sei stato gentilissimo.

 di ADO???
Non ho difficoltà (io sono un onesto nel vero senso della parola), solo che
ancora non mi quadra tutto. Non lo dico solo per sostenere a oltranza una
certa idea.
Con Query Analyzer (SQL 7.0 SP2) funziona, quindi, mi par di dedurre, non è
SQL Server. D'altra parte Alberto mi ha fatto la cortesia di provare con
adUseServer con SQL 7.0 SP3 e a lui funziona anche con VB+ADO. Le mie
perplessità aumentano, non per questo devo dare per forza la colpa a ADO,
ma, francamente, non riesco a dargli tutto il merito. Sono confuso. A meno
che (forse questa è la soluzione del mistero) Query Analyzer non usi sempre
qualcosa (ADO?) con cursore lato Client...

 qualcosa (ADO?) con cursore lato Client...
La differenza fra AdUseClient e AdUseServer è nella libreria che gestirà lo
scorrimento del recordset (Servizio Cursor).
Con AdUseClient, di fatto il risultato della query arriva tutto sul client,
poi ci pensa il tuo OleDb a spostare il puntatore avanti ed indietro. Per
cui, se usi SQLOLEDB.1, mi sembra che vada tutto bene.
Con AdUseServer, il risultato della query resta sul server, e ti viene
consegnato su richiesta, quindi il puntatore al record corrente viene mosso
dal server stesso.
Probabilmente, Query Analyzer utilizza SQLOLEDB.1, oppure una sua libreria
LATO CLIENT, mentre con ADO tu hai la possibilità di scegliere.
Evidentemente, con SQL7.0SP3 la gestione del cursore lato server è
migliorata rispetto a SP2. Probabilmente, la stessa cosa sarebbe accaduta
anche con altre librerie, e con altri linguaggi. Non credo che VC++, Java,
Delphi, ecc..., avrebbero ricevuto dal server un trattamento diverso.
Personalmente non conosco DAO, per cui non entro mai nei thread di confronto
fra DAO e ADO, ma se DAO consente la gestione del cursore lato server, il
problema si sarebbe verificato anche lì.
Oppure, la mia query e la query di Lupo non hanno niente in comune, e il
problema è da tutt'altra parte :-(((
Peccato avere già messo SP3 su tutti i miei server SQL.
Ciao
Alberto

 Peccato avere già messo SP3 su tutti i miei server SQL.
E perchè mai? Ahhh, ho capito, per tirarmi le orecchie fooooorte se per caso
a te con SP2 funzionasse, vero? Birichino... ;-)))