Ranglijst bepalen van wedstrijd

Status
Niet open voor verdere reacties.

allard1977

Gebruiker
Lid geworden
7 feb 2011
Berichten
215
Beste,

Ik heb een honden wedstrijd database Nu krijgen de honden een score en tijd. Wie de meeste punten heeft heeft gewonnen maar als er gelijk spel is heeft de snelste gewonnen. hoe kan ik dit oplossen.

Heb al een paar ideeën gekregen maar werken nog niet op mijn database.
https://support.office.com/nl-nl/article/Tellen-in-rapporten-489791e0-dee2-46dd-8a72-f835998bd72e
en dan 'Een regelnummer toevoegen voor elke record in een rapport of groep'

En een SQL methode maar daar krijg ik een fout melding.
Code:
SELECT a.RallyKlasnaam, a.Exhibitor, a.Rallydognr, a.Score, a.Time, Round(CDbl(a.[Score]+(1-a.[Time])),5) AS Points, Count(*) AS Rank
FROM TBL08_Rally AS a INNER JOIN TBL08_Rally AS b ON (a.RallyKlasnaam = b.RallyKlasnaam) AND (Round(CDbl(a.[Score]+(1-a.[Time])),5)<=Round(CDbl(b.[Score]+(1-b.[Time])),5))
GROUP BY a.RallyKlasnaam, a.Exhibitor, a.Rallydognr, a.Score, a.Time
HAVING (((a.RallyKlasnaam)=[Forms]![RallyForm]![LevelMoveup]))
ORDER BY a.RallyKlasnaam, a.Score;
De melding die ik krijg Invalid use of null.
Maar ik zou graag de RallyKlasnaam en datum willen beplalen via een formulier.

Wie kan me veder helpen.
 
Laatst bewerkt:
Doe er een voorbeeldbestandje bij, want dit is zonder data niet uit het hoofd op te lossen. Niet door mij althans :).
 
Beste Octafish,

De SQL code heb ik eens van u gehad. Ik ben er achter gekomen waarom ik de null error krijg. De tabel die ik nu gebruik is niet volledig in gevuld. Dus ik heb een maak tabel stap er tussen gedaan. Nu kan ik precies selecteren waar ik een uitslag van zou willen hebben.
Met de code wordt the rank bepaald. Maar hoe kan ik de rank nu vast leggen in een andere tabel. Ik moet namelijk aan het een overzicht lijst maken met alle honden die een sore boven de 170 hebben met hun rank erbij.

MVG Allard
Alvast heel erg bedankt.
 
De tabel die ik nu gebruik is niet volledig in gevuld. Dus ik heb een maak tabel stap er tussen gedaan.
Dat zou niet nodig hoeven te zijn als je de query filtert op niet-lege waarden. Dat zijn sowieso deelnemers zonder uitslag, dus die horen ook niet thuis in een ranglijst. Of, als je ze toch in de query wilt hebben, kun je de lege (Null) waarde vervangen door een cijfer zodat de ranking gewoon doorloopt. De oplossing van een extra tabel zou ik in ieder geval (zo vele mogelijk) vermijden.

Maar hoe kan ik de rank nu vast leggen in een andere tabel.
Waarom zou je dat doen? Afleidbare gegevens (en de ranking is er daar één van) sla je doorgaans niet op in een tabel. Stel dat er nog correcties op de uitslag komen; dan pas je die aan in de uitslagentabel en je query laat dan gelijk de aangepaste uitslag zien. Heb je de waarden hard opgeslagen in een tabel, en pas je die dan niet (goed) aan, dan heb je afwijkende gegevens in je database. Moet je echt willen voorkomen! Bovendien: als je een overzicht moet maken doe je dat vermoed ik via een rapport, en als je daar een pdf van maakt, of anderszins een fysieke afdruk, heb je de gegevens óók om te distribueren.

Mensen willen graag alles opslaan in de database, omdat ze de db niet vertrouwen :).
 
Beste OctaFish,
De tabel met lege waarden is mijn hoofd tabel. We hebben meer als 10 verschillenden niveau's. Ik wil dus een uitslag maken zodra er nivesu afgelopen is. In mijn hoofd tabel krijg ik dus Het null probleem. Daarom heb ik hem met een zoek op dracht op een formulier gemaakt.

Waarom ik het vast wil leggen heeft niets te maken met betrouwbaarheid. Vanuit de overkoepelende organisatie heb ik een verpicht formulier die op vaste manier moet in gevuld worden. en daar kan ik niet mee spelen. daarom wil ik graag de raning vast leggen. En dee ranking moet is dus per niveau vershillen en krijg je vaker plaats 1 t/m ... op delijst te staan.

Groet Allard
 
Ik ging er ook van uit dat de null-waarden in de hoofdtabel staan. Vandaar ook de tip om je query te filteren op niet-lege waarden. Null-waarden filter je er namelijk heel simpel uit. Als je de ranking in een query hebt, zie je hem ook op het formulier, dus ik snap het probleem nog steeds niet. Noch de noodzaak om het vast te leggen :). Daarnaast (want het kán uiteraard prima, mocht je het toch willen) moet ik weten hoe je die ranking dan wilt gaan vastleggen. Op basis van individuele records, of een (al dan niet berekende) query? Maakt nogal wat uit!

Nieuwe tip:
Je kunt dat op getalvelden omzeilen door als standaardwaarde het getal 0 te gebruiken, en bij tekstvelden kun je de eigenschap <Lengte nul toestaan> op <Nee> zetten. Dat lost overigens bestaande records niet op, maar dat kan met een bijwerkquery.
En ik bedoelde ook niet te zeggen dat je de de db niet vertrouwt; ik kom dat desalniettemin vaak tegen als argument om de berekeningen op te slaan. :)
 
https://www.dropbox.com/s/2xx4q3bnfj4b81r/STAPPAdmin29-4-16.accdb?dl=0

hier is een link naar mijn database.
Weet alleen niet al u er wat mee kan ivm dat je registratie nr moet hebben
maar misschien kunnen we stap voor stap er door lopen
als u naar het navigatie scherm gaat en daar naar algemeen F dan naar Rallyform.
Dan gaat het om knop Results list **/*** hier wordt door middel van de SQL de ranking bepaald. SQLRanking staat onder Rally scoring/Results.

Maar het vaste formulier is Rally Trail Report **/*** hier moeten van het hoogste niveau naar het laagste niveau punten en ranking komen achterelkaar door.

hoop dat we er zo uit komen :)
 
Ik zal er vanavond naar kijken! Krijg nu problemen op het werk met het downloaden van de db.
 
Te lang op het balkon gezeten met een koele klats onder handbereik :). Vanavond een nieuwe poging!
 
als u naar het navigatie scherm gaat en daar naar algemeen F dan naar Rallyform.
Dan gaat het om knop Results list **/*** hier wordt door middel van de SQL de ranking bepaald. SQLRanking staat onder Rally scoring/Results.
Ik zal wel teveel op hebben, maar ik zie al die formulieren niet... Wél een formulier RallyForm (staat op je hoofdformulier) maar daar staat dan weer geen knop <Results list> op. Ik schenk nog maar een keer bij...
 
Staat er op het hoofdformulier trail version zo ja dan kunt u daarniet veder.
U kunt het beste werken via het navigatiedeelvenster.
In het navigatiedeelvenster gaat u naar Algemeen F en daar naar Rally Form en deze openen.
op ht Rally form staat Results List**/***.
 
Nog een ander vraagje over de sql code. Als er gelijkstand stand is wordt het de nummering niet helemaal goed gedaan. Bv je hebt plaats 1,2 en 3 maar plaats 4 zijn twee honden met gelijke score en tijd. Maar nu krijgen ze plaats 5 en dan is er geen plaats 4. Maar ik zou graag dan plaats vier willen en geen 5. Hoop dat iemand iets weet.
 
Zo na veel uitzoeken en schrijven is dit het geworden

Code:
Function Serialize(qryName As String, _
                   keyname As String, _
                   keyvalue, _
                   Optional increment As Integer = 1, _
                   Optional interval As Integer, _
                   Optional resetgroup As String) As Long
                   
    Dim dbs As DAO.Database
    Dim rs As DAO.Recordset
    Dim tmpGroup
    
    Set dbs = CurrentDb
    On Error GoTo Err_Serialize
    Set rs = dbs.OpenRecordset(qryName, dbOpenDynaset, dbReadOnly)
    On Error GoTo Err_Serialize

    'Find the current record.
    Select Case rs.Fields(keyname).Type
        ' Find using numeric data type key value?
        Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
        DB_DOUBLE, DB_BYTE
            rs.FindFirst "[" & keyname & "] = " & keyvalue
        ' Find using date data type key value?
        Case DB_DATE
            rs.FindFirst "[" & keyname & "] = #" & keyvalue & "#"
        ' Find using text data type key value?
        Case DB_TEXT
            rs.FindFirst "[" & keyname & "] = '" & keyvalue & "'"
        Case Else
            MsgBox "ERROR: Invalid key field data type!"
    End Select
         
    ' Check for [resetgroup] option
    If Nz(resetgroup) = "" Then
        ' Assign number based on Absolute Position
        Serialize = (Nz(rs.AbsolutePosition, 0) + 1) * increment
    Else
        ' Assign number based on [resetgroup]
        Serialize = 1
        tmpGroup = rs(resetgroup)
        Do
            rs.MovePrevious
            If rs.BOF Then Exit Do
            If rs(resetgroup) <> tmpGroup Then Exit Do
            Serialize = Serialize + 1
        Loop
    End If
    
    ' Apply [interval]
    If interval <> 0 Then
        Serialize = ((Serialize - 1) - (Int((Serialize - 1) / interval) * interval)) + 1
    End If

Err_Serialize:
        'Add your own Error handler
        rs.Close
        dbs.Close
        Set rs = Nothing
        Set dbs = Nothing

End Function
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan