Das ist jetzt
ohne Delphi geschrieben worden (es werden sich also ein paar Denk-& Tippfehler eingeschlichen haben
)
Im Endeffekt wird eine Abfrage auf die Spielertabelle gemacht. Für jeden Spieler wird eine Abfrage auf die Rundentabelle gemacht.
Benötigt werden:
- Delphi:
- Grid -> dein StringGrid
- SpielerQuery, RundenQuery -> TQuery
- DB:
- SpielerTabelle, RundenTabelle müssen umbenannt werden, um deinen Tabellennamen zu entsprechen
- Ich nahm an, dass:
- SpielerName ein Stringfeld ist
- Runde numerisch ist
- SpielerTabelle & Rundentablle über den Spielernamen verknüpft sind
Delphi-Quellcode:
Var
i, MaxRounds :Integer;
Begin
//...
MaxRounds := 0;
With SpielerQuery
Do
Begin
SQL.Text :=
'
SELECT SpielerName' + #10 +
'
FROM SpielerTabelle' + #10 +
'
ORDER BY 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[Grid.FixedCols,pred(Grid.FixedRows+RecNo)] := FieldByName('
SpielerName').AsString;
With RundenQuery
Do
Begin
SQL.Text :=
'
SELECT Runde' + #10 +
'
,Punkte' + #10 +
'
FROM PunkteTabelle' + #10 +
'
WHERE SpielerName = :i_SpielerName' + #10 +
'
ORDER BY Runde';
// Parsen des Statements um Query Parameter zu finden...
Prepared := True;
// Spielernamen an Query Parameter übergeben...
// Dadurch wird die Rundenquery nach dem Spieler gefiltert
Params.ParamByName('
i_SpielerName').AsString := SpielerQuery.FieldByName('
SpielerName').AsString;
// 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[Grid.FixedCols+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
Cells[FixedCols, 0] := '
Spieler';
-- 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[FixedCols+i, 0] := '
Runde ' + IntToStr(succ(i));
End;
//...
End;