TDBGrid daten werden mehrfach angezeigt

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Hallo,

ich benutze eine Firebird 2.5 Datenbank mit einigen Tabellen. Auf eine Tabelle greife ich über ein TDBGrid zu und bekomme die Daten mehrfach angezeigt. In der Tabelle sind jedoch definitiv nur 4 Datensätze eingetragen. Zugriff des TDBGrid's geht über ZQuery. Andere Tabellen werden korrekt angezeigt. Frage was könnte es sein?

Gruß, Luckner

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Jetzt habe ich diese Tabelle geleert und neue Datensätze eingetrage und das TDBGrid zeigt die richtige Anzahl der Datensätze an. Was geht da vor?

Luckner

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von af0815 »

Vielleicht hast du dir das mit einem missglückten Statement in der Query eingehandelt. In deinem gezeigt Code sehe ich nichts davon :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Der Code ist ganz einfach: 'SELECT * FROM STANZEN'. Mit dem selben Code greife ich auf die neuen Daten zu und die Anzahl der Datensätze stimmen.

Benutzeravatar
six1
Beiträge: 788
Registriert: Do 1. Jul 2010, 19:01

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von six1 »

gewöhne dir das erst gar nicht an, mit "*" zu selektieren...
Gruß, Michael

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Hallo Michael,

das mag in den meisten Fällen auch richtig sein, aber hier brauche ich wirklich auch alle Felder und '*' ist nicht so lang.

Gruß, Andreas

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von af0815 »

Gibt es in der Tabelle einen Primärschlüssel und ist der auf eindeutig eingestellt ? Denn ansonsten ist das nicht zu erklären.

Zum Thema "select * from" ist meine Meinung im Forum bekannt. Wenn nicht so kann man auch danach suchen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von charlytango »

Luckner hat geschrieben:
Fr 14. Apr 2023, 15:45
Frage was könnte es sein?
Etwas wenig Info für eine fundierte Antwort, daher nur Allgemeinplätze.

'SELECT *' ist eine Unart die langfristig böse Folgen haben kann. Und dann noch ohne WHERE -Klausel.

Ich schreibe und teste ein SQL-Statement fast immer zuerst außerhalb von Lazarus direkt gegen die DB. Auch scheinbar simple.
Dann weiß ich schonmal dass es funktioniert und das erwartete Ergebnis bringt.
Macht auch beim debuggen Sinn ;-)

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Hallo,
das alte Problem habe ich wieder. Ich weiß leider nicht mehr, wie ich das Problem von vor 1/2-Jahr gelöst habe (es muß irgendwie ein Zufall sein, dass es auf einmal funktionierte), jedoch habe ich in einem neuem Projekt das selbe Problem, dass einige Datensätze mehrfach ind einem TDBGrid angezeigt werden. Jetzt weiß ich, dass erst angezeigt werden, wenn ich in dem entsprechendem Dataset das Ereignis;

Code: Alles auswählen

procedure TDataModuleTT.ZQueryMannschaftGridCalcFields(DataSet: TDataSet);
begin
  ZQueryMannschaftGrid.FieldValues['NR'] := ZQueryMannschaftGrid.RecNo;
end; 
benutze. Wenn ich diese Zeile kommentiere, dann habe ich eine vernüftige Anzeige.

Gruß, Luckner

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von charlytango »

Ausgehend von deinem ersten Post in dem du ZQuery erwähnst treffe ich folgende Annahme:
Dein DB-Zugriff erfolgt mit den ZEOS Komponenten.

Mich interessiert in einem Fehlerfall auch immer das Statement das tatsächlich an die DB geschickt wird, denn das gibt Aufschluß darüber was denn schief gegangen sein könnte.

Meine Strategeie:
  • JEDE Tabelle hat einen Primärschlüssel
  • Keine SELECT * -- NIEMALS, auch nicht wenn ich mal alle Spalten brauchen sollte
  • SELECT Statements (und auch alle anderen SQL Statements) werden besonders im Fehlerfall auch außerhalb von Lazarus gegen die DB getestet.
  • Die von ZEOS bzw SQLDB erzeugten Statements werden monitiert um sie beim debuggen direkt gegen die DB testen zu können bzw zu sehen was draus geworden ist.
Das Loggen der Statements funktioniert in ZEOS und SQLDB unterschiedlich.

Mit ZEOS verwendest du eine TZSQLMonitor Komponente die du mit der TZConnection verbindest

Code: Alles auswählen

//Einstellungen für TZSQLMonitor
SQLMonitor.FileName := 'sql.log'
SQLMonitor.AutoSave := true;  
SQLMonitor.Active := true;

Bei SQLDB findest du im TSQLConnector oder in den individuellen Konnektoren das Event OnLog. Dort kannst du die Variable Msg abgreifen und zB mit Showmessage(Msg) anzeigen lassen oder besser du lässt sie dir in ein File schreiben.

Damit könntest du schon mal das SELECT präsentieren das tatsächlich abgeschickt wird.


So wie es aussieht
Luckner hat geschrieben:
Di 10. Okt 2023, 15:27
ZQueryMannschaftGrid.FieldValues['NR'] := ZQueryMannschaftGrid.RecNo;
versuchst du die Ergebnismenge in TZQuery zu manipulieren um eine Reihenfolge angezeigt zu bekommen.
Ich hab keine Ahnung ob so etwas geht, aber ich versuche solche Klimmzüge grundsätzlich zu vermeiden.
So eine Aufgabe löse ich wo es möglich ist mit dem Statement. Auch einfache Berechnungen innerhalb einer Zeile macht bei mir die jeweilige SQL engine -- dafür ist sie imho ja da.
Für Firebird guckst du hier

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Hallo charlytango,

wenn ich die OnCalcFields-Procedur um die ShowMessage-Anweisung ergänze, dann stelle ich fest, dass schon beim Anzeigen des Grid zig-mal der 1.-te Datensatz angesprochen wird und ebenfall beim scrollen des Grids taucht die ShowMessage-Anweisung immer wieder auf. Als ob nicht alle Datensätze auf einen Schlag in das Grid geladen werden, sondern, so eine Art der Synchronisation statt findet.

Code: Alles auswählen

procedure TDataModuleTT.ZQueryMannschaftGridCalcFields(DataSet: TDataSet);
begin
  ZQueryMannschaftGrid.FieldValues['NR'] := ZQueryMannschaftGrid.RecNo;
  ShowMessage ('ZQueryMannschaftGrid.RecNo = ' + IntToStr(ZQueryMannschaftGrid.RecNo));
end; 
Ich suche im Grid die Möglichkeit diese Synchronisation abzustellen. Mit Fetchall haut es auch nicht hin.

Gruß, Luckner

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von af0815 »

Luckner hat geschrieben:
Fr 13. Okt 2023, 10:36
wenn ich die OnCalcFields-Procedur um die ShowMessage-Anweisung ergänze, dann stelle ich fest, dass schon beim Anzeigen des Grid zig-mal der 1.-te Datensatz angesprochen wird und ebenfall beim scrollen des Grids taucht die ShowMessage-Anweisung immer wieder auf. Als ob nicht alle Datensätze auf einen Schlag in das Grid geladen werden, sondern, so eine Art der Synchronisation statt findet.
Dieses Fetchen macht Sinn, weil ja im Grid und den anderen visuellen Komponenten nur ein Teil der Daten angezeigt wird. Deshalb wird nur der Teil der Daten 'gefeched' der unbedingt nötig ist und die Datenbank dies zulässt.
Ein beliebter Trick ist es, vom ersten Eintrag zum Letzten zu springen, da dadurch normalerweise das
Datenset gezwungen wird alles zu laden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Hallo af0815 ,

mit last und first habe ich auch schon ausprobiert und habe festgestellt, daß sich die Gridzeilen noch mehr vermehren. Anhand von "ShowMessage"-Zeile, sehe ich, dass das Grid immer wieder auf das ZQuery zugreift. Geschiet jedoch nur, wenn die "ZQueryMannschaftGridCalcFields"-Routine aktiv ist. Ich werde mal versuchen ein anderes DBGrid einzubauen oder sogar auf ein StringGrid umzusteigen.

Gruß, Luckner

charlytango
Beiträge: 843
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von charlytango »

also nochmal -- ich versuche die Funktionen im Client, also im Grid möglichst schlank zu halten, daher kaum bis keine Cals-Fields.
Luckner hat geschrieben:
So 15. Okt 2023, 12:34
Anhand von "ShowMessage"-Zeile, sehe ich, dass das Grid immer wieder auf das ZQuery zugreift. Geschiet jedoch nur, wenn die "ZQueryMannschaftGridCalcFields"-Routine aktiv ist.
das würde mich nicht wundern ohne deinen Code auch nur ansatzweise zu kennen.
Luckner hat geschrieben:
Fr 13. Okt 2023, 10:36
ZQueryMannschaftGrid.FieldValues['NR'] := ZQueryMannschaftGrid.RecNo;
Dieses Statement setzt IMHO in jeder Zeile eine Recordnummer die erst durch Abfrage des TZQuery erzeugt werden muss. Klar wird dann in jeder Zeile das TZQuery bemüht.

Aber jetzt bin ich mal ketzerisch.... seit April beschäftigt dich das Problem und wir hatten bislang noch nicht das Vergnügen einen kompilierbares Beispielprojekt (bei Firebird wäre ich raus) zu sehen, um das Problem am lebenden Objekt zu testen.

Auch deine Absichten sind mir unklar -- scheinbar willst du die Ergebniszeilen durchnumerieren -- dazu bräuchtest du keine Calc-Fields, das könnte die DB für dich machen.

Klar löst das noch nciht das Problem mit den mehrfachen Einträgen, doch ohne Beispiel sehe ich da absolut schwarz

Luckner
Beiträge: 88
Registriert: Sa 18. Jan 2020, 09:56
OS, Lazarus, FPC: Winux (L 2.2.0 FPC 3.2.2)
CPU-Target: Windows 64-Bit

Re: TDBGrid daten werden mehrfach angezeigt

Beitrag von Luckner »

Hallo charlytango,

korrekt, seit April, nach Umstieg von Delphi auf Lazarus. Damals eine grössere Tabelle und deshalb mit 'select *'. Ich habe es irgendwie gelöst und blöderweise nicht dokumentiert. Diesmal nur eine kleine, mit nur wenigen Datensätzen und deshalb 'select ID, NAME from ...'

Code: Alles auswählen

  DataModuleTT.ZConnection1.Connect;
  DataModuleTT.ZQueryMannschaftGrid.Close;
  DataModuleTT.ZQueryMannschaftGrid.SQL.Clear;
  DataModuleTT.ZQueryMannschaftGrid.SQL.Add('select ID, NAME FROM MANNSCHAFT ORDER BY NAME');
  DataModuleTT.ZQueryMannschaftGrid.Open;
und dann zusätzlich im ZQuery ein Calcfield 'Nr' mit ensprechendem Aufruf

Code: Alles auswählen

procedure TDataModuleTT.ZQueryMannschaftGridCalcFields(DataSet: TDataSet);
begin
  ZQueryMannschaftGrid.FieldValues['NR'] := ZQueryMannschaftGrid.RecNo;
  ShowMessage ('ZQueryMannschaftGrid.RecNo = ' + IntToStr(ZQueryMannschaftGrid.RecNo));
end; 
In Delphi fast in jedem TDBGrid, ohne Probleme und habe mir nie Gedanken darüber gemacht, weils es immer funktioniert. Hier eben nicht. Werde jetzt mal rumschauen, ob Firebird da eine Möglichkeit bietet.

Gruß, Luckner

Gruß, Luckner

Antworten