Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Zählen von Einträgen in SQLQuery (https://www.delphipraxis.net/2345-zaehlen-von-eintraegen-sqlquery.html)

MadMason 19. Jan 2003 10:04


Zählen von Einträgen in SQLQuery
 
Hi @all

ich möchte die Einträge in einem Table zählen mit
Delphi-Quellcode:
function countfields(table, field: string): integer;
begin
  SQLQuery.SQL.Clear;
  SQLQuery.SQL.Add('SELECT '+ field +' FROM ' + table);
  SQLQuery.Open;
  if SQLQuery.IsEmpty then result:= 0 else result:= SQLQuery.FieldCount;
  SQLQuery.Close;
end;
liefert der mir entweder 0 zurück (wenn keine einträge da sind --> richig) oder 1 (egal wieviele einträge es sind)

ich hab die sache zwar mit
Delphi-Quellcode:
function countfields(table, field: string): integer;
begin
  SQLQuery.SQL.Clear;
  SQLQuery.SQL.Add('SELECT '+ field +' FROM ' + table);
  SQLQuery.Open;
  if SQLQuery.IsEmpty then result:= 0 else begin
   SQLQuery.First;
   result:= 0;
   repeat
    inc(result);
    SQLQuery.Next;
   until SQLQuery.Eof;
  end;
  SQLQuery.Close;
end;
umschifft aber das muss doch auch "eleganter" gehn

Gollum 19. Jan 2003 11:28

Hallo,

mit FieldCount, erhälst Du die Anzahl der Felder in einer Abfrage. In Deinem Fall 1 Feld. Die Anzahl an Datensätzen erhälst Du durch RecordCount.

Code:
  ...
  SQLQuery.Open;
  Result:=SQLQuery.RecordCount;
  ...

bis 19. Jan 2003 12:15

Hi,

Du kannst aber auch mit dem folgenden SQL-Befehl die Einträge in Deiner Tabelle zählen :
Code:
SELECT COUNT(Feldname) FROM Tabelle WHERE Feldname2='Test'

MadMason 19. Jan 2003 13:25

und wie les ich das dann aus ums inner variablen zu speichern?

Gollum 19. Jan 2003 13:36

Hallo,

wenn es sich auf das Posting von bis bezieht:

Code:
  ...
  SQLQuery.Open;
  Result:=SQLQuery.Fields[0].AsInteger;
  ...

X-Dragon 21. Jan 2003 13:53

Da hab ich gerade auch noch eine Frage, hat aber nichts mit SQL zu tun.

Kann man den den letzten Eintrag des "internen Index"* in einer DB auslesen? Das selber zählen(bzw. mit RecordCount) dauert mir zu lange, bei mehreren tausend Datensätzen.

* der zumindest beim Database Desktop, als erstes "Feld" angezeigt wird

harrybo 21. Jan 2003 14:19

Hi X-Dragon,
ich schätze, Deine Frage hat doch was mit SQL zu tun. Der Zusatz MAX in der SQL Abfrage liefert statt eines möglicherweise riesigen Recordsets nur einen einzigen Datensatz zurück. Hier eine Funktion, die Dir die letzte ID aus einer beliebigen Tabelle zurück gibt. Die Funktion erwartet den Tabellennamen und den Feldnamen des ID-Feldes:
Delphi-Quellcode:
function TDM.GetMaxID(ATable, AField : string): longint;
var
  vSQL : string;
begin
  vSQL := 'SELECT MAX (' + AField + ') FROM ' + ATable;
  result := 0;
  with Query1 do try
    if Open then Close;
    SQL.Clear;
    SQL.Add(vSQL);
    ExecQuery; // oder Open, je nach Komponente
    if RecordCount > 0 then
      if Fields[0].Value <> NULL then result := Fields[0].Value;
  finally
    Close;
  end;
end;
Der Aufruf sähe dann beispielsweise so aus:
Delphi-Quellcode:
vLastId := GetMaxID('Mitarbeiter', 'Mit_ID');
gruß, harrybo

X-Dragon 21. Jan 2003 14:45

Danke für deine schnelle Antwort.

Wenn ich das soweit richtig verstehe wird dort ja auch mit "RecordCount" die Datensätze durchgezählt, was also im Endeffekt wieder eine Zeitverzögerung bedeutet, die ich ja vermeiden wollte.

Ausserdem benötige ich dazu einen Feldnamen, den ich nicht habe, da dieser "Index" ja kein selbsterstelltes Feld ist, sondern anscheind nur Datenbank-Intern verwendet wird (in dem Fall geht es um eine DBase-Datenbank falls es weiterhilft).

Also ich suche eine schnellere Möglichkeit als:
Code:
anzahl := Table.RecordCount;
Also im Prinzip will ich mit "Table.Last" auf den Letzten Datensatz zugreifen, und da wenn möglich dessen "ID" auslesen.

[edit]
Ich will auf eine andere Datenbank zugreifen, auf dessen Aufbau ich selber aber keinen Einfluss habe. Sie hat kein eigenes Feld für einen Index (mit Zähler).

harrybo 21. Jan 2003 15:34

Hi X-Dragon,
mir ist wohl noch nicht ganz klar, wonach Du suchst. Die Anzahl der Datensätze, also RecordCount und letzte ID sind ja nur solange identisch, wie kein Datensatz gelöscht wird.

1. Falls es Dir um die Anzahl der Datensätze geht, erreichst Du das über
Delphi-Quellcode:
'SELECT COUNT (*) FROM ' + ATable)
Auch hier wird nur ein einziger Datensatz zurückgegeben, in dem im ersten Feld (also Fields[0].AsInteger) die Anzahl der Datensätze, also RecordCount steht.

2. Sollte es Dir umd die höchste bislang vergebene ID gehen, kannst Du diese wie ich beschrieben habe, erhalten. Selbstverständlich benötigst Du dafür einen Feldnamen, in dem diese ID steht (von einer dBase internen ID - etwa inkrementierend? - habe ich noch nichts gehört).

Meine RecordCount Abfrage ist übrigens definitiv nicht zeitkritisch, da von vorn herein klar ist, dass entweder ein oder gar kein Datensatz zurückgegeben wird. Einen einzelnen Datensatz in eine Ergebnismenge zu schieben ist völlig zeitunkritisch (Deshalb ist die SELECT COUNT Variante bei größeren Datenmngen, oder gar Server basierte Anwendugen immer der RecordCount Methode vorzuziehen).

lieben gruß, harrybo

X-Dragon 21. Jan 2003 15:50

Hast du zufällig den "Database Desktop"(zumindest bei der engl. Version heißt der so) der bei Delphi bei ist? Dann starte den bitte mal und schau dir eine beliebige Tabelle an. In der ersten Spalte sind die Datensätze durchnummeriert, ob ein Index eingerichtet ist oder nicht. Jetzt stell ich mir nur die Frage, ob das Programm dies nur selbst berechnet, oder ob man auf diesen "Index" auch zugreifen kann.

Die Anzahl der Datensätze brauch ich eigentlich nur für eine Progressbar-Anzeige, aber die Anzahl der Datensätze variert schon um einige tausend, weshalb ich schon einen genaueren Wert brauche (das ganze wird in einer Suchfunktion verwendet).

Naja notfalls lese ich die Anzahl einmal beim Programmstart aus, und greife dann immer auf den Wert zurück, so stark wird die Anzahl hoffentlich nicht schwanken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:23 Uhr.
Seite 1 von 2  1 2      

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