DBGRID Anzahl der Datensätze anzeigen.

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andy Nightingale
Beiträge: 388
Registriert: Mo 13. Jan 2025, 12:11

DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Andy Nightingale »

Hallo Leute,
gibt es eine einfache Möglichkeit im DBGRID die Anzahl der geladenen Daten im Grid anzuzeigen? Momentan habe ich ein Label mit dieser Programmierung:

Code: Alles auswählen

procedure TFStickstoff.Label1Click(Sender: TObject);
begin
    Label1.Caption := Format('Anzahl Datensätze: %d', [DataSourceStickstoff.DataSet.RecordCount]);
end;                                                                                                

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7218
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: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von af0815 »

RecordCount gibt die je nach Datenbank nur zurőck, wieviele Datensátze gefeched worden sind.

siehe auch
https://lazarus-ccr.sourceforge.io/docs ... count.html
https://wiki.lazarus.freepascal.org/SqlDBHowto/de

Am besten ist es, den Server direkt mit "SELECT COUNT(*)" oder ähnlich zu fragen. Es gibt den Tip "Query.PacketRecords := -1; // <-- FetchAll" zu verwenden, nur das erzwingt, das das komplette Datenset geladen wird. Bei sicher immer kleinen Datenmengen ist das jetzt noch akzeptabel.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Joh
Lazarusforum e. V.
Beiträge: 345
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Joh »

af0815 hat geschrieben: Do 12. Mär 2026, 16:37 Am besten ist es, den Server direkt mit "SELECT COUNT(*)" oder ähnlich zu fragen. Es gibt den Tip "Query.PacketRecords := -1; // <-- FetchAll" zu verwenden, nur das erzwingt, das das komplette Datenset geladen wird. Bei sicher immer kleinen Datenmengen ist das jetzt noch akzeptabel.
Bei ((sicher immer kleinen Datenmengen) und (lokalen Datenbanken))...
just my two Beer

Andy Nightingale
Beiträge: 388
Registriert: Mo 13. Jan 2025, 12:11

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Andy Nightingale »

Joh hat geschrieben: Do 12. Mär 2026, 17:54
af0815 hat geschrieben: Do 12. Mär 2026, 16:37 Am besten ist es, den Server direkt mit "SELECT COUNT(*)" oder ähnlich zu fragen. Es gibt den Tip "Query.PacketRecords := -1; // <-- FetchAll" zu verwenden, nur das erzwingt, das das komplette Datenset geladen wird. Bei sicher immer kleinen Datenmengen ist das jetzt noch akzeptabel.
Bei ((sicher immer kleinen Datenmengen) und (lokalen Datenbanken))...
Genau richtig erkannt...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7218
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: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von af0815 »

Joh hat geschrieben: Do 12. Mär 2026, 17:54 lokalen Datenbanken
Man muss den Typ der Datenbank sich ansehen. Bei Dbase, FoxPro oder Access war der Recordcount das richtige MIttel der Wahl (Abgesehen, das ich eine Access und Excel Allergie berufsbedingt habe).
Bei Server Datenbanken (auch wenn sie lokal sind) sieht das anders aus, weil die Treiberschichten auf Datenmengen ausgelegt sind und nicht auf Datensätze.

Wenn du den den "SELECT COUNT(*)" verwendest, so kann der Optimizer vom SQL-Server sich die Daten optimiert zusammenstellen und liefert genaugenommen nur ein einfaches Recordset mit einer Zeile zurück. Das geht flott, meisten ist es nur ein IP-Paket. Muss der Server jetzt die kompletten Daten übertragen, so kann das im schlechtesten Fall die Netzwerklast unnötig belasten, weil Daten übertragen werden, die am Client nur gepuffert werden, genaugenommen aber nicht gebraucht werden. Brauche ich die Daten wirklich alle, so ist es besser diese geeignet abzulegen und dann die Anzahl übers Programm zu berechnen. Das schlechteste ist natürlich die Daten 2x abzurufen - einmal umd die Anzahl in Erfahrung zu bringen und einmal um sie anzuzeigen.

Ich habe da viel Lehrgeld gezahlt, über die Netzwerkverbindungen früher nach Fernost. Das ging am Anfang noch über T1 Verbindungen (https://de.wikipedia.org/wiki/Trunk_1). Viel Spass mit Datenmengen auf den Leitungen :-) . Es ist aber aus Sicht des DB-Admins auch nicht lustig, wenn man draufkommt, das da unnötige Locks, Bandbreiten, Loads etc. am Server erzeugt werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 601
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Zvoni »

Oder statt einem separaten SELECT COUNT(*) gleich im ursprünglichen SELECT mitliefern
(Beispiel aus einem meiner Programme)

Wichtig: Der Filter muss in beiden SELECTs derselbe sein. Kann sogar parametriert werden

Code: Alles auswählen

select * from tbl_country_provider_zone As B
inner join 
(select count(*) as Cnt from tbl_country_provider_zone where Country_ID=1) as A on 1=1
where B.Country_ID=1
Damit wird die Anzahl Zeilen bei jedem Datensatz geliefert, und du brauchst nur die Spalte im ersten Datensatz auszulesen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Andy Nightingale
Beiträge: 388
Registriert: Mo 13. Jan 2025, 12:11

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Fr 13. Mär 2026, 10:09 Oder statt einem separaten SELECT COUNT(*) gleich im ursprünglichen SELECT mitliefern
(Beispiel aus einem meiner Programme)

Wichtig: Der Filter muss in beiden SELECTs derselbe sein. Kann sogar parametriert werden

Code: Alles auswählen

select * from tbl_country_provider_zone As B
inner join 
(select count(*) as Cnt from tbl_country_provider_zone where Country_ID=1) as A on 1=1
where B.Country_ID=1
Damit wird die Anzahl Zeilen bei jedem Datensatz geliefert, und du brauchst nur die Spalte im ersten Datensatz auszulesen
Hallo Zvoni...eine Frage: gibt dies nicht das Gleiche zurück?

Code: Alles auswählen

select * from tbl_country_provider_zone where Country_ID=1

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7218
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: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von af0815 »

Nein, es wird in der Version von Zvoni ein zusätzliches Feld hinzugefügt (sieht man durch den blöden Stern im select ja direkt nicht, das hier ein Feld CNT mehr ist) das die Anzahl beinhaltet. Für das ist der Subselect mit dem Inner Join zuständig. Das man die Tabelle quasi mit sich selbst Joined ist öfters ein Trick um zusätzliche Informationen zu erzeugen.

Wird auch gerne für Rangfolgen oder Differenzen verwendet.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 601
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Zvoni »

af0815 hat geschrieben: Mo 16. Mär 2026, 15:48 Nein, es wird in der Version von Zvoni ein zusätzliches Feld hinzugefügt (sieht man durch den blöden Stern im select ja direkt nicht, das hier ein Feld CNT mehr ist) das die Anzahl beinhaltet. Für das ist der Subselect mit dem Inner Join zuständig. Das man die Tabelle quasi mit sich selbst Joined ist öfters ein Trick um zusätzliche Informationen zu erzeugen.

Wird auch gerne für Rangfolgen oder Differenzen verwendet.
Korrekt.
Der Trick bei meiner Abfrage oben ist, dass das innere SELECT genau einen Datensatz liefert (Den "Count").
Da ich beim INNER JOIN kein Verknüpfungsfeld angebe, sondern ein stumpfes "ON 1=1", welches IMMER wahr ist, wird dieser eine Satz, an JEDEN Satz aus dem ersten SELECT hinten drangehängt.

Um es mal so auszudrücken:
38.257 individuelle Menschen sind beim Fussballspiel, und jeder einzelne von denen weiss, dass eben 38.257 Menschen beim Spiel sind.
Egal wen du frägst, er weiss die Antwort

Um es auf dein Beispiel zu übertragen

Code: Alles auswählen

SELECT P.ID, P.Nummer, P.Nachname, P.Vorname, P.Strasse, P.PLZ, P.Wohnort, A.Cnt 
FROM Tab_Patienten As P
INNER JOIN
   (SELECT COUNT(ID) As Cnt FROM Tab_Patienten) AS A 
ON 1=1 
ORDER BY P.Nummer
Jetzt ist es egal, ob du PacketRecords=50 hast, ob du im ersten SELECT ein FIRST xx SKIP yy machst:
Die letzte Spalte liefert dir immer die gesamte Anzahl.

Du kannst sogar Parameter nutzen

Code: Alles auswählen

SELECT P.ID, P.Nummer, P.Nachname, P.Vorname, P.Strasse, P.PLZ, P.Wohnort, A.Cnt 
FROM Tab_Patienten As P
INNER JOIN
   (SELECT COUNT(ID) As Cnt FROM Tab_Patienten WHERE Wohnort=:Ort) AS A -- GLEICHER PARAMETER-NAME!!
ON 1=1 
WHERE Wohnort=:Ort  -- GLEICHER PARAMETER-NAME!!
ORDER BY P.Nummer
Und der ParamByName('Ort').AsString:='Hamburg'; muss nur einmal im Code gesetzt werden.....
Zuletzt geändert von Zvoni am Do 19. Mär 2026, 11:58, insgesamt 4-mal geändert.
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7218
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: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von af0815 »

Zvoni hat geschrieben: Di 17. Mär 2026, 08:17 Um es mal so auszudrücken:
38.257 individuelle Menschen sind beim Fussballspiel, und jeder einzelne von denen weiss, dass eben 38.257 Menschen beim Spiel sind.
Egal wen du frägst, er weiss die Antwort
Klar, hier hilft der Stadionssprecher :-) (Ja ich wohne neben einen Fußballplatz).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 601
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Zvoni »

af0815 hat geschrieben: Di 17. Mär 2026, 08:23
Zvoni hat geschrieben: Di 17. Mär 2026, 08:17 Um es mal so auszudrücken:
38.257 individuelle Menschen sind beim Fussballspiel, und jeder einzelne von denen weiss, dass eben 38.257 Menschen beim Spiel sind.
Egal wen du frägst, er weiss die Antwort
Klar, hier hilft der Stadionssprecher :-) (Ja ich wohne neben einen Fußballplatz).
Das ist BEVOR die Durchsage kommt
:lol: :lol: :lol: :lol: :lol:
Und wenn der Stadionsprecher "Werner Brösel" heisst.....
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Zvoni
Beiträge: 601
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: DBGRID Anzahl der Datensätze anzeigen.

Beitrag von Zvoni »

Andy Nightingale hat geschrieben: Mo 16. Mär 2026, 14:35
Zvoni hat geschrieben: Fr 13. Mär 2026, 10:09 Oder statt einem separaten SELECT COUNT(*) gleich im ursprünglichen SELECT mitliefern
(Beispiel aus einem meiner Programme)

Wichtig: Der Filter muss in beiden SELECTs derselbe sein. Kann sogar parametriert werden

Code: Alles auswählen

select * from tbl_country_provider_zone As B
inner join 
(select count(*) as Cnt from tbl_country_provider_zone where Country_ID=1) as A on 1=1
where B.Country_ID=1
Damit wird die Anzahl Zeilen bei jedem Datensatz geliefert, und du brauchst nur die Spalte im ersten Datensatz auszulesen
Hallo Zvoni...eine Frage: gibt dies nicht das Gleiche zurück?

Code: Alles auswählen

select * from tbl_country_provider_zone where Country_ID=1
Nein, ist nicht dasselbe

Code: Alles auswählen

select * from tbl_country_provider_zone where Country_ID=1
gibt mir z.b. 4 Einzelne Sätze zurück
ID Eintrag
1 Eintrag1
3 Eintrag36
7 Eintrag42
9 Eintrag99

mit dieser Abfrage

Code: Alles auswählen

select * from tbl_country_provider_zone As B
inner join 
(select count(*) as Cnt from tbl_country_provider_zone where Country_ID=1) as A on 1=1
where B.Country_ID=1
Bekomme ich wie folgt
ID Eintrag Cnt
1 Eintrag1 4
3 Eintrag36 4
7 Eintrag42 4
9 Eintrag99 4

Heisst: Egal, welchen Datensatz ich mir anschaue, ich weiss immer wieviel Sätze in Summe in der Tabelle vorhanden sind, die meinen Kriterien entsprechen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten