12. juni 2007 - 17:22Der er
42 kommentarer og 1 løsning
Tilføj positioner
Hejsa alle.
ang. resultatsystem
Jeg har et lille problem og det kan ikke passe at den løsning jeg har i tankerne er den rigtige...
Jeg har en masse hold, som er opdelt i grupper. Hvert hold har selvfølgelig et ID der tilhører den gruppe de er placeret i. Når alle hold har fået alle resultater tastet ind, skal der skrives positioner på holdene ned i en ny tabel. Altså hvis et hold vinder sin pulje skal dette hold tilføjes med puljenummeret, samt position 1 til den nye tabel, og nummer 2 med position 2 osv. Jeg har i alt 35 puljer og det kan vel ikke passe jeg skal oprette en forespørgsel til hver eneste gruppe?
Det kan vist løses meget nemmere. Skal det gøres hver gang et hold vinder eller på en gang for alle eller hvordan? Hvordan ser din tabeller ud? Det kan i hvert også løses med en funktion, der udfører det.
Jesper: Den skal bare køres hver gang der er tastet resultater ind, så jeg får positionerne. Jeg har en tabel med totalscore for alle holdene. Disse hold er tilknyttet et "PoolID", som er den pulje de spiller i. Jeg har altså samlet resultater for ALLE hold fra alle puljer i samme tabel. Her skal der så positioner på, alt efter hvilken placering de har fået i deres pulje
Der er jo kun den ene tabel der skal bruges, og som det skal laves ud fra. G1, G2 etc. Står for Game 1, Game 2 etc. Der spilles 6 Games + et handicap (hcp), som så ender i en totalscore. Det eneste relevante felt her er totalen
Der ligger i den nye 4 hold med PoolID 101 og 4 hold med PoolID 102. Der er så her jeg gerne vil have, at der skal dannes en position udfra totalfeltet, og hvor den giver position 1-4 ved de hold der er i PoolID 101 og positioner for dem i PoolID 102
SELECT tblTeamResults.PoolID, tblTeamResults.Total, tblTeamResults.TeamID, (Select count([Total]) from tblTeamResults AS T1 WHERE tblTeamResults.Total < T1.Total)+1 AS Placering FROM tblTeamResults WHERE (((tblTeamResults.PoolID)=101)) ORDER BY tblTeamResults.Total DESC; UNION SELECT tblTeamResults.PoolID, tblTeamResults.Total, tblTeamResults.TeamID, (Select count([Total]) from tblTeamResults AS T1 WHERE tblTeamResults.Total < T1.Total)-3 AS Placering FROM tblTeamResults WHERE (((tblTeamResults.PoolID)=102)) ORDER BY tblTeamResults.Total DESC;
Dette var lige hvad jeg havde i ærmet ... kan du selv gennemskue den ...
Jah, men har jo pænt mange forskellige poolID. Dette var kun et lille udvalg. Det skal helst være sådan, så jeg ikke skal ind og definere allesammen i koden, men at den blot selv skiller dem ad udfra nummeret
Hej Jensen363, ja det er sørme længe siden. Jeg venter stadig på at blive headhunted til PostDK :-) (var det ikke der du var?). Det er pjat, men jeg har været lidt væk herfra en periode.
Hoebjerg > Jeg har hentet den nye fil. Har jeg forstået det rigtigt at holdene skal rangordnes indenfor hver poolID? Altså således at alle med poolID=101 først skal behandles og rangordnes. Hvor skal deres position skrives? I en ny tabel?
f.eks.
tabel: tblPositioner PoolID (long) Position (long)
Jeg går ud fra at der senere kommer mange forskellige poolID'er?
Hvad så når der senere rettes i tabellen - skal indholdet af tblPositioner så slettes og indskrives en gang til i tabellen? Jeg tror snildt det kan lave med en funktion, der løber resultattabellen igennem.
Hej Jesper. Ja, det har du forstået korrekt :-) Og ja, der kommer en del forskellig poolID. Det ville være helt fint at der blot oprettes et positionsfelt til den i en ny tabel, eller bare i en forespørgsel.
Ok, jeg går ud fra at du har referencer til DAO 3.5 eller 3.6 i din database (standard i A2003 ikke i A2002).
Jeg har oprettet denne tabel: tblPositioner poolID (long) teamID (long) position (long)
og gjort kombination af alle felter til primær nøgle, så der ikke kan forekommer dubletter.
Jeg har lavet det, så indholdet af tblPositioner slettes til at starten i nedenstående funktion, måske vil du det anderledes, eller måske sletter du det andetsteds fra.
Denne funktion kan køres f.eks. fra en kommandknap eller lignende:
'Gennemløber tblTeamResults og for hver poolID rangordnes holdene og 'stillingen indskrives i tblPositioner så holdet flest point får nr. 1, næstflest får nr. 2 osv.
Dim db As DAO.Database Dim rs As DAO.Recordset Dim i As Long Dim poolID As Long
Set db = CurrentDb
'sletter indhold af tblPositioner db.Execute "DELETE * FROM tblPositioner", dbFailOnError
Set rs = db.OpenRecordset("SELECT poolID,teamID,total FROM tblTeamResults ORDER BY poolID,total DESC") 'i = 1 BeginTrans 'kan undlades men øger hastighed og sikkerhed Do While Not rs.EOF
If poolID <> rs!poolID Then i = 1 End If db.Execute "INSERT INTO tblPositioner (poolID,teamID,position) VALUES (" & rs!poolID & "," & rs!teamID & "," & i & ")", dbFailOnError poolID = rs!poolID i = i + 1 rs.MoveNext Loop CommitTrans 'kan undlades men øger hastighed og sikkerhed
Hov, forresten. Holdene kan jo stå lige. Kan det rimelig nemt bygges ind i, at hvis 2 hold står lige skal den så sortere efter total, og derefter et felt som vi kalder "Tie"?
Hvad skal der indskrives i feltet "position" hvis to hold er lige? Skal de dele f.eks. en 3. plads, så placeringerne i en pool ville blive 1,2,3,3,5,6 osv
Sorteringen kan laves når du vil have dataene vist tænker jeg. Hvad skal der evt. være i felt kaldet "tie" ?
Nej, i det her tilfælde skal positionerne stadig hedde 1,2,3,4,5 osv. I feltet tie, vil der bare være et tal, så hvis du kan sætte den til at sortere efter total (faldende) og derefter Tie (Faldende).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.