![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 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