![]() |
Datenbank: mariadb • Version: ??? • Zugriff über: mydac
Problem mit myQuery
hallo, versuche mit myQuery1 u. myQuery2 zu prüfen, ob die Anzahl der Datensätze ungleich sind.
Code:
hier mein Timer:
Code: myQuery 1 und 2
SELECT ts_number.id FROM ts_number WHERE ts_number.id = 2
Code:
das Ergebnis im Memo1 sieht so aus:
procedure TForm1.RefreshTimer(Sender: TObject);
var zahl1, zahl2 : Integer; begin MyQuery1.Refresh; zahl1 := MyQuery1.RecordCount; if zahl1 <> zahl2 then begin MyQuery2.Refresh; zahl2 := MyQuery2.RecordCount; Memo1.Lines.Add ('Status: ' + datetostr(date) + ' | ' + timetostr(time) + Format(' : Refresh Query RecordCount: %d',[MyQuery2.RecordCount])); end; end; Server 1.0 Status: 28.10.2022 | 11:00:29 : Server MySQL gestartet Status: 28.10.2022 | 11:00:29 : Anzahl Datensätze: 555 Status: 28.10.2022 | 11:00:35 : Refresh Query RecordCount: 555 Status: 28.10.2022 | 11:01:23 : Refresh Query RecordCount: 555 Status: 28.10.2022 | 11:01:29 : Refresh Query RecordCount: 555 Status: 28.10.2022 | 11:01:35 : Refresh Query RecordCount: 555 Status: 28.10.2022 | 11:01:41 : Refresh Query RecordCount: 556 Status: 28.10.2022 | 11:01:53 : Refresh Query RecordCount: 556 Status: 28.10.2022 | 11:02:11 : Refresh Query RecordCount: 556 Status: 28.10.2022 | 11:02:14 : Server MySQL gestoppt Warum wird die Anzahl der Datensätze nicht sofort geändert ? Timer steht auf 6 Sekunden |
AW: Problem mit myQuery
Warum hörst du nicht auf das, was dir dein Compiler bestimmt zu sagen versucht?
Zitat:
und da lokale Variablen nicht (alle) automatisch initialisiert werden, steht darin ein Zufallswert. Außerdem, du willst nur sie Anzahl wissen, aber lädst gleich alles runter? Ein bisschen unnötig viel Traffic und Speicher. :angle:
SQL-Code:
SELECT count(ts_number.id) FROM ts_number WHERE ts_number.id = 2
Delphi-Quellcode:
bzw.
MyQuery2.FieldByName('count').AsInteger
Delphi-Quellcode:
MyQuery2.Fields[0].AsInteger
|
AW: Problem mit myQuery
Liste der Anhänge anzeigen (Anzahl: 1)
guten morgen,
habe eine query(count), wie frage ich jetzt die Anzahl der Datensätze ab?
Delphi-Quellcode:
procedure TForm1.pruefenTimer(Sender: TObject);
var anzahl: integer; begin anzahl:= count.FieldByName('id').AsInteger; // das ist falsch Label2.Caption := 'Anzahl Datensätze : '+ InttoStr(anzahl); end; |
AW: Problem mit myQuery
ach ja,
habe nicht alles gelesen :-) hiermit geht es :
Delphi-Quellcode:
MyQuery2.Fields[0].AsInteger;
|
AW: Problem mit myQuery
wird trotzdem nur einmal ausgelesen (timer) ?
Delphi-Quellcode:
procedure TForm1.pruefenTimer(Sender: TObject);
var anzahl: integer; begin if anzahl <> count.Fields[0].AsInteger then begin anzahl:= count.Fields[0].AsInteger; Label2.Caption := 'Anzahl Datensätze : '+ InttoStr(anzahl); end end; |
AW: Problem mit myQuery
Wo führst Du denn Deine Query aus? Im Timer ja augenscheinlich nicht, wie soll man da also Änderungen mitbekommen?
|
AW: Problem mit myQuery
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Delphi-Quellcode:
count ist meine Query
if anzahl <> count.Fields[0].AsInteger then
|
AW: Problem mit myQuery
Schön. Die wird einmal ausgeführt und enthält dann die Anzahl der Datensätze zum Zeitpunkt der Ausführung. Solange Du sie nicht erneut ausführst, wird sich diese Anzahl aber niemals ändern.
|
AW: Problem mit myQuery
Zitat:
|
AW: Problem mit myQuery
"anzahl" ist lokal deklariert. Der Vergleich (if) wird also immer mit einer nicht initialisierten Variablen gemacht. Der Vergleich wird daher eher zufällige Ergebnisse liefern und dein Label auch nur zufällig aktualisiert.
|
AW: Problem mit myQuery
Zitat:
|
AW: Problem mit myQuery
Wobei das ja eigentlich der Compiler dir auch gesagt haben müsste, vonwegen "nicht-initialisierte Variable".
Und natürlich das fehlende
Delphi-Quellcode:
im Timer, falls es nicht woanders schon gemacht wird.
count.Refresh;
Wobei, würde es woanders gemacht, wozu dann der Timer und nicht direkt dort auf die Änderung prüfen? |
AW: Problem mit myQuery
hier mein Lösungsweg:
Delphi-Quellcode:
procedure TForm1.pruefenTimer(Sender: TObject);
var anzahl, i: integer; s: String; begin count.Refresh; anzahl:= count.Fields[0].AsInteger; if anzahl <> i then begin i := anzahl; Label2.Caption := 'Anzahl Datensätze : '+ InttoStr(i); end end; oder kann man es noch etwas eleganter lösen? mein Ziel ist es (noch nicht fertig) das DBGrid wirklich nur zu aktualisieren wenn neue Daten dazugekommen sind. |
AW: Problem mit myQuery
Zitat:
|
AW: Problem mit myQuery
i ist als lokale Variable immer noch nicht initialisiert, das kann nicht funktionieren. Wurde aber auch schon mehrfach gesagt. Speicher Dir die zuletzt gelesene Anzahl in einem privaten Feld oder zur Not in einer globalen Variablen.
|
AW: Problem mit myQuery
Zitat:
Delphi-Quellcode:
var
Form1: TForm1; zahl: integer = 0;
Delphi-Quellcode:
procedure TForm1.pruefenTimer(Sender: TObject);
var anzahl: integer; s: String; begin count.Refresh; anzahl:= count.Fields[0].AsInteger; if anzahl <> zahl then begin zahl := anzahl; Label2.Caption := 'Anzahl Datensätze : '+ InttoStr(zahl); end end; |
AW: Problem mit myQuery
Um dir gleich die Verwendung globaler Variablen abzugewöhnen, bevor du dir solch schlimmen Dinge noch angeöhnst.
DAS ist ja eine Variable, welche innerhalb von Form1 und dessen Methoden verwendet wird, also sollte sie besser auch dort rein.
Delphi-Quellcode:
Und globale Variablen und Felder in Ojekten/Klassen sind per Default mit 0 initialisiert.
type
TForm1 = class(TForm) ... private zahl: integer; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:35 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-2025 by Thomas Breitkreuz