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