Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#9

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 12. Mär 2004, 00:18
Ich glaube es ist schon zu spät...
Ich versuch's trotzdem:

Das mit der Config-Tabelle kapiere ich nicht
Höchster Punktestand pro Spieler pro Spiel:
SQL-Code:
SELECT Max(Punkte) Max_Punkte
      ,Spieler
      ,Spiel
FROM SpielerTabelle s
       PunkteTabelle p
WHERE s.SpielerID = p.SpielerID
GROUP BY Spieler,Spiel
Höchster Rundenanzahl pro Spiel:
SQL-Code:
SELECT Max(runde) Max_Runde
      ,Spiel
FROM PunkteTabelle
GROUP BY Spiel
Wozu muss man das statisch in eine Tabelle schreiben?

Wenn deine Tabellen so ähnlich aufgebaut/verknüpft sind...
  • PunkteTabelle:
    • Spiel
    • Runde
    • Punkte
    • SpielerID numerisch (mit ForeignKey auf SpielerTabelle.SpielerID)
  • SpielerTabelle:
    • SpielerID numerisch (PrimaryKey)
    • SpielerName

.. dann müsste das funktionieren:

Delphi-Quellcode:
Begin
  //...
  MaxRounds := 0;
  With SpielerQuery Do
  Begin
    SQL.Text :=
      'SELECT DISTINCT s.SpielerName' + #10 +
      ' ,s.SpielerID' + #10 +
      ' ,p.Spiel' + #10 +
      'FROM SpielerTabelle s' + #10 +
      ' ,PunkteTabelle p' + #10 +
      'WHERE s.SpielerID = p.Spieler' + #10 +
      'ORDER BY p.Spiel, s.SpielerName';
    // Ausführen der SpielerQuery...
    Open;
    // Laufe durch die Ergebnisse der SpielerQuery bis zum letzten Eintrag (Eof)...
    While Not Eof Do
    Begin
      // Den Spielername in der ersten Zelle neben die FixedCols eintragen...
      Grid.Cells[1, pred(Grid.FixedRows + RecNo)] :=
        FieldByName('SpielerName').asString;
      Grid.Cells[0, pred(Grid.FixedRows + RecNo)] :=
        FieldByName('Spiel').asString;
      With RundenQuery Do
      Begin
        SQL.Text :=
          'SELECT Spiel' + #10 +
          ' ,Runde' + #10 +
          ' ,Punkte' + #10 +
          'FROM PunkteTabelle' + #10 +
          'WHERE Spieler = :i_SpielerID And' + #10 +
          ' Spiel = :i_Spiel' + #10 +
          'ORDER BY Spiel, Runde';
        // Parsen des Statements um Query Parameter zu finden...
        // Spielernamen an Query Parameter übergeben...
        // Dadurch wird die Rundenquery nach dem Spieler gefiltert
        With Params Do
        Begin
          ParamByName('i_SpielerID').asString :=
            SpielerQuery.FieldByName('SpielerID').asString;
          ParamByName('i_Spiel').asString :=
            SpielerQuery.FieldByName('Spiel').asString;
        End;
        // Ausführen der RundenQuery...
        open;
        // Laufe durch die Ergebnisse der RundenQuery bis zum letzten Eintrag (Eof)...
        While Not Eof Do
        Begin
          // Das die Punkte der Runden des Spielers rechts neben den Spielernamen schreiben...
          // Voraussetzung: Das Feld "Runde" ist numerisch und beginnt bei 1
          Grid.Cells[succ(0 + FieldByName('Runde').asINteger),
            pred(Grid.FixedRows + SpielerQuery.RecNo)] :=
            FieldByName('Punkte').asString;
          // In MaxRounds soll die größte Rundenanzahl stehen. Warum siehst du weiter unten
          If FieldByName('Runde').AsInteger > MaxRounds Then
            MaxRounds := FieldByName('Runde').asInteger;
          // nächster Eintrag der RundenTabelle...
          Next;
        End;
      End;
      // nächster Eintrag der Spielertabelle...
      Next;
    End;
  End;

  With Grid Do
  Begin
    ColCount := MaxRounds + 2 + 0;
    Cells[1, 0] := 'Spieler';
    Cells[0, 0] := 'Spiel';
    // trage die Spaltennamen für die RUnden nur dann ins Grid, wenn es auch Spieler mit gespielten Runden gibt
    If MaxRounds > 0 Then
      For i := 0 To pred(MaxRounds) Do
        Cells[0 + i + 2, 0] := 'Runde ' + IntToStr(succ(i));
  End;
  //...
End;
ich habe die Spielnummer noch hinzugefügt, sie steht vorne und


Ohne den Aufbau deiner Tabellen tappe ich hier ziemlich im Dunkeln
Miniaturansicht angehängter Grafiken
rincewind001.gif  
  Mit Zitat antworten Zitat