Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Rangnummerierung

Begonnen von KuehAla1, November 20, 2011, 22:05:59

⏪ vorheriges - nächstes ⏩

KuehAla1

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.

???

database

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?

ebs17

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;

KuehAla1

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.

KuehAla1

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

ebs17

Rangiert   ja/nein
... WHERE T.Rangiert = True ...

Das sollte miteinander harmonieren.

MfGA
ebs