Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StringGrid mit Daten aus einer Paradoxtabelle füllen (https://www.delphipraxis.net/17490-stringgrid-mit-daten-aus-einer-paradoxtabelle-fuellen.html)

rincewind 6. Mär 2004 20:24


StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Guten Abend,

ich habe ein Problem:

Aus einer Konfigurationsdatei (Paradoxtabelle) werden die Anzahl von Runden und die Anzahl der Spieler eingetragen. Von dort aus lese ich sie aus und generiere die Anzahl der Spalten und Zeilen. Dann beschrifte die Spalten mit der Anzahl der Runden( z.B.: 1 .. 10 ) und nach unten (Zeilen) mit den Anzahl der Spieler (z.B.: Spieler 1 .. Spieler 13).
So weit so gut. Das klappt. :)

Aber nun möchte ich die zweite Tabelle, in der die Ergebnisse stehen, auslesen zu den dazu gehörigen Spalten und Zeilen zuordnen.
Und das ist mein Problem.Ich komme mit meinen Versuchen auf keinen grünen Zweig. :wall:

Ich hatte mir vorgestellt, das dann, z.Bsp. zu den Spieler 2 und Runde 2 sein Ergebnis steht.

Kann mir jemand auf die Sprünge helfen???

Viele Grüße

Uwe

MrSpock 6. Mär 2004 21:31

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Hallo rincewind,

was genau klappt denn nicht? Weist du nicht, wie du die zweite Tabelle durchlaufen kannst oder willst du aus der zweiten Tabelle nur eine beschränkte Datenmenge auslesen oder weist du nicht, wie du das Stringgrid beschreiben kannst?

Plague 6. Mär 2004 22:09

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Ich glaube ich habe in den Tutorials von Delphi-Source.de etwas in der Richtig gelesen. Bin mir aber nicht ganz sicher. Kannst ja mal nachschauen...

Gruß Thomas

rincewind 7. Mär 2004 18:21

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Hallo MrSpock,

ich weiß nicht, wie ich das anstellen soll das die Daten so in die zu dem dazugehörigen Spieler und Runde ( wie in der Zeilen und Spaltenbeschriftung steht) im Grid darzustellen., wie ich die zuordnen kann. In der zweiten Tabelle stehen die Ergebnisse pro Runde und der Spieler drin, z.B.: Spieler 1 in Runde 1 35 Schläge. Und so geht das halt weiter, bezogen auf die Anzahl der Spieler + Runden, wie in der Configtabelle steht.
Im Grid soll das so aussehen:

Runde1 Runde2 Runde3 ... Runde n

Spieler 1 35 40 50 x
Spieler 2 40 35 35 x
.
.
.
Spieler n

Wie gesagt, ich weiß nicht wie ich das so hinbekomme, das die Ergebisse so drin stehen.

Viele Grüße

Uwe

rincewind 7. Mär 2004 22:50

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Hallo Plaque,

danke für den Hinweis. Habe dort geschaut, aber leider nichts gefunden. :cry:

Aber trotzdem danke für den Tipp. :-D

Viele Grüße

Uwe

Robert_G 7. Mär 2004 23:58

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Das ist jetzt ohne Delphi geschrieben worden (es werden sich also ein paar Denk-& Tippfehler eingeschlichen haben :wink: )

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;

DP-Maintenance 8. Mär 2004 05:38

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Sonstige Fragen zu Delphi" nach "Datenbanken" verschoben.
Ich denke es passt besser in diese Sparte?

rincewind 11. Mär 2004 22:37

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Hallo Robert_G,

Vielen Dank für Deine Hilfe.
Die letzten zwei Abende habe ich versucht Deinen Tipp umzusetzten. :oops:

Es haut leider nicht hin. :wall:

Anbei den Code, mit dem ich die Zeilen und Spalten schreibe:

Delphi-Quellcode:

procedure TForm1.FormActivate(Sender: TObject);
var a,b,c,d,i,g : Integer;
    verz : String;

begin


   { ConfigDB öffnen }
   {aktuelles Verzeichnis auslesen }
   verz := ExtractFilePath(ParamStr(0));
  try
    ConfigTable.DatabaseName := verz + 'DB\';
    ConfigTable.TableName := 'Config.DB';
    ConfigTable.Active := true;
  except
    MessageBeep(0);
    showmessage('Es ist ein Fehler beim öffnen der ConfigDB aufgetreten !');
  end;

  { auslesen der ConfigDB - Anzahl der Spieler }
  { Startwert Spieler = immer 1}
  a := 1;
  { Endwert Spieler aus ConfigDB }
  b := ConfigTableSpieler_bis.AsInteger;

  { auslesen der ConfigDB - Rundenbelegung }
  { Startwert Runden = immer 1 }
  c := 1;
  { Endwert Runden aus ConfigDB }
  d := ConfigTableRunden_bis.AsInteger;

  {StringGrid mit Werten füllen }
  with StringGrid1 do
  begin

    { Spaltenbreite vergrößern }
    ColWidths[0] := 100;
    { Spieler füllen }
    { Zeilen setzen }
    RowCount := (b+2);
    for i := a to b
    do Cells[0,i] := '     Spieler ' + IntToStr(i);

    { Runden füllen }
    g := ((d - c)+1);
    { Spalten setzen }
    ColCount := (g+1);
    for i := 1 to g
    do Cells[i,0] := ' Runde ' + IntToStr((c-1)+i);

  end;

end;
In der Config-Tabelle steht nur ein Datensatz. Dort stehen die max. Werte für die Runden
und für die Spieler.
In der zweiten Tabelle stehen die Daten dazu, die Spielernummer, Runde und Anzahl der Schläge.
Die Anzahl der Schläge soll jetzt in das dazugehörige Feld im Grid gebracht werden, damit es dann
so ausschaut:
Runde1 ... Runde x

Spieler 1 35 56
Spieler x 70 89

Und das bekomme ich nicht hin. :wall:

Viele Grüße

Uwe

Robert_G 12. Mär 2004 00:18

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich glaube es ist schon zu spät...
Ich versuch's trotzdem:

Das mit der Config-Tabelle kapiere ich nicht :gruebel:
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 :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz