Newsgroup: it.comp.lang.visual-basic
Titolo: archivio MDB di 150.000 record

Devo gestire un archivio di 150 000 record.
Quando faccio le statistiche e' molto lento.
Io carico un set di record di un anno in un RecordSet e poi ciclando su di
esso eseguo dei calcoli a seconda del tipo di stampa da fare.
Il tutto e' molto lento.
Le istruzione che uso :
Sub Calcola()
Dim DB As ADODB.Connection
Dim RS As ADODB.Recordset
' Connessione Database
  Set DB = New ADODB.Connection
  DB.Provider = "Microsoft.Jet.Oledb.4.0"
  DB.Open "Data Source=" & Trim(NomeFile")
' Apre l'insieme di record
  Set RS = New ADODB.Recordset
  Call RS.Open(IstrSql, DB, adOpenStatic, adLockPessimistic)
Do While Not RS.EOF
       ' Ciclo sull' set di record
       RS.MoveNext
Loop
end sub
Domanda:   C'e' un modo per renderlo piu' veloce?
Grazie

 Domanda:   C'e' un modo per renderlo piu' veloce?
sě, evitando il ciclo.
non č uno scherzo, molte volte le operazioni che si fanno all'interno di
un ciclo sono replicabili tramite un'istruzione sql, in questo modo fai
fare tutto il lavoro al motore del db, e diventa notevolmente piů rapido.
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 fare tutto il lavoro al motore del db, e diventa notevolmente piů rapido.
Ho questo problema : devo calcolare un totale ora. Per tre gruppi diversi di
campo: Es.
Totale Ora Cliente, Totale Ora Reparto, Totale Ora Interno.
Il campo del db "Durata" e di tipo date time.
Devo sommare i totali cosi':  Per Cliente,  Per ClienteReparto, Per
ClienteInterno.
Inoltre le var totali non possono essere di tipo date time, perche' i totali
possono superare le  24 ore.
Domanda c'e' un'istruzione sql che mi somma le date e che restituisca un
risultato tipo :
100.20.30    ovvero 100 ore , 20 minuti, 30 secondi? e posso farlo per quei
tre gruppi?
Con una sola istr sql non credo sia possibile. O meglio , io non so' come
farla.
Grazie per aver risposto.

 ClienteInterno.
per sapere come fare questo, bisognerebbe conoscere un po' meglio come
sono strutturati i tuoi dati di partenza.


 Grazie per aver risposto.
Prego
Ciao
MarcoMac

 trasformarli in un'altra unità di misura.
Io posso ridare la mia soluzione postata qualche tempo fa:
http://groups.google.it/groups?hl=it&lr=&c2coff=1&client=firefox-a&threadm=g
qlqd.418191%2435.18428659%
40news4.tin.it
&rnum=2&prev=/groups%3Fhl%3Dit%26lr%
3D%26c2coff%3D1%26client%3Dfirefox-a%26q%3Dzanna%2Bdate%2Bminuti%26btnG%3DCe
rca%26meta%3Dgroup%253Dit.comp.lang.visual-basic
A chi è interessato non spiacerà ricostruirsi il link :)
Questa, come si diceva, è un'operazione postuma all'SQL che può
tranquillamente calcolarsi le differenze lui stesso, magari facendo più
query, una per ogni gruppo, tanto per semplificare anche la manuntenibilità
e la leggibilità.
Detto questo, se mancassero, anche qualche indice non farebbe male.
Ciao
--
Reporting tool: 
http://www.neodatatype.net
Qualunque mentecatto può scrivere codice che un computer possa capire.
I buoni programmatori scrivono codice che gli uomini possano capire.
[Martin Fowler]

 le ore e i minuti.
?
la funzione datediff che fą?


 la funzione datediff che fà?
Non so, che fa? ;)
Ciao 

 tre gruppi?
Ho spesso avuto lo stesso tipo di esigenza, essendomi trovato a lavorare (tra
l'altro) ad un gestionale di rilevamento presenze.
La soluzione adottata nel mio caso (anche per me le "durate" sono espresse con
un DateTime in cui la parte Date però è il giorno di riferimento... lo so è un
po' anomalo ma funziona egregiamente) è una query di selezione in cui l'output è
un campo calcolato che esprime i secondi totali e con un raggruppamento:
SELECT Sum(Hour(MiaTabella.DataOra) * 3600 + Minute(MiaTabella.DataOra) * 60 +
Second(MiaTabella.DataOra)) AS Totale FROM MiaTabella GROUP BY Cliente
Nel tuo caso avrai da eseguirne 3, ciascuna con un raggruppamento in base ad un
diverso campo.
Dopodiché aprendo un recordset su ciascuna query, nel campo Totale ritrovi la
somma desiderata.
Per formattare questo valore in una stringa "extended-time" (così l'avevo
battezzata io), in cui il valore della parte "Ore" può superare 23 devi crearti
tu una funzione ad hoc che a partire dai secondi crea la stringa.
Bye
Raf

 come farla.
Se si decide di utilizzare un database, occorre conoscerlo.
Access offre un wizard di realizzazione del codice Sql estremamente 
semplice. Non potentissimo, nel senso che tante cose non ci si salta proprio 
fuori, ma sicuramente semplice.
Prima di connettere VB ad un database, io ritengo assolutamente 
indispensabile conoscerne almeno i rudimenti.
Ciao
Alberto
-- 
E tutto mi sembrava andasse bene... 

 Grazie
1: Puoi modificare il ciclo. Se ti fai restituire prima il numero di
record (e' una banale 'select count(*) from ...'), il ciclo for..next e'
molto piu' veloce del ciclo do until rs.eof...loop (non deve testare dopo
ogni movenext la Eof();
2: usa gli oggetti ADODB.Fields per riferirti ai valori letti da db, al
posto di rs(<nome_campo>).value
Bye by SixaM 8-]
-- 



non posso modificare la struttura della tabella. Devo fare delle statistiche
su un archivio mdb di un altro programma.  Se modifico la struttura della
tabella conprometto il funzionamento del programma originale.

 tabella conprometto il funzionamento del programma originale.
Perņ puoi sicuramente crearti delle query che puoi utilizzare da programma 
per simulare il "cambio di struttura".
Ciao 

 ti serve
grazie


provero' grazie


si e' il periodo che intendevo.


provo anche questa.
grazie