Newsgroup: it.comp.appl.access
Titolo: Lentezza di una query di aggiornamento: meglio usare il codice?

Salve a tutti e buon inizio di settimana.
Ho un problema che - da solo - non riesco a risolvere.
Una tabella con circa 60.000 records composti ciasuno da circa 30 campi deve
essere aggiornata su apertura di una maschera particolare (un "menù
principale").
L'aggiornamento consiste nell'eliminazione dei record che violano una
condizione determinata.
Ho creato una query di eliminazione record ma è dannatamente lenta e non
posso attendere dai 10 ai 15 secondi che tutte le volte porti a termine il
ciclo di operazioni. O meglio, io potrei anche, ma il mio cliente non credo
:)
Come posso procedere da codice?
Ho pensato:
Dim rs as DAO.Recordset
set rs=CurrentDb.OpenRecordset("SELECT * FROM Tabella1")
Ho così creato il mio recordset.
Come posso eliminare record (ad esempio) con il CampoX = 1?
Ciao

"vuLCan Karayan" <vulcankarayan@__BERLUSCONI__tiscali.it> ha scritto nel 
messaggio news:uRkde.1318333$35.49...@news4.tin.it...

Beh cosi di prima mattina mi sembra che un recordset sia molto più lento di 
una query di aggiornamento.
Il recordset impiega tempo per scorrere tutti i records record per record.


La guida in linea ciccio ,oltre i libri su vb e file .dat et similia
leggiti un po la guida in linea se no ecco la pappa pronta.......o quasi
DoCmd.RunSQL "DELETE * FROM Tabella1 WHERE ..........(questo ce lo metti tu)
SunRex

 SunRex
Ti ringrazio per l'aiuto SunRex, ma č evidente che non hai capito il
problema.
Copiare l'SQL generato dalla query č cosa semplice, persino per me.
Grazie lo stesso.
Ciao


Infatti io non intendevo copiare il costrutto SQL di una query.
Per eseguire delle operazioni su tabelle puoi ,come giustamente hai fatto
osservare,
fare in 3 modi.
1)Usare una query già pronta con OpenQuery
2)Usare RunSQL
2)Usare VBA
1)
DoCmd.OpenQuery "qryTuaQuery", acNormal, acEdit
2)
        Se il valore del campo cambia dovrai passare la clausola Where con
una variabile.
        dim intX as Integer
       intX= 1
        DoCmd.RunSQL "DELETE * FROM Tabella1 WHERE CampoX = " & intX & ";"
3) Versione A
            Set rs = db.OpenRecordset("Tabella1")
            Do Until rs.EOF
                    If rs.Fields("CampoX")=1 Then
                        rs.Delete
                     Else
                        'Non fare niente
                    End If
                rs.MoveNext
            Loop
3) Versione B Adattato dalla guida in linea
Sub EliminaRecord(db As Dao.DataBase ,rstTemp As Dao.Recordset,  lngX As
Long)
Set rsTemp = db.OpenRecordset("Tabella1")
lngX= 1
With rstTemp
  .Seek "=", lngX
  If .NoMatch Then
  Else
   .Delete
  End If
 End With
End Sub
Cmq il problema della lentezza è dovuto secondo me alla grande quantità di
record da scorrere.
Normalmente è meglio usare qry già pronte per evittare il parsing.Cioè
dovrebbe essere meno veloce VBA che
una qry gia fatta, quindi il primo esempio.Vedi se hai modo di limitare la
ricerca dei record da cancellare sfruttando
un altro campo.
P.S.
Spero di aver capito...
SunRex

 SunRex
Grazie infinite, SunRex.
Vedrò di applicare i tuoi suggerimenti.
Ciao

 ...
o 2) ;-) che invece di RunSQL usa il metodo execute die DAO
o ADO che spesso è più veloce di RunSQL perché funziona più
diretto, senza coinvolgere l'Expression Service di JET:
Currentdb.Execute "StatementSQLoNomeDellaQuery", dbFailOnError
v. a. <F1> "Execute"
Di solito uso RunSQL per le prove, perché ci sono messaggi dettagliati.
Poi quando la cosa funziona lo sostituisco con Execute e così risparmi
anche SetWarnings False/True. v.a. 
www.donkarl.com/it
 2.4
-- 
cu
Karl
*********
Access FAQ: 
www.donkarl.com/it
 + iscriviti alla prima Conferenza
Italiana per Sviluppatori di Access (CISA 1), Arezzo, 4+5/6/2005