Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Eliminare uno di due record identici

Dunque, ho un database in formato Access 2002 che, in seguito a vari
stress (e dopo essere stato dallo psicologo), ha deciso di duplicarmi
alcuni record.
I record duplicati sono identici in tutto e per tutto, compreso il
contatore che era anche chiave primaria ma che ora non è più chiave
(nonostante sia ancora contatore).
Dall'interfaccia di Access seleziono uno dei record duplicati, lo cancello
e tutto va a posto.
Ho quindi provato a risolvere automaticamente il problema usando ADO.
individuo il record duplicato (ok), mi posiziono sullo stesso eseguo
delete.
ADO mi risponde che non posso farlo perchè 'Key column information is
insufficient or incorrect. Too many rows were affected by update.'.
Stesa cosa se provo ad aggiornare il record.
Io sono d'accordo, ma allora Access come fa a cancellare il record doppio
senza toccare quello originale?
termoPilucco
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
Access usa dao!!!
;-)

 (nonostante sia ancora contatore).
[CUT]
Mhhh la butto li...
Ti fai una programmino vb o una paginetta asp (anche direttamente in 
access e vba credo)
cmq ti crei un recrodset della tabella dato da:
select * from tbl_name group by id e quindi dovresti aver eliminato i 
doppi e poi ti scorri tutto il recordset ricreandolo in una nuova 
tabella tramite un ciclo, poi cancelli la vecchia e rinomini la nuova.
é la prima cosa che mi viene in mente,
mi rendo conto che è un po rozza ma dovrebbe andare.

 ;-)
Non il 2002 :P
comunque provo con DAO :)


 tabella tramite un ciclo, poi cancelli la vecchia e rinomini la nuova.
Tutto giusto, ma c'è di mezzo l'integrità referenziale che complica le
cose notevolmente.


 
No, perche'?
Non puoi aggiungere un campo contatore, eliminare i record doppi e poi 
rimuovere il campo?
	maxx

 comunque provo con DAO :)
vai tranquillo.
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo


 cose notevolmente.
con record doppi anche nel contatore l'i.r. mi sembra assai dubbia...
fra l'altro, che non sia più pk non conta. perche' si duplichino, dev'essere
not unique.
in casi del genere io farei un semplice ciclo dao. puoi anche caricare il rs
con ado, non cambia niente. il punto e' il ciclo. non conosco abbastanza sql
per avere la stessa certezza di risultato che ho con un ciclo tipo:
ordini sul contatore
carichi un rec -> rec_cfr
se quello successivo, ciclando sui campi, e' identico, lo elimini, seno'
diventa il nuovo rec_cfr
ciao, a.

 (nonostante sia ancora contatore).
Mi spieghi come fai a duplicare un contatore? ;)
Ciao 

 diventa il nuovo rec_cfr
il problema è eliminarlo per via programmatica senza eliminare la copia.


 Mi spieghi come fai a duplicare un contatore? ;)
Pagherei per saperlo, ma ce l'ho davanti agli occhi :P
Comunque DAO è la soluzione, mi permette di agire su un record senza
toccare l'altro.


 vai tranquillo.
funziona :)
termoPilucco
-- 



Se non c'è un vincolo Unique, è possibile forzare l'insert. Almeno, in 
Sql-Server è possibile forzare la cosa, immagino che Access non possa essere 
più severo di Sql-Server (sarebbe un caso unico).
Relativamente all'eliminazione dei record, in Sql-Server è possibilissimo 
anche con Sql:
SET ROWCOUNT 1
DELETE TABELLA FROM
TABELLA AS A
INNER JOIN (SELECT ID
 FROM TABELLA
 GROUP BY ID
 HAVING COUNT(1)>1
 ) AS B
ON 
A.ID
=
B.ID
SET ROWCOUNT 0
Questa elimina un record duplicato per ogni ID ad ogni esecuzione. Cioè, se 
per un determinato ID ho 1000 record identici (anzichè i due dell'OP), devo 
ripetere l'esecuzione 999 volte. Ma diciamo che, volendo, la si inserisce 
fra le operazioni di 'manutenzione', e le cose si tengono pulite da sole 
(cioè, è ovvio che la vera soluzione è prevenire una cosa del genere, ma 
tant'è...).
Con Access non saprei, non fumo.
Alberto
-- 
"C'è un Calvelli dentro ognuno di noi" (cit.) 

 il problema è eliminarlo per via programmatica senza eliminare la copia.
fidati, e' fattibile. a me serve ogni tanto, e funziona.
ciao, a.

 Se non c'č un vincolo Unique, č possibile forzare l'insert.
appunto. se non c'e'.
gia' se e' un contatore e provi a valorizzarlo a mano, access si
innervosisce abbastanza.
ho provato ora a creare db1.mdb, con tabella1 con un id contatore.
access propone indicizzato si', duplicati ammessi.
che, trattandosi di contatori, non ha molto senso, comunque spiega l'arcano.
termopilucco, mo' non dirmi che se vai in struttura record ti dice duplicati
non ammessi...

 non ammessi...
No.. rileggi bene il primo post.
Prima del danno c'era una chiave primaria univoca e il campo era contatore
(ed ovviamente non c'erano duplicati).
Dopo che il cliente si è visto pamDoingbrad.mpg usando come codec il mio
DB, la chiave è sparita, il contatore è rimasto, ma ci sono alcuni record
perefettamente duplicati (campo per campo, ho scritto un procedura per
verificare l'identità dei due record prima di eliminarne uno).
Comunque, con DAO, la funzione di eliminazione record ha funzionato
egregely :)


 per verificare l'identità dei due record 
identicità :)
