![]() |
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 |
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? |
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 |
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 |
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 |
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-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
Dieses Thema wurde von "Sharky" von "Sonstige Fragen zu Delphi" nach "Datenbanken" verschoben.
Ich denke es passt besser in diese Sparte? |
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:
In der Config-Tabelle steht nur ein Datensatz. Dort stehen die max. Werte für die Rundenprocedure 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; 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 |
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:
Höchster Rundenanzahl pro Spiel:
SELECT Max(Punkte) Max_Punkte
,Spieler ,Spiel FROM SpielerTabelle s PunkteTabelle p WHERE s.SpielerID = p.SpielerID GROUP BY Spieler,Spiel
SQL-Code:
Wozu muss man das statisch in eine Tabelle schreiben?
SELECT Max(runde) Max_Runde
,Spiel FROM PunkteTabelle GROUP BY Spiel Wenn deine Tabellen so ähnlich aufgebaut/verknüpft sind...
.. dann müsste das funktionieren:
Delphi-Quellcode:
ich habe die Spielnummer noch hinzugefügt, sie steht vorne und
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; Ohne den Aufbau deiner Tabellen tappe ich hier ziemlich im Dunkeln :wink: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz