Newsgroup: it.comp.appl.access
Titolo: Record Duplicati

Salve a tutti,
Come posso eliminare dei record duplicati da una tabella
con una routine o una query?
Grazie in anticipo.
Anto
--------------------------------
Inviato via 
http://usenet.iol.it

 con una routine o una query?
In Access 97 esiste un'autocomposizione che cerca i record duplicati.
--
Silvio
il sito comune di it.comp.appl.access:
http://www.sitocomune.com

 In Access 97 esiste un'autocomposizione che cerca i record duplicati.
Scusa, mi è rimasta la parola query in canna...
In Access 97 esiste un'autocomposizione query che cerca i record duplicati.


 ha scritto nel messaggio
news:151Z39Z240Z215Y...@usenet.iol.it...

Ipotizziamo che la tabella che contiene i record duplicati si chiami
Tabella1, la sua chiave primaria si chiami ID ed il campo da cui va
verificato se esistono duplicati si chiami Nome, io farei cosi.
Mi creerei una query di creazione tabella chiamata Query1 che abbia il
seguente codice SQL:
SELECT DISTINCTROW Tabella1.Nome, First(Tabella1.ID) AS PrimoDiID INTO
tabella2
FROM Tabella1
GROUP BY Tabella1.Nome
HAVING (((Tabella1.Nome) In (SELECT [Nome] FROM [Tabella1] As Tmp GROUP BY
[Nome] HAVING Count(*)>1 )))
ORDER BY Tabella1.Nome;
Quindi mi creerei una query di eliminazione chiamata Query2 che abbia il
seguente codice SQL:
DELETE Tabella1.ID, Tabella1.Nome,
IIf(IsNull(DLookUp("[PrimoDiID]","Tabella2","PrimoDiID=" & [ID])),0,1) AS
Elim
FROM Tabella1
WHERE (((IIf(IsNull(DLookUp("[PrimoDiID]","Tabella2","PrimoDiID=" &
[ID])),0,1))=1));
Mi creerei infine Query3 che abbia il seguente codice SQL:
SELECT DISTINCTROW Tabella1.Nome, Tabella1.ID
FROM Tabella1
WHERE (((Tabella1.Nome) In (SELECT [Nome] FROM [Tabella1] As Tmp GROUP BY
[Nome] HAVING Count(*)>1 )))
ORDER BY Tabella1.Nome;
A questo punto mi creerei un codice VBA che aprirebbe in sequenza Query1,
Query2 e Query3 all'interno di un ciclo che terminerebbe solamente quando
Query3 mi restituirebbe una query vuota.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:OwVo6.94319$Y93.2...@news.infostrada.it...
E' inutile creare Query1 come query di creazione tabella, è sufficiente
crearla come query di selezione; pertanto il mio messaggio precedente va
letto così.
Ipotizziamo che la tabella che contiene i record duplicati si chiami
Tabella1, la sua chiave primaria si chiami ID ed il campo da cui va
verificato se esistono duplicati si chiami Nome, io farei cosi.
Mi creerei una query di selezione chiamata Query1 che abbia il
seguente codice SQL:
SELECT DISTINCTROW Tabella1.Nome, First(Tabella1.ID) AS PrimoDiID
FROM Tabella1
GROUP BY Tabella1.Nome
HAVING (((Tabella1.Nome) In (SELECT [Nome] FROM [Tabella1] As Tmp GROUP BY
[Nome] HAVING Count(*)>1 )))
ORDER BY Tabella1.Nome;
Quindi mi creerei una query di eliminazione chiamata Query2 che abbia il
seguente codice SQL:
DELETE Tabella1.ID, Tabella1.Nome,
IIf(IsNull(DLookUp("[PrimoDiID]","Query1","PrimoDiID=" & [ID])),0,1) AS Elim
FROM Tabella1
WHERE (((IIf(IsNull(DLookUp("[PrimoDiID]","Query1","PrimoDiID=" &
[ID])),0,1))=1));
Mi creerei infine Query3 che abbia il seguente codice SQL:
SELECT DISTINCTROW Tabella1.Nome, Tabella1.ID
FROM Tabella1
WHERE (((Tabella1.Nome) In (SELECT [Nome] FROM [Tabella1] As Tmp GROUP BY
[Nome] HAVING Count(*)>1 )))
ORDER BY Tabella1.Nome;
Quindi aprirei Query2 sino a quando Query3 non risulta vuota.


 Anto
La soluzione che ti ho proposto lavora solo con le query, come avevi
richiesto tu (se non ricordo male).
Se invece vuoi risolverla con una routine scritta in codice VBA, farei così.
Farei una query basata sulla tua tabella solamente per ordinare i record per
la chiave in base alla quale rilevare i record doppi (nel mio esempio il
campo Nome).
Quindi aprirei un recordset sulla query, mi scorrerei  tutti i record e
cancellerei tutti quelli la cui chiave è uguale a quella del record che l'ha
preceduto. Così è molto più facile da realizzare e molto più veloce, in
quanto con un'unica passata del recordset hai finito.
Scusami, ma perché non hai continuato il dialogo sul NG? pensavi forse che
non ti avrei risposto?
Sai che c'è una regola del nostro NG che vieta che si discuta in privato dei
problemi di Acces; ed io ci tengo a rispettarla. Ci potrebbero essere altri
partecipanti al NG che potrebbero essere interessati alla nostra
discussione, ed altri frequentatori potrebbero darti soluzioni migliorei
delle mie.
Ciao
Roberto