Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [Interbase] GetRecordCount (https://www.delphipraxis.net/14515-%5Binterbase%5D-getrecordcount.html)

Hansa 10. Jan 2004 18:39


[Interbase] GetRecordCount
 
Hi,

ich habe hier 2 DBgrids (Master/Detail). Nun will ich wissen, wieviele Einträge das Detail-Dataset des ausgewählten Master-Datasets hat. Mit DetailDataSet.GetRecordCount erhalte ich Werte, die nicht stimmen können. Bzw. wo ist die beste Stelle, dies einzufügen ?

Lemmy 12. Jan 2004 09:04

Re: [Interbase] GetRecordCount
 
Hi,

die Anzahl der Records wird bei IB/FB eigentlich nur über ein
SQL-Code:
Select Count(..) From ...
richtig abgefragt. Über die Komponenteneigenschaften RecordCount,... müsste der Client alle Datensätze von der Datenbank holen (FetchAll) und das widerspricht mal wieder allem worauf man bei Client/Server achten soll....

Grüße
Lemmy

Hansa 12. Jan 2004 12:01

Re: [Interbase] GetRecordCount
 
Hi Lemmy,

Du meinst mit COUNT ? Sagen wir mal so, wenn ich 10.000 Datensätze habe und diese z.B. mit
SQL-Code:
SELECT COUNT * FROM TABLE WHERE Bedingung
einschränke, das müßte doch gehen ?

Sharky 12. Jan 2004 12:03

Re: [Interbase] GetRecordCount
 
Hai Hansa,

so müsste es stimmen:

SQL-Code:
SELECT Count (*) As anzahl FROM tabelle WHERE bedingung
Dann kannst Du über .FieldByName ('anzahl').AsInteger die Menge abfragen.

Lemmy 12. Jan 2004 12:18

Re: [Interbase] GetRecordCount
 
Hi Hansa,

COUNT ist eine SQL-Funktion die die Anzahl der Datensätze zählt, die sich in der Ergebnismenge befinden würden:

WEnn Du also ne Abfrage erstellst:

SQL-Code:
 Select * from Adressen where PLZ=7000

dann bekommst Du mit


SQL-Code:
 Select count(*) as Anzahl from Adressen where PLZ=7000
die Anzahl der Datensätze zurück.

Grüße
Lemmy

P.S.: Halt so wie es Sharky erklärt hat, nur etwas ausführlicher....

Hansa 12. Jan 2004 12:53

Re: [Interbase] GetRecordCount
 
Das ist ja schon mal gut. Aber bei mir muß es immer kompliziert werden. Ich habe zwei DBgrids (Master/Detail), wobei halt das Master als Source der Detailtable dient. Und nun bräuchte ich nur die Anzahl der jeweiligen Detailmenge. Wie mache ich das denn jetzt ? Wo und wie soll ich da das Count einbauen ? :gruebel:

Sharky 12. Jan 2004 13:57

Re: [Interbase] GetRecordCount
 
Uff... mit den Master/Detail Funktionen habe ich nie gearbeitet.
Ich habe immer für jedes Grid ein Query / Datasource.

Wenn z.B.: Query1 für die "Mastertabelle" zuständig ist setze ich im AfterScroll-Ereigniss einfach den SQL-Befehl für mein Query2 neu.


Delphi-Quellcode:
procedure TForm1.Query1AfterScroll(DataSet: TDataSet);
begin
  Query2.Close;
  Query2.SQL.Text := 'SELECT *, Count (*) As anzahl from detail WHERE master_id = '
                     + DataSet.FieldByName ('master_id').AsString;
  Query2.Open;
end;

Lemmy 12. Jan 2004 16:26

Re: [Interbase] GetRecordCount
 
Hi Hansa,

Zitat:

Zitat von Hansa
... wobei halt das Master als Source der Detailtable dient. Und nun bräuchte ich nur die Anzahl der jeweiligen Detailmenge. :gruebel:

jetzt muss ich mal :gruebel: ....

Wenn Du ne Master/Detail-Ansicht hast, brauchst Du 2 Grids und für jedes Grid ne TDataSource incl. Anhang (also TDataSet). Dadurch hast Du 2 SQL-Statements. Wenn Du die Anzahl der Datensätze der jeweiligen Abfrage haben willst, gibts 2 Möglichkeiten:

1. Direkte Abfrage im Client durch eine weitere TDataSet: Es wird erst die Anzahl der Master-Datensätze bestimmt, dann die Anzahl der Detail-Datensätze.

2. Über SP wenn es denn die Abfragen zulassen.

Grüße
Lemmy

Hansa 12. Jan 2004 19:48

Re: [Interbase] GetRecordCount
 
Hi,

die Hinweise waren hilfreich. Sharkys Methode sieht am besten aus, aber leider ging sie nicht. Enweder wird COUNT verwendet, oder ein "," und die einzelnen Feldnamen. Gemischt scheint das leider nicht zu gehen.

Wenn ich das ganze nun aber mit der Idee von Lemmy irgendwie mische und noch meinen eigenen Senf dazu gebe, so wird der Brei nicht verdorben. :mrgreen:

Delphi-Quellcode:
procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);
begin
  AnzDS.Close;
  AnzDS.ParamByName('ID_MASTER').AsInteger := MasterDS.FieldByName ('ID').AsInteger;
  AnzDS.SelectSQL.Text := 'SELECT COUNT (ID) AS ANZAHL FROM DETAIL WHERE ID_MASTER= :ID_MASTER';
  AnzDS.Open;
  Label1.Caption := 'Anzahl : '+  AnzDS.FieldByName ('ANZAHL').AsString;
end;
Tja, so funktioniert es jetzt. Ein zusätzliches DataSet ist in dieser Variante anscheinend auf jeden Fall nötig.

@Admin: was ist bloß mit dem Server los? Den Beitrag hier hatte ich jetzt über eine St. in die Zwischenablage gerettet. Und das ohne 1&1. :lol:


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