Einzelnen Beitrag anzeigen

Robert_G
(Gast)

n/a Beiträge
 
#6

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 7. Mär 2004, 23:58
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;
  Mit Zitat antworten Zitat