Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Count und RecordCount liefert "-1" (https://www.delphipraxis.net/17310-count-und-recordcount-liefert-1-a.html)

Zigster 3. Mär 2004 08:24


Count und RecordCount liefert "-1"
 
Hallo allerseits,

habe da unter Delphi ein Problem, dass das Zählen von Datensätzen aus einem SQL-Query betrifft.

ich lasse mir über ein SQL-Query eine bestimmte Datenmenge auf einem DBGrid anzeigen (Suchfunktion). Die Anzahl der Ergebnisse soll in einem Label angezeigt werden.

Das Problem ist, dass sowohl count als auch recordcount einen falschen Wert (nämlich -1) im Label anzeigt, sobald die Anzahl der Treffer grösser 9 ist. Solange die Anzahl der Treffer unter 10 ist funktioniert die Sache ohne Probleme...!

Ist dieses Problem bekannt ? Ich habe jedenfalls trotz Suchens noch keine Lösung gefunden.

Ich benutze BDE und ODBC!

Vielen Dank für Hilfe

Zigster

Robert_G 3. Mär 2004 08:51

Re: Count und RecordCount liefert "-1"
 
Wie kannst du in einer Personal überhaupt DB-Kompos verwenden?

Nachtrag:
Ganz übersehen (1. Beitrag) - > Herzlich Willkommen in der Delphi-PRAXIS! :hi:
Wenn du eine Delphi-Version angibst, verlassen sich andere, die dir helfen wollen darauf. Du wirst also mit so manchem Tipp nichts anfangen können, wenn du die falsche Version angibst.

Zigster 3. Mär 2004 08:55

Re: Count und RecordCount liefert "-1"
 
Bevor hier irgendwelche Fragen auftauchen...ich benutze die aktuelle Trial-Version von Delphi 7!

APP 3. Mär 2004 09:32

Re: Count und RecordCount liefert "-1"
 
Hallo Zigster,
soweit ich mich erinnere, funktioniert Count mit Queries nicht immer richtig, da die Anzahl der Sätze u.a. ja auch vom "Read-Buffer" abhängt.
Um die Anzahl der Sätze einer Tabelle zu erhalten kannst Du ja auch SQL benutzen:
Delphi-Quellcode:
VAR
RecCount :Integer;
...
  query.SQL.Clear;
  query.SQL.Text :=
    (
    'SELECT COUNT(*) ' +#10+
    'FROM ' +#10+
    'DeineTabelle'
    );
  query.Execute; // oder query.open;
  RecCount := query.Field(0);
[EDIT]
Auf besonderen Wunsch von "Schurli G" :mrgreen: "#10er TAGS" für den OracleMonitor eingefügt :-)
p.s. Habe die PlugInDoc noch immer nicht gelesen :oops:
[/EDIT]

Robert_G 3. Mär 2004 09:36

Re: Count und RecordCount liefert "-1"
 
Du musst natürlich exakt die gleixhe Where/Having-Clause verwenden, umm auf die gleiceh Anzahl von Datensätzen zu kommen.

OT: @Armin
Sieht schon besser aus :wink: ( nur guck dir das mal im OracleMonitor an :roteyes: )

neolithos 3. Mär 2004 09:41

Re: Count und RecordCount liefert "-1"
 
Count bzw. RecordCount werden kann man auch ermittelt in dem man

MoveLast bzw Last aufruft. Denn dann sind erst alle Daten im Speicher.

APP 3. Mär 2004 09:56

Re: Count und RecordCount liefert "-1"
 
Hallo Neo,
Zitat:

Zitat von neolithos
MoveLast bzw Last aufruft. Denn dann sind erst alle Daten im Speicher.

so rein vom Gefühl her (ich bin kein DB-Guru) ist Deine Variante sehr Ressourcen-Aufwändig, dann
wenn die DB groß ist und eine C/S Variante ist, da in der DB jeder Satz "berührt" und lokal upgedatet
wird. Bei einem SQL Statement aber, wird dieses am Server ausgeführt und belastet den Client wenig, da z.B.
als Ergebnis nur, wie bei obigem Beispiel, der Count an den Client geliefert wird.

Falls ich falsch liege, bitte um Klarstellung :coder:

Robert_G 3. Mär 2004 10:06

Re: Count und RecordCount liefert "-1"
 
In einer "richtigen" DB mit vernünftigem Optimizer und Query plan geht ein "SELECT Count(*)" rucki zucki.
Mit der MoveLast - RecordCount Variante bist du darauf angewiesen, dass wirklich die gesamt Datenmenge im Cache bleibt.
Wenn ich so etwas mit DOA (nicht ADO!) mache habe ich generell nur 25 - 100 Einträge auf dem Client, die anderen werden autom. von der DB geholt, wenn sie gebraucht werden.
Ein MoveLast (falls es das bei meinen Kompos überhaupt gibt :gruebel: ) würde dann entweder nur 100 liefern oder eine komplette Übertragung auslösen.

woki 3. Mär 2004 11:29

Re: Count und RecordCount liefert "-1"
 
Also, um das was implizit schon in vielen Antworten enthalten ist, noch mal ganz deutlich zu sagen:
Die Methode recordcount des Datasets gibt üblicherweise (jeder Entwickler eines speziellen TDataset - Derivates kann das ja machen wie er will) nicht die Anzahl der Datensätze zu einer Query in der Datenbank sondern die Anzahl der aktuell auf den Client geladenenen Datensätze wieder. Man sollte also die Methode verwenden, die der Entwickler vorgesehen hat (select count für Datensätze in der DB, oder recordcount für Datensätze aktuell im TDataset), sonst baut man gefährliche Tretminen in sein Programm ein.

Wenn also die Anzahl der der Datensätze im Client wirklich ist was Du suchst, dann füge ich noch hinzu, das das recordcount bei TQuery und TTable bei mir im Laufe der immer das Ergebnis geliefert hat, das ich erwartet habe, das con Dir beschriebene Phänomen kenne ich nicht.

Grüße
Woki


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 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