Platzierung berechnen (Sportauswertung)
-
Hi@all
Ich benötige ein bischen Hilfe für eine Auswertungsberechnung.
Aufgabe: Ich habe eine Tabelle mit mehreren Werten und möchte nun die Reihenfolge berechnen. (Sportwettkampf)
|Name|W1|W2|W3|W4|W5|W6|W7|Punke|Platz|Min|Max|Gesamt|+|-|
In W1-W7 werden Einzelpunkte eingegeben.
MIN/MAX sind jeweils die MIN/Max Werte von W1-W7
Gesamt errechnen sich aus W1-W7.
Punkte errechnen sich aus W1-W7 abzüglich Min und Max.Jetzt soll anhand der Punkte eine Platzierung ermittelt werden.
Ich sortiere also die Tabelle nach Punkten und vergebe so Platzierungen.
Höchste Punktzahl = Höchste Platzierung usw.Problem: Wenn Punktgleichheit, soll bei den Punktgleichen die Gesamtsumme aller Punkte verglichen werden und die Platzierung entsprechend angepasst werden = höhere Gesamtwertung dann höherer Platz auf Basis des Platzes von Summe.
Dafür soll ein +/- in einer zusätzliche Spalte abgelegt werden.
Wenn immernoch Punktgleichheit nach Gesamtpunkten dann gleicher Platz und Nachfolgeplatz wird gestrichen.Ich hoffe das war verständlich.
Zur verdeutlichung habe ich folgende Tabelle mal als Beispiel:
http://www.concepts-multimedia.de/beispiel.jpgIch arbeite mit BCB - ADO Komponenten (Connection/Table) - DBGrid.
Wie gesagt, bis zur Berechnung der Punkte funktioniert alles.
Ich brauche nur noch die ordentliche Platzierungsberechnung.
Hier mal mein erster Ansatz.void Platzierung(TObject *Sender, int lastData) { if(TADOTable* Table = dynamic_cast<TADOTable*>(Sender)) { // aktuellen Datensatz ermitteln lastData = Table->RecNo; // Tabelle nach Punkten sortieren Table->Sort = "Punkte DESC"; //Platz eintragen int platz = 0; int wertvorher = 1000; int gesamtvorher = 1000; // Anzahl der Zeilen auslesen int count = Table->RecordCount; // Auf erste Zeile setzen Table->First(); // Alle Zeilen durchlaufen for (int i=1; i<count; i++) { // Beginnen bei der ersten Table->RecNo = i; Table->Edit(); Table->FieldByName("Platz")->Clear(); // Punktzahle einlesen int wert = Table->FieldByName("Punkte")->AsInteger; // Gesamtpunktzahl einlesen int gesamt = Table->FieldByName("Gesamt")->AsInteger; // wenn Punktzahl != 0 if (wert != NULL && wert != 0) { // Wenn Punktzahl gleich vorheriger Punktzahl if (wert == wertvorher) { // Gesamtwerte vergleichen // Wenn Gesamt und vorheriger Gesamtwert gleich = gleicher Platz, Platzzahl um eins erhöhen if (gesamt == gesamtvorher) { Table->FieldByName("Platz")->Value = platz; platz++;} // wenn Gesamt größer als vorheriger Gesamtwert if (gesamt > gesamtvorher) { // bekommt dieser den aktuellen Platz Table->FieldByName("Platz")->Value = platz; // und der vorherige den nächst hörheren Platz platz++; Table->RecNo = i-1; Table->FieldByName("Platz")->Value = platz; Table->RecNo = i; } // wenn Gesamt niedriger als vorheriger if (gesamt < gesamtvorher) { // bekommt dier den nächst höheren Platz platz++; Table->FieldByName("Platz")->Value = platz; } } // wenn keine gleiche Punktzahl dann nächst höherer Platz else { platz++; Table->FieldByName("Platz")->Value = platz; } } // Die aktuellen Werte als Vorherwerte merken wertvorher = wert; gesamtvorher = gesamt; // Tabelle speichern Table->Post(); } // Wenn aAlle Zeilen durchlaufen sind Tabelle neu laden wegen der Ausgangssortierung Table->Close(); Table->Open(); //DBGrid1->Refresh(); //letzten Datensatz anzeigen Table->RecNo = lastData; } } // Ende Platzierung berechnen
Was halt noch nicht klar ist, Platzierung bei mehrerer Punktgleichheit unter Berücksichtigung oben beschriebener Kriterien.
Ausserdem bekomme ich ständig verschiedene Fehlermeldungen wie:
--------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Turnier.exe ist eine Exception der Klasse EOleException mit der Meldung 'Die Schlüsselspalteninformationen sind ungenügend oder inkorrekt. Es sind zu viele Zeilen von der Aktualisierung betroffen' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe ---------------------------
und
Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Turnier.exe ist eine Exception der Klasse EOleException mit der Meldung 'Überlauf bei numerischem Feld' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe ---------------------------
sowie
--------------------------- Benachrichtigung über Debugger-Exception --------------------------- Im Projekt Turnier.exe ist eine Exception der Klasse EOleException mit der Meldung ''(Ausdruck)' kann nicht aktualisiert werden; Feld nicht aktualisierbar' aufgetreten. --------------------------- Anhalten Fortsetzen Hilfe ---------------------------
Vielen Dank für eine Hilfe.
Thx@all