![]() |
Zählen von Einträgen in SQLQuery
Hi @all
ich möchte die Einträge in einem Table zählen mit
Delphi-Quellcode:
liefert der mir entweder 0 zurück (wenn keine einträge da sind --> richig) oder 1 (egal wieviele einträge es sind)
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; ich hab die sache zwar mit
Delphi-Quellcode:
umschifft aber das muss doch auch "eleganter" gehn
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; |
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; ... |
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'
|
und wie les ich das dann aus ums inner variablen zu speichern?
|
Hallo,
wenn es sich auf das Posting von bis bezieht:
Code:
...
SQLQuery.Open; Result:=SQLQuery.Fields[0].AsInteger; ... |
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 |
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:
Der Aufruf sähe dann beispielsweise so aus:
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;
Delphi-Quellcode:
gruß, harrybo
vLastId := GetMaxID('Mitarbeiter', 'Mit_ID');
|
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:
Also im Prinzip will ich mit "Table.Last" auf den Letzten Datensatz zugreifen, und da wenn möglich dessen "ID" auslesen.
anzahl := Table.RecordCount;
[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). |
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:
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.
'SELECT COUNT (*) FROM ' + ATable)
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 |
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. |
Hi X-Dragon,
wenn es Dir also zwecks Einrichtung einer Fortschrittsanzeige lediglich um die Anzahl der Datensätze geht, also nicht um einen genauen ID-Wert, kannst Du doch wunderbar SELECT COUNT... (in Verbindung mit einer Query) verwenden. Diese Abfrage ist, auch wenn die entsprechende Tabelle hunderttausende Datensätze enhält, überhaupt nicht zeitkritisch, da ja, wie gesagt, nur ein einziger Datensätz zurückgeliefert wird. gruß, harrybo |
Ok, danke! Werde es morgen gleich mal ausprobieren.
|
Ich bin jetzt gerade dabei den Zugriff auf die DB komplett auf SQL umzustellen, allerdings funktioniert das noch nicht so ganz.
Wie muss ich das denn schreiben, das er die DBF-Datenbank auch als solche erkennt?(also beim Select Count beschwert er sich, das er mit DBF nichts anfangen kann) Und irgendwo soll da ' zuviel oder zu wenig sein, oder so :| .
Code:
[edit]
SQL.Add([color=#000080]'SELECT COUNT (*) FROM Kunden.DBF'[/color]);
ExecSQL; anz := Round([color=#000080]1[/color]/([color=#000080]100[/color]/(qry.Fields[[color=#000080]0[/color]].AsInteger))); SQL.Clear; SQL.Add([color=#000080]'SELECT KDNR, N1, N2, N3, PLZ, ORT'[/color]); SQL.Add([color=#000080]'FROM Kunden.DBF'[/color]); SQL.Add([color=#000080]'WHERE UPPER(N1) LIKE UPPER('[/color][color=#000080]'%'[/color] + sstr + [color=#000080]'%'[/color][color=#000080]')'[/color]); SQL.Add([color=#000080]'OR KDNR LIKE '[/color][color=#000080]'%'[/color] + sstr + [color=#000080]'%'[/color][color=#000080]''); [/color] SQL.Add([color=#000080]'OR UPPER(N2) LIKE UPPER('[/color][color=#000080]'%'[/color] + sstr + [color=#000080]'%'[/color][color=#000080]')'[/color]); SQL.Add([color=#000080]'OR UPPER(N3) LIKE UPPER('[/color][color=#000080]'%'[/color] + sstr + [color=#000080]'%'[/color][color=#000080]')'[/color]); SQL.Add([color=#000080]'OR PLZ LIKE '[/color][color=#000080]'%'[/color] + sstr + [color=#000080]'%'[/color][color=#000080]''); [/color] SQL.Add([color=#000080]'OR UPPER(ORT) LIKE UPPER('[/color][color=#000080]'%'[/color] + sstr + [color=#000080]'%'[/color][color=#000080]')'[/color]); hab schon mal ein Problem gelöst, eins der DB-Felder(PLZ) hat ein numerisches-Format und will sich deshalb nicht mit einem String verglechen lassen :) Fehlt nur noch das COUNT ... [edit2] Ok, hat sich erledigt, ich verzichte auf das Count. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:42 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz