Newsgroup: it.comp.appl.access
Titolo: Campo "posizione in classifica"

Come si fa a creare un campo che tenga conto della posizione dei
record ma se un certo valore e' in parita' con altri la prossima
posizione salta come accade nelle classifiche sportive....ad esempio:
RANK  valore
10       250
10       250
10       250
13       233
Quindi il contatore della classifica dovrebbe scattare in avanti
quando ci sono i valori che sono oggetto della classifica in parita' e
quindi segnare 13 e non 11.
Tengo a precisare che le classifiche sono storiche, non m'interessa
che questa cosa sia dinamica.
Grazie.

 ha scritto nel messaggio 
news:0dac700e-9a45-4dcf...@v5g2000prm.googlegroups.com...

Io farei tutto da codice.
Una strada:
immagino una tabella (TblClassifica) con due campi:
Classifica  - numerico
Punteggio  - numerico
Con questa Sub ottengo il risultato voluto:
Public Sub OrdinaClassifica()
Dim rcs As DAO.Recordset, i As Integer, ii As Integer
Dim Classi As DAO.Recordset
Set rcs = CurrentDb.OpenRecordset("SELECT TblClassifica.Punteggio FROM 
TblClassifica GROUP BY TblClassifica.Punteggio ORDER BY 
TblClassifica.Punteggio DESC;")
rcs.MoveLast
rcs.MoveFirst
For i = 1 To rcs.RecordCount
Set Classi = CurrentDb.OpenRecordset("SELECT TblClassifica.Classifica, 
TblClassifica.Punteggio FROM TblClassifica WHERE 
(((TblClassifica.Punteggio)=" & rcs!punteggio & "));")
Classi.MoveLast
Classi.MoveFirst
    For ii = 1 To Classi.RecordCount
    With Classi
    .Edit
    !classifica = i
    .Update
    End With
    Classi.MoveNext
    Next ii
rcs.MoveNext
Next i
rcs.Close: Set rcs = Nothing
Classi.Close: Set Classi = Nothing
End Sub
Spiegazione del codice.
Nel codice apro due recordset; con il primo (rcs) raggruppo i punteggi di 
TblClassifica in modo da avere un solo valore per ogni punteggio;
nel secondo (Classi) estraggo solo i record che hanno il punteggio di Rcs e 
solo quelli, presi uno alla volta, infatti la costruzione sql di Classi è 
fatta al volo ogni ciclo di i.
Poi uso due cicli di For; il primo cicla n volte quanti sono i record di Rcs 
(i punteggi raggruppati e presi una sola volta) e il secondo provvede ad 
assegnare la posizione in classifica uguale per ogni punteggio uguale o 
singolo.
Puoi facilmente usare questo esempio anche solo cambiando opportunamente i 
nomi dei campi o della tabella.
Fammi sapere.
Ciao, Carlo 

 Fammi sapere.
Lo sto provando, mi da' un errore di sintassi sql perche' il punteggio
e' in decimali (trova la virgola).

e' in decimali (trova la virgola).
E tu cambiala!!!!!
replace(Campo,",",".")
:-)
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

 Ciao, Carlo
Carlo l'ho provato. I problemi sono 2: i punteggi sono espressi in
millesimi es 0,485...0,473....0,321 ora per non avere errori di
sintassi sql ho dovuto sostituire la virgola con il punto e lui pero'
ha cassato anche lo zero davanti....a questo punto per alcuni punteggi
non cambia nulla..ho 485, 473 mentre per i punteggi che non avevano lo
zero finale (tipo 0,38) in realta' quello era uno 0,380 che il campo a
precisione doppia me lo faceva vedere come 0,38 ma correttamente lo
considerava 0,380. Adesso con il replace quel 0,38 e' diventato 38 e
in un ordinamento andrebbe in fondo alla classifica quando sappiamo
che non e' cosi'.
Pero' potrei sempre creare una funzione che aggiunge uno zero per
tutti i valori del campo che hanno valori a due cifre. Non so se si
puo' fare ma e' la cosa che mi preoccupa meno.
Sul merito della funzione che mi hai consigliato, funziona
raggruppando gli stessi valori in una stessa posizione ad esempio
RANK Valore
6          408
6          408
ma il valore successivo (406) dovrebbe essere in posizione 8 e
invece...e' in posizione 7...praticamente funziona a meta'.

 invece...e' in posizione 7...praticamente funziona a meta'.
Urka ci sono riuscito....prima di incrementare "i" ho messo una
condizione:
If (ii > 2) Then
   i = i + (ii - 2)
End If
Bisogna incrementare i di tanti ii togliendo pero' dal conto i due
cicli next che comunque farebbero....il tutto a condizione di trovare
piu' valori raggruppati.
Pero' tuo aiuto fondamentale, grazie.

 invece...e' in posizione 7...praticamente funziona a meta'.
Sě, questo č vero...non lo avevo proprio preso in 
considerazione...nonostante tu lo avessi detto nel primo post.
Non dovrebbe essere difficile da implementare.
Ciao, Carlo 

 invece...e' in posizione 7...praticamente funziona a meta'.
Urka ci sono riuscito....prima di incrementare "i" ho messo una
condizione:
If (ii > 2) Then
   i = i + (ii - 2)
End If
----------------------
Potrebbe essere una strada...starei attento agli ultimi due valori di i se 
ci sono valori uguali.
----------------------
Bisogna incrementare i di tanti ii togliendo pero' dal conto i due
cicli next che comunque farebbero....il tutto a condizione di trovare
piu' valori raggruppati.
Pero' tuo aiuto fondamentale, grazie.
Grazie a te per il feddback.
Ciao, Carlo

 ci sono valori uguali.
Aggiornamento...(spero che quest'algoritmo sia utile in futuro anche
ad altri) sai cosa succedeva? Che legare "i" (contatore dei gruppi di
valori) alla posizione in classifica reale faceva si' che terminato
i...la funzione non aveva piu' cosa scrivere....in una situazione come
questa...ammettiamo che i record siano 100 e che i gruppi di valori
uguali siano 40...il ciclo di i terminera' a 40 ma le posizioni in
classifica devono essere sempre 100!
A questo punto ho pensato che fosse cosa opportuna giocare su due
variabili. Quindi ho creato la var irank e che fosse questa a
incrementarsi andando d'accordo sia con il ciclo di i che con il
numero di record...ecco il codice, testato e stavolta funzionante al
100%:
irank = 1
For i = 1 To rcs.RecordCount
Set Classi = CurrentDb.OpenRecordset("SELECT
RANKING_OBP_CARRIERA.RANK,RANKING_OBP_CARRIERA.OBP FROM
RANKING_OBP_CARRIERA WHERE (((RANKING_OBP_CARRIERA.OBP)=" & rcs!OBP &
"));")
Classi.MoveLast
Classi.MoveFirst
    For ii = 1 To Classi.RecordCount
    With Classi
    .Edit
    !RANK = irank
    .Update
    End With
    Classi.MoveNext
    Next ii
rcs.MoveNext
If (ii > 2) Then
   irank = irank + (ii - 1)
Else
   irank = irank + 1
End If
Next i