Autor Beitrag
Der Jan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Mi 30.11.05 17:43 
Hallo,

wie kann ich nach dem Ausführen eines Query (FIBQuery, FIBPlus Komponenten) feststellen, ob bzw. wie viele Datensätze von dem Query betroffen sind? Sowas wie RecordCount bei TDataSet gibt es ja hier leider nicht...

_________________
Gruß, Jan
MagicAndre1981
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 30.11.05 18:00 
Schau dir mal SELECT COUNT (PK) an :wink:

André
Der Jan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Do 01.12.05 09:33 
Dann müßte ich vor dem eigentlichen Query noch eins ausführen, um die Anzahl der REcords zu bestimmen, und genau das will ich eben nicht tun....

_________________
Gruß, Jan
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 01.12.05 10:06 
user profile iconDer Jan hat folgendes geschrieben:
wie kann ich nach dem Ausführen eines Query (FIBQuery, FIBPlus Komponenten) feststellen, ob bzw. wie viele Datensätze von dem Query betroffen sind? Sowas wie RecordCount bei TDataSet gibt es ja hier leider nicht...

Demnach benutzt du FireBird oder Interbase.
Bei SQL-Datenbanken macht RecordCount i.d.R. keinen Sinn. Bei großen Datenmengen wird üblicherweise nur ein Teil der Datenmenge übertragen. Somit weiß der client oft gar nicht, wieviel Datensätze tatsächlich existieren. Außerdem könnte sich die Anzahl der Datensätze im Mehrbenutzerbetrieb ständig ändern. Allerdings hat natürlich auch jede Abfrage einen eigenen Cursor auf der DB, wodurch die Anzahl der Datensätze erst recht nicht mehr genau ist.
Mir ist natürlich halbwegs klar, was du willst, aber ich wollte kurz aufzeigen, warum die Anzahl der Datensätze nur eine Spielerei und nur selten sinnvoll ist.
Ich kenne die FIB-Komponenten nicht aus eigener Erfahrung. Aber evtl. kannst du über den Trick zum letzten Datensatz zu springen, an die Anzahl der Datensätze kommen. Geht natürlich nur, wenn es die Komponente die Eigenschaft RecNo (Datensatznummer) o.ä. kennt.
alex517
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 60


D7Ent, FB, FIBPlus
BeitragVerfasst: Do 01.12.05 10:32 
Hi,

Wie kommst du darauf, dass es RecordCount nicht gibt?

Zitat:

set poAskRecordCount in PrepareOptions to True (calc RecordCount as
"select count(*) <select_sql_from_and_where_section>")
--
Sincerely yours,
Nikolai Voynov

Devrace - software for developers!
__________________________________
e-mail: nvoynov@devrace.com
url : www.devrace.com/, www.fibplus.com/

alex
Der Jan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Do 01.12.05 11:15 
user profile iconalex517 hat folgendes geschrieben:
Hi,

Wie kommst du darauf, dass es RecordCount nicht gibt?

Zitat:

set poAskRecordCount in PrepareOptions to True (calc RecordCount as
"select count(*) <select_sql_from_and_where_section>")
--
Sincerely yours,
Nikolai Voynov

Devrace - software for developers!
__________________________________
e-mail: nvoynov@devrace.com
url : www.devrace.com/, www.fibplus.com/

alex


FIBPlus Developers Guide: ...TpFIBQuery is not a Descendant of TDataSet, it does not Cache any Records and that is why it has not the RecordCount Method...

Ich möchte, wie schon erwähnt, nicht noch extra ein SELECT COUNT ausführen.

Dummerweise gibt TFIBQuery.Current auch einen SQL-Descriptor zurück, wenn kein Record gefunden wurde, so scheidet diese Möglichkeit aus.

Eigentlich würde es für den Moment schon reichen, zu wissen, ob überhaupt ein Record gefunden wurde. Nur leider weiss ich nicht, wie.
Notfalls muß ich eben über COUNT gehen, aber ich würde gerne eine Extra-Abfrage vermeiden.

_________________
Gruß, Jan
Der Jan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 98

Win2k prof, WinXP prof, Linux
D6 Prof, BCB4 Std, BCB6 Ent, BDS 2006 Ent
BeitragVerfasst: Do 01.12.05 11:26 
Ääähm. Jaaa....

hab gerade festgestellt, das es ein Property RecordCount gibt... :oops:
Allerdings lt. Doku: Returns the number of records currently fetched by the query
Aber es bringt mich auf jeden Fall viiiiel weiter.

_________________
Gruß, Jan
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 02.12.05 04:16 
user profile iconDer Jan hat folgendes geschrieben:
Ääähm. Jaaa....

hab gerade festgestellt, das es ein Property RecordCount gibt... :oops:
Allerdings lt. Doku: Returns the number of records currently fetched by the query
Aber es bringt mich auf jeden Fall viiiiel weiter.

Die unsaubere Methode wäre dann ein Fetchen aller Datensätze der Menge anzustoßen. Vielleicht gibt es eine Funktion FetchAll. Dann hast Du den genauen RecordCount.

@jasocul: Bei RecordCount geht es immer nur darum, die Anzahl der Datensätze der aktuellen Abfrage zu ermitteln und die kann ja nicht von außen geändert werden ;-)
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Fr 02.12.05 05:19 
user profile iconDer Jan hat folgendes geschrieben:
Eigentlich würde es für den Moment schon reichen, zu wissen, ob überhaupt ein Record gefunden wurde. Nur leider weiss ich nicht, wie.


Du glaubst anscheinend, ein Select würde die performance bremsen, oder ein Count oder was auch immer ? Da wäre ich mal nicht so zimperlich. Ich habe hier einen Fall, bei dem ich kurzerhand den allerersten Datensatz (@Alex: select first 1 :lol: ) lese, nur um die Feldgrößen (DisplayWidth) mit der Schriftgröße verrechne und an ein Stringgrid als Colwidth übergebe. Was solls ?

Oder beim Einfügen/Ändern. Da guck ich auch zuerst, ob ein DS schon da ist und handele dementsprechend ob einer da ist oder eben nicht. Wenn Du solche Select-Statements nicht selber machten willst, dann machts eben FIBplus. Da wird wohl schon was besser optimiert werden, aber viel mehr als 0,1 Nanosekunden sind an der Stelle wohl kaum zu holen. 8) Und der Umweg RecordCount kostet dann eben wieder 0,2 Nanosekunden. Davon abgesehen zielt die Frage langsam in Richtung Stored Procedures. Guck Dir die mal an.

_________________
Gruß
Hansa