Non ho capito... impiega 1 ora per processare 8000 C.F. ....?
Mostra il codice... in meno di 1 minuto dovrebbe farli tutti.
Non ho capito... impiega 1 ora per processare 8000 C.F. ....?
Mostra il codice... in meno di 1 minuto dovrebbe farli tutti.
Option Compare Database Private Sub Comando0_Click() Dim db As DAO.database Set db = CurrentDb Dim rs As Recordset, ps As Recordset, n As String Set rs = db.OpenRecordset("TB1") Set ps = db.OpenRecordset("TB2") rs.MoveFirst Do Until rs.EOF If IsNull(rs!DataPren) Then rs.MoveNext End if ps.MoveFirst Do Until ps.EOF If ps!CodFisc = rs!CodFisc And IsNull(ps!CodFisc) Then ps.Edit ps!DataInizio = rs!DataInizio ps!Categoria = rs!Categoria ps.Update End If ps.MoveNext 'If ps!CodFisc <> rs!CodFisc Then Exit Do Loop rs.MoveNext Loop ps.Close rs.Close Set ps = Nothing Set rs = Nothing End Sub
Non si fanno cicli per fare aggiornamenti in massa. Pensa se tu avessi milioni di record!!!
Come dice @Alex, si fa una query di UPDATE.
Se vi sono più tabelle interessate si usa un query di UPDATE con JOIN:
SQL Server UPDATE JOIN Explained By Practical Examples
https://www.sqlservertutorial.net/sq...r-update-join/
Il VBA non c'entra nulla, è una questione da risolvere SQL.
Scusa, ma non capisco; in quale modo se hai solo la data di Fine?
Riesci ad esportare la/le tabella/e su dei fogli Excel e linkarli per il download?
Ultima modifica di gibra; 09-02-2021 10:04
Ciao
Errore e nella secondo LOOP
o usi un find per cercare i record interessati
o crei una query filtrata in base al CF
Dim SQL_Code as string sql_Code="Select * " sql_Code= sql_Code & " From TB2" sql_Code= sql_Code & " Where TB2.cf='" & rs.fileds(CF) & "'" Set ps = db.OpenRecordset("sql_Code") Do Until ps.EOF If ps!CodFisc = rs!CodFisc And IsNull(ps!CodFisc) Then ps.Edit ps!DataInizio = rs!DataInizio ps!Categoria = rs!Categoria ps.Update End If ps.MoveNext LoopQuesto è da inserire al posto del secondo LOOP
Così facendo
per ogni CF esegui una 2° query solo con i campi necessari e non i tuoi 2200
Grazie Dragone Bianco.
La proverò senz’altro ...studiandola al tempo stesso.
Preciso di essere partito da un file contenente 8.500.000 records.
Mi Potevo sparare se non avessi filtrato per sottogruppi di circa 100.000 records ciascuno.
Questo ad esempio ne raggiungeva 77000 che su suggerimento di Alex ho scomposto in 22000 e 55000.
Grazie davvero. Ho tribolato parecchio, anche se a detta di molti era da considerare quasi una banalità.
Domani, tenterò di mettere in essere anche la tua soluzione.
Buona serata
Non mi permetterei di correggere un maestro, ma chiedere chiarimenti si.
C’è forse una svista nel tuo codice?
Lo riscrivo ...
Dim SQL_Code as string sql_Code="Select * " sql_Code= sql_Code & " From TB2" sql_Code= sql_Code & " Where TB2.CodFisc='" & rs.fields(CodFisc) & "'" Set ps = db.OpenRecordset("sql_Code") Do Until ps.EOF If ps!CodFisc = rs!CodFisc And IsNull(ps!DataInizio) Then ps.Edit ps!DataInizio = rs!DataInizio ps!Categoria = rs!Categoria ps.Update End If ps.MoveNext Loop
Se vuoi ulteriormente velocizzare l'esecuzione utilizza una transazione e subordina il commit della stessa ogni x update (p.e. ogni 100 update) : vedrai la drastica riduzione del tempo di esecuzione.
PS - prevedi anche il DoEvents()