Newsgroup: it.comp.lang.visual-basic
Titolo: ADO: query su di un recordset

Salve a tutti! Ho incontrato un picccolo scoglio..
Ho una select che impiega qualche minuto perchè è una query su 3 tabelle
in join che contengono qualche milione di record ciascuno.
Tralasciando gli eventuali errori architetturali del DB, il problema è
questo: dovrei fare 3 select identiche ma variabili solo a livello di
aggregazione.
Spiego ancora meglio: la select principale mi ritorna record aggregato a
livello di giorno, ovvero ogni record è contraddistinto (tra le altre
chiavi) dal giorno.
La successiva è aggregata per mese, ma di fatto i campi che tira fuori
sono identici
L'ultima mi dà il totale.
Ora, rifare 3 volte praticamente la stessa query è una cosa da quasi
suicidio, mi chiedevo se era possibile, una volta eseguita la prima (ed
associata ovviamente a un recordset), effettuare le altre su questo
recordset.
In fondo il recordset già mi contiele una tabella con i dati formattati e
con le condizioni di where già esaudite.. e l'esecuzione a questo punto
sarebbe quasi istantanea.
Il filter non mi serve.. come detto devo riaggregare, quindi fare una
nuova select (riferendomi ovviamente ai campi del recordset e non a quelli
delle tabelle originarie) con un nuovo group by.
Se pole? o farnetico?
Grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 aggregazione.
Fai una sola query ma With Rollup:
select linea,formato,media=avg(produttivita)
from tb_produttivita_formati
group by linea,formato
with rollup
Ottieni un solo recordset, in cui puoi filtrare il campo dimensione di
dettaglio (giorno) Null come subtotali, entrambi i campi dimensione (giorno
e mese) Null come totale, e i campi dimensione diversi entrambi da Null come
dettaglio.
In questo modo ottieni con un unica select ciò che ti serve e in un attimo
filtri le righe di dettaglio.
In questo caso hai una dimensione intesa come gerarchia sull'altra (un mese
contiene più giorni, ma un giorno non può appartenere a due mesi diversi),
per cui ottimo il With Rollup.
Se tu avessi avuto due dimensioni indipendenti (ad esempio, che so, giorno
della settimana e mese, per cui avresti potuto avere la combinazione
interessante anche del totale dei lunedi, ecc...), avresti potuto usare,
esattamente nello stesso modo ma con il dettaglio anche nell'aggregazione
complementare, la clausola With Cube.
Fai qualche esperimento e capirai meglio.
Ciao
Alberto

 Fai qualche esperimento e capirai meglio.
Bello.. mi hai aperto un mondo :-)
Peccato che la versione che ho io non lo supporta, non riconosce proprio
il comando...
(ORA-00933: SQL command not properly ended)
versione:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
Sarà stato implementato successivamente.. 
Comunque di nuovo grazie.


 Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
Ecco, forse questa informazione poteva servire prima...
Comunque, non credo che Oracle non supporti una funzionalità così
importante.
Al limite, potrebbe esserci qualche differenza sintattica, magari si chiama
"With Pippo" anzichè "With Rollup", ma probabilmente esiste.
On-line, ma non chiedermi dove perchè sono cose che non ricordo, ci sono
documenti che fanno comparazioni dettagliate fra i diversi dialetti Sql.
Cercane qualcuno e dovresti trovare l'equivalente Oracle8i per le due
clausole che ti ho riportato (supportate da Sql-Server sia 7 che 2k).
Ciao
Alberto

 Al limite, potrebbe esserci qualche differenza sintattica
Ok, trovato Byuffo perchè in alcuni siti la sintassi è (anche x Oracle, a
loro detta) "group by blah blah blah with cube"
la corretta è invece:
Group by cube(campo1, campo2), campo3 ..ecc
Dunque.. scusa se ti scasso ancora, ma sono incappato in un altro errore.
Questa volta tutto lato VB (o meglio ASP, lo sto utilizzando lì infatti).
Premesso che la query viene correttamente eseguita su oracle.
Premesso che un recordset, al momento dell'apertura, non dà errori.
Quando tento l'accesso a proprietà del rcordset, mi viene risposto sempre
questo messaggio:
Microsoft Cursor Engine (0x80004005)
Data provider or other service returned an E_FAIL status.
le prove che generano l'errore? Mah... basta un
response.write rs.recordcount
o un
response.write rs.field(1).value
Ovviamente basta rimuovere il CUBE perchè tutto funzioni a meraviglia.
Ho googlato ma il messaggio d'errore è troppo generico e i casi in cui si
genera i più disparati, sembra comunque che il più ricorrente sia
l'impossibilità di poter salvare dei campi. Ma io apro il RS in sola
lettura...
ho pure provato a clonare il RS in un altro di sola lettura e
disconnettere quest'ultimo, ma appena dò un qualsiasi commando, solita
solfa. Ovviamente anche il filter mi genera questo errore.
Sei mai incappato in problemi del genere?
(poi... s'è perso il filo del discorso iniziale. Il CUBE/ROLLUP è molto
carino, ma esiste o no il modo di creare un recordset con una query su un
altro RS?)


 query su un altro RS?)
Che io sappia, poca roba, giusto un .Filter che assomiglia un po' ad una
Select Where, nient'altro.
Ciao
Alberto

 inseriscono per identificare i subtotali).
Perfetto. Ti ringrazio tantissimo, potevo in effetti pensarci da solo, ma
evidentemente son troppo fumato oggi.. l'idea di fare il ponte domani
(sono di FI e qua il 24 c'è la festa sx il patrono) m'ha scombussolato :-)
Risolto con una decode:
decode (campo1 ,null,'NULL', campo1)
e così via per tutti i campi di aggregazione del cube
così ho un campo che ha o la stringa NULL o quanto mi serve. E ado non dà
problemi.
Thank you a lot.
