Newsgroup: it.comp.lang.visual-basic
Titolo: Eliminazione di record duplicati

Ciao a tutti!
In un db Access ho una tabella che avrebbe dovuto avere un codice univoco,
invece sul campo in questione e' stato creato un indice duplicabile... e,
guarda la combinazione, ci sono delle righe duplicate, del tipo:
A
A
B
B
C
C
D
D
....
A questo punto, vorrei cancellare le duplicazioni. Se si trattasse di un
solo db sarebbe un attimo, ma diversi clienti hanno una situazione del
genere, x cui devo realizzare un programma che identifichi il db del cliente
ed elimini le duplicazioni, prima di far qualcosa x risistemare gli indici
come dovrebbero essere.
In questo, xo', ho qualche difficolta', xche' il programma che ho scritto x
un po' va avanti come mi aspetto, poi succede una cosa che non capisco:
ad un certo punto, invece di cancellare un solo record (solo uno dei 2
duplicati), li cancella entrambi, tutti e due con lo stesso codice (x es.:
C - C) e va in errore di run-time 91 (Variabile oggetto o variabile del
blocco With non impostata).
E' un mio errore di programmazione o l'anomalia che ottengo e' dovuta a
qualche altro motivo (correlato, x es., al fatto che il campo e'
indicizzato...)?
Riporto in calce alla presente mail una sintesi del codice utilizzato.
Grazissime in anticipo a chi mi vorra'/potra' rispondere.
Ciao!
    Alex
----------------------------
   Dim dBase as Connection
   Dim RsLoc as ADODB.Recordset
   [...]
   Set dBase = New Connection
   ProviderUsato = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Jet OLEDB:Database
Password=PINCO"
   [...]
   'apro connessione al db
   [...]
   strCodiceCorrente = ""
    strSQL = "select * from miaTabella order by Codice"
    'istanzio il recordset RsLoc, imposto proprieta' varie e lo apro
    [...]
    'se la tabella non e' vuota...
    If Not (RsLoc.BOF And RsLoc.EOF) Then
        'vado al primo record
        RsLoc.MoveFirst
        Do While Not RsLoc.EOF    'ciclo fino a fine tabella
            Debug.Print RsLoc.Fields("Codice")
            If (RsLoc.Fields("Codice") = strCodiceCorrente) Then
                'codice duplicato: lo elimino
                RsLoc.Delete
            Else
                'prima occorrenza: mantengo
                strCodiceCorrente = RsLoc.Fields("Codice")
            End If
            'vado al record successivo
            RsLoc.MoveNext
        Loop
    End If
    RsLoc.Close


[cut]
_questo_ codice è corretto.
che tipo di lock usi nel recordset?
ciao
ugo

 che tipo di lock usi nel recordset?
La libreria che uso x aprire il recordset e' impostata nel modo seguente:
RsLoc.CursorType = adOpenKeyset
RsLoc.LockType = adLockOptimistic
    Alex

Riciao!
Ho fatto una verifica in seguito al tuo suggerimento.
Per aprire il recordset utilizzavo una sub contenuta in una nostra libreria;
questa, xo', ha effettivamente il LockType impostato su adLockOptimistic;
Mi pare di aver capito che le cose, in quella sub, fossero messe in questo
modo xche', x poter successivamente passare il recordset aperto ad un
datagrid, era stato necessario impostare la proprietą CursorLocation su
adUseClient che mi pare non supporti l'impostazione adLockPessimistic.
Ho provato ad impostare il LockType su adLockPessimistic e... tutto sembra
funzionare. Ho inteso bene?
Comunque grazissime!
    Alex