Newsgroup: it.comp.appl.access
Titolo: gestire arrivi di una competizione sportiva 2

 come fare. la gara e' domenica prossima non so se ce la faro'...
-- 
eliminare il carattere _ dall'email per rispondere in privato.

 > come fare. la gara e' domenica prossima non so se ce la faro'...
Visto che hai deciso di risolvere il tuo problema con Access, per prima cosa
occorre discutere di come organizzare le tabelle del database e come
metterle in relazione fra di loro. Operare con un'unica tabella anagrafica,
come mi sembra voglia fare tu, non è certo la soluzione giusta per un
database relazionale, è più un'organizzazione consona all'uso dei un foglio
elettronico (leggi ad esempio Excel). Inoltre non potresti ricostruire a
posteriori la storia delle gare o la storia degli atleti, oppure non
potresti correggere errori commessi in fase di digitazione (al momento
dell'iscrizione o al momento dell'attribuzione dell'ordine di arrivo) senza
invalidare i punteggi precedentemente acquisiti.
La prima tabella che serve sarà sicuramente una tabella chiamata Atleti
nella quale memorizzerei  SOLAMENTE i dati anagrafici di ogni atleta e non i
punteggi o i numeri di pettorale dell'ultima gara. Insomma adotterei una
struttura del genere:
IdAtleta                Contatore e chiave primaria
Cognome              Testo
Nome                   Testo
Società                 Testo
IdCategoria          Numerico
Ecc. ecc.
Per il campo IdCategoria esegui l'Autocomposizione Ricerca... in base alla
tabella Categorie che avrà la seguente struttura:
IdCategoria        Contatore e chiave primaria
Categoria           Testo
Ci sarà poi una tabella Gare nella quale memorizzerai le notizie di ogni
gara disputata o da disputare e che potrà avere una struttura simile a
questa:
IdGara                Contatore e chiave primaria
Gara                    Testo
DataGara             Data/ora
ecc. ecc.
Naturalmente per ognuna di queste tabelle ti creerai una maschera per
l'aggiornamento dei dati, o se sei in ritardo con i piani di realizzazione
puoi aggiornare queste tre tabelle aprendole direttamente in foglio dati.
A questo punto creerei la tebella fulcro dell'applicazione che chiameremo
EsitiGare che potrebbe avere la seguente struttura:
IdEsito                Contatore e chiave primaria
IdAtleta              Numerico
IdCategoria        Numerico
IdGara                Numerico
DataIscrizione     Data/ora
Pettorale             Numerico
OrdineArrivo      Numerico
Punteggio           Numerico
In questa tabella creati un indice composto dai campi IdGara e Pettorale e
dichiaralo univoco, così che eviterai, per una gara di assegnare più di una
volta lo stesso numero di pettorale. Ti creerai anche un indice composto dai
campi IdAtleta e IdGara e lo dichiarerai univoco, così eviterai che un
atleta venga iscritto due volte alla stessa gara.
Ho aggiunto anche il campo IdCategoria, che può sembrare pleonastico, in
quanto un atleta può cambiare categoria nel corso della sua vita di atleta:
qui registrerai la categoria che l'atleta aveva al momento della gara,
mentre nell'anagrafica ci sarà l'ultima sua categoria.
Questa tabella servirà, fra l'altro a mettere la tabella Atleti e la tabella
Gare in relazione molti-a-molti (una gara disputata da più atleti, un atleta
ha disputato più gare).
Con una maschera che ha come origine record la tabella EsitiGare, ogni volta
che iscriverai un atleta ad una gara creerai un nuovo record in questa
tabella. IdAtleta lo determinerai con una scelta effettuata con una casella
combinata basata sulla tabella Atleti; IdCategoria lo ricaverai dalla
tabella Atleti con una funzione DLookup (vedi help); IdGara lo determinerai
con una scelta effettuata con una casella combinata basata sulla tabella
Gare; DataIscrizione sarà la data odierna; Pettorale lo digiterai tu; i
campi OrdineArrivo e Punteggio li imposterai a zero.
A questo punto già ti potrai creare dei report che ti danno la sensazione di
quanti e quali siano i partecipanti suddivisi per gara e categoria.
Per registrare l'ordine d'arrivo per ogni gara, una soluzione potrebbe
essere quella di crearsi una maschera basata sulla tabella EsitiGare, nel
corpo metterai solo due caselle di testo chiamate Pettorale ed OrdineArrivo
associate ai campi della tabella che hanno gli stessi nomi.
Nell'intestazione della maschera inserirai una casella combinata non
associata con la quale selezionerai la gara per la quale devi registrare gli
arrivi, ed inserirai una casella di testo non associata nella quale
digiterai il numero di pettorale; a fronte dell'evento "Dopo aggiornamento"
di quest'ultima casella di testo, con il metodo FindRecord (vedi help), ti
posizionerai sul record della tabella EsitiGare che abbia IdGara e Pettorale
uguali ai valori contenuti nei due controlli che si trovano
nell'intestazione della maschera: a questo punto digiterai l'ordine di
arrivo nella relariva casella di testo del record in cui ti sei posizionato.
A fronte dell'evento "Prima di aggiornare" della maschera verifica, con una
funzione DCount (vedi help), che non ci siano record cha abbiano, per quella
gara, un ordine di arrivo uguale a quello che hai appena digitato, nel qual
caso annulla l'evento di registrazione ( Cancel = True ).
Ora serve solamente attribuire i punti per il primo, il secondo ed il terzo
di ogni categoria per ogni gara.
A tale scopo, a fronte dell'evento "Su chiusura" della maschera con la quale
hai attribuito gli ordini di arrivo devi:
1) Aprire un recordset sulla tabella EsitiGare.
2) Scorrere tutti i record e per ognuno, tramite una funzione DCount (vedi
help) conterai quanti record sono contenuti nella tabella EsitiGare che
abbiano IdGara uguale all'IdGara del record corrente, IdCategoria uguale
all'IdCategoria del record corrente e l'OrdineArrivo minore o uguale a
quello del record corrente; cosi facendo ti sei ricavato l'ordine d'arrivo
di quell'atleta nell'ambito della sua categoria di appartenenza.
3) In base all'ordine di arrivo al livello di categoria stabilito al punto
2), determinarai il punteggio da attribuire al record corrente (se non
ricordo male 5 punti al primo, 3 punti al secondo, 1 punto al terzo e 0
punti agli altri)
4) Usando i metodi Edit ed Update del recordset (vedi help) aggiornerai il
campo Punteggio del record corrente con quanto determinato al punto 3);
dovrai aggiornare anche i punteggi 0 per correggere gli eventuali errori
commessi precedentemente.
A questo punto dalla tabella EsitiGare potrai costruirti classifiche al
livello di gara, classifiche a livello di gara e categoria, classifiche al
livello di categoria ecc. ecc.
Ti auguro buon lavoro, altrimenti per domenica non ce la fai... ;-)
-- 
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 [...]
leggero' attentamente quello che hai scritto, vista l'urgenza della gara di domenica non credo di fare in tempo a fare tutto cio'
che mi suggerisci ma lo potro' aggiornare successivamente. sono un newbye di access avro' bisogno di tempo per fare tutto a regola
d'arte come l'hai descritto.
ti descrivo come ho proceduto fino ad ora.
avevo un foglio di calcolo con i dati di tutti gli atleti che hanno partecipato alle 4 competizioni precedenti, e ho creato una
tabella da questo foglio [tabella_precedenti]
ho creato una maschera che popola un'altra tabella [quella degli iscritti alla nostra gara], in questa maschera io inserisco gli
atleti man mano che pervengono le iscrizioni e se l'atleta ha gia' partecipato alle 4 gare precedenti mi vengono aggiornati i
punteggi e i suoi dati dalla tabella_precedenti.
ho quindi creato una serie di query, una per ogni categoria ed infatti mi ritrovo con tutti gli atleti divisi per categoria. in
coclusione ho una tabella una maschera e 9 query.
ora mi leggo cio' che hai scritto e vediamo se posso continuare con cio' che ho fino ad ora, la parte che mi preoccupa e come
assegnare i punti ai primi 3 di ogni categoria.
grazie