Newsgroup: it.comp.appl.access
Titolo: Calcolo di una classifica

Ho costruito un database per gestire delle gare individuali a tempo.
Ora devo scrivere una procedura per calcolare delle classifiche per ogni
categoria della gara.
Mi spiego: in una tabella (tblatleti) ho l'anagrafica degli atleti, in
un'altra (tblsocietà) ho l'anagrafica delle società di appartenenza e in una
terza (tblcategorie) ho i nomi delle categorie di atleti che partecipano
all'evento.
All'inserimento di ogni atleta è associato alla propria categoria e società
di appartenenza.
Dopo l'inserimento dei tempi devo stampare i risultati in un report.
Ho costruito una query che mi seleziona i campi con il nome dell'atleta e la
sua categoria (più ovviamente gli altri campi che mi servono).
Nella procedura che devo costruire mi serve un ciclo che mi selezioni una
per volta tutte le categorie e all'interno del ciclo mi calcoli la
classifica della categoria. Per il calcolo della classifica non c'è
problema, ma come faccio a fare in modo che il ciclo mi si ripeta
esattamente per il numero delle categorie e me ne selezioni una alla volta?
Ovviamente vorrei una routine più generale possibile in modo da non doverla
modificare ad ogni gara in base al numero di categorie.
Scusate se sono stato un po' prolisso, ma volevo essere il più chiaro
possibile.
Grazie.

 ha scritto nel messaggio
news:Wo6p7.78740$ul3.2...@news.infostrada.it...

Prova con:
Dim rstCategorie As Recordset
Set rstCategorie = CurrentDb.OpenRecordset("tblcategorie")
rstCategorie.MoveFirst
Do Until rstCategorie.EOF
    ' qui metti il tuo calcolo delle classifiche
rstCategorie.MoveNext
Loop
Set rstCategorie = Nothing
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:Gl9p7.80355$ul3.2...@news.infostrada.it...

La procedura che ho creato è la seguente:
    Dim rstCategorie As Recordset
    Dim NomeCat As String
    Dim rs As Object
    Dim lConta As Long
    Dim Pos As Integer
    Set rstCategorie = CurrentDb.OpenRecordset("tblCategorie")
    rstCategorie.MoveFirst
    Do Until rstCategorie.EOF
        NomeCat = IDCategoria
        Me.Filter = "IDCategoria = NomeCat"
        Set rs = Me.Recordset.Clone
        lConta = rs.RecordCount
        Pos = 1
        rs.MoveFirst
        Do Until lConta = 0
            Me.Bookmark = rs.Bookmark
            Me.Posizione_Categoria = Pos
            lConta = lConta - 1
            Pos = Pos + 1
            rs.MoveNext
        Loop
        rstCategorie.MoveNext
    Loop
    Set rstCategorie = Nothing
Ma sulla riga:
    Set rstCategorie = CurrentDb.OpenRecordset("tblCategorie")
mi da l'errore 'Tipo non corrispondente'.....
Tu che dici?

 ha scritto nel messaggio
news:bkrp7.1704$Q25....@news.infostrada.it...

La riga di codice
Set rstCategorie = CurrentDb.OpenRecordset("tblCategorie")
in Access97, quindi usando DAO, è corretta.
Se usi A2000 prova ad aggiungere ai riferimenti del tuo database le librerie
DAO, facendo in modo che nell'elenco dei riferimenti si trovino prima delle
librerie ADO.
Il resto del codice non l'ho controllato, visto che tu dicesti che era
funzionante.


 ha scritto nel messaggio
news:civp7.4423$Q25.1...@news.infostrada.it...

Mi interessava una tua opinione sulle istruzioni in cui filtro i record
della query:
    NomeCat = IDCategoria
    Me.Filter = "IDCategoria = NomeCat"
Devo filtrare i record della query in base alla categoria in cui è
posizionato il ciclo che mi hai costruito tu.
I due campi che ho a disposizione sono il contatore IDCategoria o Nome.


A mio avviso dovresti scrivere:
    Me.Filter = "IDCategoria =" &  IDCategoria
Però con Me.Filter filtri la maschera , mentre mi sembrerebbe più logico,
per cercare un record nel Clone del recordset della maschera usare
FinfFirst; però, come ho detto nel messaggio precedente, non mi sono
soffermato ad analizzare il resto della tua routine, visto che doveva essere
già funzionante.
Hai provato a risolvere il tuo problema ricavando il campo classifica con un
campo calcolato della tua query?
Potresti farlo con una DCount che abbia come dominio la query stessa e che
abbia dei criteri tali per cui venga effettuato il conteggio solo delle
righe che abbiano un IDCategoria uguale a quello del record corrente ed un
punteggio minore a quello del record corrente; al risultato della DCount
aggiungerai poi 1.


 aggiungerai poi 1.
Forse mi sono spiegato male nel primo post...
Quello che funziona è il ciclo per il calcolo della classifica generale,
nella quale non devo tenere presente delle categorie.
Quello, invece, in cui avevo qualche difficoltà era la selezione delle
categorie e il relativo filtraggio dei record nella query.
Ora il ciclo di selezione della categorie che mi hai dato direi che
funziona.
Quello che non riesco ancora a fare è filtrare i record in base
all'IDCategoria in cui si trova il ciclo.
Per quanto riguarda il metodo findfirst, mi andrebbe pure bene, ma nella
guida non c'è e non so qual'è la sintassi.

 ha scritto nel messaggio
news:TOJp7.7732$Q25.3...@news.infostrada.it...

Prova  a modificare il codice da te postato in questa maniera (le correzioni
sono quelle racchiuse tra le due righe di asterischi.
    Dim rstCategorie As Recordset
    Dim NomeCat As String
    Dim rs As Object
    Dim lConta As Long
    Dim Pos As Integer
    Set rstCategorie = CurrentDb.OpenRecordset("tblCategorie")
    rstCategorie.MoveFirst
    Do Until rstCategorie.EOF
   '**********************************
        NomeCat = "IDCategoria=" & rstCategorie!IDCategoria
        Me.Filter = NomeCat
        Me.FilterOn = True
        Set rs = Me.RecordsetClone
    '*********************************
        lConta = rs.RecordCount
        Pos = 1
        rs.MoveFirst
        Do Until lConta = 0
            Me.Bookmark = rs.Bookmark
            Me.Posizione_Categoria = Pos
            lConta = lConta - 1
            Pos = Pos + 1
            rs.MoveNext
        Loop
        rstCategorie.MoveNext
    Loop
    Set rstCategorie = Nothing
Attento al punto in più che avevi messo nella Set rs.
Comunque il metodo da te adottato non lo ritengo logico: la classifica viene
inserita come valore del controllo Posizione_Categoria e quindi registrata
in una tabella nel campo ad esso associato. Non ritengo mai valido
registrare un campo calcolato in una tabella. Ogni volta che cambia un solo
risultato devi ricrearti e riregistrarti la classiffica e se non lo fai hai
una classifica inesatta.
Non capisco perché non vuoi calcolare la classifica in una query o ancora
meglio non ti calcoli la posizione in classifica di ogni atleta nell'ambito
della sua categoria con una DCount posta nell'origine controllo di una
casella di testo non associata della maschera/report in cui visualizzi i
nominativi degli atleti.
