AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi StringGrid mit Daten aus einer Paradoxtabelle füllen
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid mit Daten aus einer Paradoxtabelle füllen

Ein Thema von rincewind · begonnen am 6. Mär 2004 · letzter Beitrag vom 12. Mär 2004
Antwort Antwort
rincewind

Registriert seit: 4. Mär 2004
6 Beiträge
 
#1

StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 6. Mär 2004, 20:24
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 6. Mär 2004, 21:31
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?
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Plague

Registriert seit: 6. Okt 2003
591 Beiträge
 
#3

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 6. Mär 2004, 22:09
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
  Mit Zitat antworten Zitat
rincewind

Registriert seit: 4. Mär 2004
6 Beiträge
 
#4

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 7. Mär 2004, 18:21
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
  Mit Zitat antworten Zitat
rincewind

Registriert seit: 4. Mär 2004
6 Beiträge
 
#5

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 7. Mär 2004, 22:50
Hallo Plaque,

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

Aber trotzdem danke für den Tipp.

Viele Grüße

Uwe
  Mit Zitat antworten Zitat
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
8. Mär 2004, 05:38
Dieses Thema wurde von "Sharky" von "Sonstige Fragen zu Delphi" nach "Datenbanken" verschoben.
Ich denke es passt besser in diese Sparte?
rincewind

Registriert seit: 4. Mär 2004
6 Beiträge
 
#8

Re: StringGrid mit Daten aus einer Paradoxtabelle füllen

  Alt 11. Mär 2004, 22:37
Hallo Robert_G,

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

Es haut leider nicht hin.

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.

Viele Grüße

Uwe
  Mit Zitat antworten Zitat
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 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