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.jpg

    Ich 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


Anmelden zum Antworten