Newsgroup: it.comp.appl.access
Titolo: Ricerca ed eliminazione duplicati con criterio

Data una tabella Evaso, così strutturata:
ID(contatore), Numeratore(Numerico), DataAccod(Data generica, incluso
ore minuti e secondi)
ID	Numeratore	DataAccod
1	1811	14/7/08 11.01.24
2	1811	14/7/08 11.01.24
3	1811	14/7/08 11.01.24
8	1811	14/7/08 11.31.01
9	1811	14/7/08 11.31.01
10	1811	14/7/08 11.31.01
4	1812	14/7/08 11.01.34
5	1812	14/7/08 11.01.34
11	1812	14/7/08 10.51.00
12	1812	14/7/08 10.51.00
6	1813	14/7/08 11.01.03
7	1813	14/7/08 11.01.03
13	1813	15/7/08 11.21.05
14	1813	15/7/08 11.21.05
Come faccio a ricercare i duplicati di numeratore che hanno DataAccod
più bassa?
Es: del numeratore 1811 deve selezionare tutti i record che contengono
DataAccod=14/7/08 11.01.24.
Una volta trovati questi duplicati dovrei eliminarli dalla tabella.
Io riesco soltanto a visualizzare, attraverso query di ricerca
duplicati, soltanto i duplicati di numeratore ma non riesco di questa
selezione ad individuare quelli con DataAccod più bassa.
Grazie di cuore


Nessuna idea?

 - Mostra testo citato
Non c'è nessuno impietosito?

 - Mostra testo citato
che tipo di dato è DataAccod  nella tabella ?
qualcosa del genere dovrebbe funzionare salvo ritocchi sulla
formattazione del contenuto di dataaccod
dim dataora as date
dataora = dmin("DataAccod", "Evaso", "numeratore = " & tuonumeratore)
docmd.runsql "delete * from tabella where numeratore = " &
tuonumeratore & " and DataAccod = '" & format(dataora, "dd/m/yy
hh.mm.ss") & "';"
prima di eseguire fai il backup dei dati o fai una prova su una copia
dei dati

 - Mostra testo citato
Ciao e grazie per la risposta.
DataAccod è data/ora e mi restituisce anche ore minuti e secondi.
Ho provato come segue:
Public Function EliminaDuplicati()
Dim dataora As Date
dataora = DMin("DataAccod", "Evaso", "numeratore = " & tuonumeratore)
DoCmd.RunSQL "delete * from tabella where numeratore = " &
tuonumeratore & " and DataAccod = '" & Format(dataora, "dd/m/yy
hh.mm.ss ") & " ';"
End Function
ma va in errore su
dataora = DMin("DataAccod", "Evaso", "numeratore = " & tuonumeratore)
Errore di sintassi (operatore mancante) nell'operatore della query
'numeratore = '
Ma tuonumeratore cos'è?
Puoi controllare gentilmente?

 - Mostra testo citato
nell'esempio citato
tuonumeratore=1811
se invece lo deiv fare per tutti i numeratori puoi provare a fare un
ciclo for next in cui ad ogni giro incrementi tuonumeratore di 1.
Se non sbaglio (dal basso dellamia 'gnoranza) se il valore di tuo
numeratore c'è cancella, altrimenti non fa nulla
Occhio però che se ce ne è una sola di data questa sarà anche la
minima...
Magari integri con if dmax(....) > dmin (...) then...
esegui query cancellazione
end if
Mi raccomando fai delle copie prima di "pasticciare"...
F.

 - Mostra testo citato
Si devo farlo per tutti i numeratori, ma la soluzione da te proposta è
ben lontano dalla mia conoscenza.
Grazie comunque

 - Mostra testo citato
Public Function EliminaDuplicati()
Dim dataora As Date
Dim MyCounter ad integer
For MyCounter  = 1 To 10000  ' questi valori (1 e 10.000) mettili come
ti è più comodo, devono comprendere il range del tuo numeratore
if DMax("DataAccod", "Evaso", "numeratore = " & MyCounter) >
DMin("DataAccod", "Evaso", "numeratore = " & MyCounter) then
dataora = DMin("DataAccod", "Evaso", "numeratore = " & MyCounter)
DoCmd.RunSQL "delete * from tabella where numeratore = " &
MyCounter& " and DataAccod = '" & Format(dataora, "dd/m/yy
hh.mm.ss ") & " ';"
end if
next
End Function
Molto a occhio e croce e presumendo he il codice di partenza di AleC
fosse corretto
Dal basso della mia 'gnoranza molto smanettona...
Al solito mi raccomando il backup!!!
F.


autodebug!
dove ho scritto "next" ci va
"next Mycounter"
F.


non è chiaro cosa deve succedere se per un dato Numeratore ci sono
solo valori uguali di DataAccod, sono tutti da eliminare questi record
in quanto essendo tutti "minimi valori" oppure in questo caso devono
essere salvati ?
AleC

 - Mostra testo citato
Grazie da qui si dovrebbe capire:
ID      Numeratore      DataAccod
1       1811    14/7/08 11.01.24
2       1811    14/7/08 11.01.24
3       1811    14/7/08 11.01.24
8       1811    14/7/08 11.31.01
9       1811    14/7/08 11.31.01
10      1811    14/7/08 11.31.01
Deve eliminare solo i numeratori duplicati (1811 sono sei righe, ma
uno ha DataAccod=14/7/08 11.01.24  e l'altro ha DataAccod=14/7/08
11.31.01) dove DataAccod è più bassa dell'altro numeratore duplicato
che contiene DataAccod più alta.
Quindi eliminando rimarrebbe:
ID      Numeratore      DataAccod
8       1811    14/7/08 11.31.01
9       1811    14/7/08 11.31.01
10      1811    14/7/08 11.31.01
Se non ci sono duplicati, allora non succede niente.
Grazie e scusate la poco chiarezza.

 - Mostra testo citato
Alec dove sei?

 - Mostra testo citato
Muore così?

 - Mostra testo citato
be', ad una certa ora vado a casa :-)
sì ma cosa succede se ci sono solo record tutti uguali ? tipo:
ID      Numeratore      DataAccod
1       1811    14/7/08 11.01.24
2       1811    14/7/08 11.01.24
3       1811    14/7/08 11.01.24
tutti uguali e quindi tutti minimo valore
li elimina e 1811 sparisce o li lascia ?
o ne lascia 1 ?
o che altro ?

 - Mostra testo citato
Li lascia tutti

Prova allora:
dim dataora as date
dataora = dmin("DataAccod", "Evaso", "numeratore = " & tuonumeratore)
if dcount("DataAccod", "Evaso", "numeratore = " & tuonumeratore) >
dcount("DataAccod", "Evaso", "DataAccod = " & dataora) then  'se ci
sono più record oltre quelli con valore minimo di DataAccod allora fa
la cancellazione
  docmd.runsql "delete * from tabella where numeratore = " &
tuonumeratore & " and DataAccod = '" & format(dataora, "dd/m/yy
hh.mm.ss") & "';"
end if


provo subito

qui l'errore
dataora = DMin("DataAccod", "Evaso", "numeratore = " & tuonumeratore)
Errore di sintassi (operatore mancante) nell'operatore della query
'numeratore = '
If DCount("DataAccod", "Evaso", "numeratore = " & tuonumeratore) >
DCount("DataAccod", "Evaso", "DataAccod= " & dataora) Then
  'se ci sono più record oltre quelli con valore minimo di
DataEvasione allora fa la cancellazione
DoCmd.RunSQL "delete * from tabella where numeratore = " &
tuonumeratore & " and DataAccod= '" & Format(dataora, "dd/m/yy
hh.mm.ss ") & " ';"
End If
End Function

 - Mostra testo citato
a tuonumeratore devi sostituire il numero contenuto nel campo
Numeratore che vuoi selezionare

 - Mostra testo citato
Public Function EliminaDuplicati()
Dim dataora As Date
Dim MyCounter ad integer
For MyCounter  = 1 To 10000  ' questi valori (1 e 10.000) mettili
come
ti è più comodo, devono comprendere il range del tuo numeratore
if DMax("DataAccod", "Evaso", "numeratore = " & MyCounter) >
DMin("DataAccod", "Evaso", "numeratore = " & MyCounter) then
dataora = DMin("DataAccod", "Evaso", "numeratore = " & MyCounter)
DoCmd.RunSQL "delete * from Evaso where numeratore = " &
MyCounter& " and DataAccod = '" & Format(dataora, "dd/m/yy
hh.mm.ss ") & " ';"
end if
next
End Function
Un po' mi sono incuriosito...
ma perchè quella qui sopra non va??? la mia pappa pronta non era
buona, sniff??
F.

 - Mostra testo citato
ops...
sempre aggiungendo Mycounter dopo next
F.


Rispondo a Alec:
a tuonumeratore devi sostituire il numero contenuto nel campo
Numeratore che vuoi selezionare
Deve lavorare su tutta la tabella io non gli passo alcun numeratore.
Rispondo ad Al:
la soluzione l'ho testata e mi viene restituito:
dataora = DMin("DataAccod", "Evaso", "numeratore = " & MyCounter)


 - Mostra testo citato
Questa la ho testata rapidamente e mi pare funzioni come vuoi tu...
Public Function EliminaDuplicati()
Dim dataora As Date
Dim MyCounter As Integer
For MyCounter = 1 To 10000   ' questi valori (1 e 10.000) mettili come
ti è più comodo, devono comprendere il range del tuo numeratore
dataora = Nz(DMin("DataAccod", "Evaso", "numeratore = " & MyCounter))
If DMax("DataAccod", "Evaso", "numeratore = " & MyCounter) > dataora
Then
DoCmd.RunSQL "delete * from Evaso where numeratore = " & MyCounter & "
and DataAccod = #" & dataora & "#;"
End If
Next MyCounter
End Function
F.


Grandioso! Grazie mille, siete fantastici.