Hallo zusammen
Habe das gleiche Problem wie ,,light" in der Frage ,,Rangnummerirung" vom Oktober 11, 2009, 08:43:36, aber ich möchte den Rang in der Tabelle speichern und zusätzlich noch ein Kriterium setzen.
Ich benötige eine Rangnummerierung mit Bezug auf mehrere Felder und möchte noch ein Kriterium setzen.
Nachstehend die Angaben der betreffenden Felder:
Tabellenname: Scores
Link_Score_List_ID (Zahl) aufsteigend Gruppierung, gleich wie die Klasse (Damen , Herren)
Diese Felder sollten nacheinander für die Rangierung mit einbezogen werden:
Total (Zahl) absteigend
OLF (Zahl) absteigend
Drive (Zahl) absteigend
Shedding (Zahl) absteigend
Pen (Zahl) absteigend
Singling (Zahl) absteigend
Rangiert ja/nein Kriterium ist ,,ja" oder -1
Rank_Field (Zahl) Hier wird der Rang eingetragen.
Die Tabelle sollte so ausehen:
Link_Score_List_ID Total OLF Drive Shedding Pen Singling Rangiert Rank_Field 1 95 50 25 8 10 2 ja 1 1 80 40 19 9 5 7 ja 2 1 80 40 15 19 6 0 ja 3 1 80 35 20 5 10 10 ja 4 2 97 42 27 8 5 15 ja 1 2 45 17 22 6 0 0 Ja 2 |
Habe folgenden Code. Bei diesem wird ,,nur" das Feld [Total] berücksichtigt und bei gleichem Ergebnis auch die gleichen Ränge vergeben. Es werden auch alle Datensätze von der Tabelle ,,Scores" einbezogen, ohne Kriterium.
Private Sub BerRang_Click()
Dim AktTotal, MerkRank_Field, AktRank_Field, MerkLink_Score_List_ID, DB As Database, RS As Recordset
Set DB = CurrentDb()
Set RS = DB.OpenRecordset("SELECT * FROM Scores ORDER BY Link_Score_List_ID, Total DESC, OLF DESC, Drive DESC, Shedding DESC, Pen DESC, Singling DESC", dbOpenDynaset)
AktTotal = 0
Do While Not RS.EOF
If RS!Link_Score_List_ID <> MerkLink_Score_List_ID Then AktRank_Field = 0
AktRank_Field = AktRank_Field + 1
If AktTotal <> RS!Total Then MerkRank_Field = AktRank_Field
AktTotal = RS!Total
RS.Edit
RS!Rank_Field = MerkRank_Field
RS.UpDate
MerkLink_Score_List_ID = RS!Link_Score_List_ID
RS.MoveNext
Loop
RS.Close
Me.Requery
End Sub
Kann mir jemand helfen, den Code so aufzubereiten, dass dieser richtig funktioniert. Leider bin ich wegen mangelnder Kenntnisse damit überfordert.
Vielen Dank für die Hilfe.
???
Hallo,
Zitat... und möchte noch ein Kriterium setzen.
Welches?
Im Prinzip sind die Voraussetzungen für ein neues Ranking bereits durch die Sortierung gegeben.
Wie ich das sehe, sollte das Recordset nun durchlaufen und das Feld 'Rank_Field' fortlaufend aufsteigend durchnumeriert werden
(innerhalb seiner Gruppe, die durch 'Link_Score_List_ID' gekennzeichnet ist)
Sollte in 'Rangiert' nicht nur dann ein 'JA' stehen, wenn sich die Rangordnung geändert hat?
Dieser Teil kann nicht stimmen:
If RS!Link_Score_List_ID <> MerkLink_Score_List_ID Then AktRank_Field = 0
AktRank_Field = AktRank_Field + 1
Bei ungleichen Daten wird AktRank_Field auf 0 gestellt und anschließend gleich wieder um 1 erhöht ???
'AktTotal' und 'MerkLink_Score_List_ID' haben zum Startzeitpunkt des Codes (innerhalb der Schleife) noch den Initialisierungs-Wert (0)
der Vergleich kann daher beim ersten Schleifendurchlauf nicht funktionieren ???
Somit denke ich, dass ein Durchlaufen des Recordsets mit Vergabe des Rank_Field - Wertes zum gewünschten Ergebnis führen - oder sehe ich das nicht richtig?
Ich bevorzuge Abfragelösungen, so hier etwa
SELECT T.Link_Score_List_ID, T.Total, T.OLF, T.Drive, T.Shedding, T.Pen, T.Singling, (SELECT Count(*) FROM Scores AS X WHERE Format(X.Total,"000") & ";" & Format(X.OLF,"000") & ";" & Format(X.Drive,"000") & ";" & Format(X.Shedding,"000") & ";" & Format(X.Pen,"000") & ";" & Format(X.Singling,"000") > Format(T.Total,"000") & ";" & Format(T.OLF,"000") & ";" & Format(T.Drive,"000") & ";" & Format(T.Shedding,"000") & ";" & Format(T.Pen,"000") & ";" & Format(T.Singling,"000") AND X.Link_Score_List_ID = T.Link_Score_List_ID AND X.Rangiert = True)+1 AS Rank_Field
FROM Scores AS T
WHERE T.Rangiert=True
ORDER BY T.Link_Score_List_ID, T.Total DESC , T.OLF DESC , T.Drive DESC , T.Shedding DESC , T.Pen DESC , T.Singling DESC;
Hallo Access Guru
Vielen Dank erst Mal für die rasche Antwort.
Ich habe selber versucht einen vorgegebenen Code auf meine Bedürfnisse anzupassen. Leider ohne genau zu verstehen was ich gemacht habe. Deshalb sind die Fehler entstanden.
Zum Kriterium kann ich folgendes ergänzen. Der Begriff "Rangiert" verwirrt ein bisschen. Dieser Name ist aus der History entstanden. In der Tabelle Scores werden alle Teilresultate erfasst. Hat ein Teilnehmer "aufgegeben" oder ist dieser "Disqualifiziert" worden, so werden die Punkte der einzelnen Disziplinen in der Rangliste aufgeführt, erhalten aber keine Total Punkte und auch keinen Rang. Das Feld "Rangiert" ist also ein Steuerfeld, welches vor dem Erstellen der Rangliste gesetzt wird. Entsprechend müssten nur jene einen Rang erhalten, bei denen im Feld [Rangiert] "ja" eingetragen ist.
Ich habe mich noch ein bisschen informiert. Das Ganze müsste mit einer mehrfachen (6) "if"-Verschachtelung gelöst werden.
Es gibt aber ev. eine weitere Möglichkeit. Die einzelnen Resultate mit einem Faktor zu multiplizieren. Das erste Feld [Total] mit dem höchsten Faktor und das letzte Feld [Singling] mit dem kleinsten Faktor. Die Summe dieser Felder kann schlussendlich absteigend sortiert werden. In Bezug auf die diese Summe kann der "einfache" Code für die Rangnummerierung verwendet werden.
Ich werde die Variante mit den Summen testen. Falls ich nicht weiter komme, werde ich mich gerne wieder melden.
Hallo ebs17
Deine Lösung funktioniert!
Bräuchte nur noch die Einschränkung, dass nur die Datensätze mit Rangiert = ja einen Rang erhalten.
Habe versucht die Resultate von (Deiner) Abfrage mittels einer Aktualisierungsabfrage direkt in die Tabelle Score zu übernehmen. Das hat leider einen Fehler verursacht. Der Umweg über das erstellen einer Zwischentabelle hat schlussendlich aber funktioniert, und dabei könnte ich auch das Kriterium Rangiert = ja einbringen.
Vielen Dank
Rangiert ja/nein
... WHERE T.Rangiert = True ...
Das sollte miteinander harmonieren.
MfGA
ebs