AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Zählen von Einträgen in SQLQuery
Thema durchsuchen
Ansicht
Themen-Optionen

Zählen von Einträgen in SQLQuery

Ein Thema von MadMason · begonnen am 19. Jan 2003 · letzter Beitrag vom 23. Jan 2003
Antwort Antwort
Seite 1 von 2  1 2      
MadMason

Registriert seit: 9. Nov 2002
Ort: Altenburg
126 Beiträge
 
Delphi 2005 Architect
 
#1

Zählen von Einträgen in SQLQuery

  Alt 19. Jan 2003, 11:04
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
Einstein ist tot
Newton ist tot
und mir ist auch schon ganz schlecht
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 19. Jan 2003, 12: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;
  ...
  Mit Zitat antworten Zitat
bis
(Gast)

n/a Beiträge
 
#3
  Alt 19. Jan 2003, 13: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'
  Mit Zitat antworten Zitat
MadMason

Registriert seit: 9. Nov 2002
Ort: Altenburg
126 Beiträge
 
Delphi 2005 Architect
 
#4
  Alt 19. Jan 2003, 14:25
und wie les ich das dann aus ums inner variablen zu speichern?
Einstein ist tot
Newton ist tot
und mir ist auch schon ganz schlecht
  Mit Zitat antworten Zitat
Benutzerbild von Gollum
Gollum

Registriert seit: 14. Jan 2003
Ort: Boxberg
456 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5
  Alt 19. Jan 2003, 14:36
Hallo,

wenn es sich auf das Posting von bis bezieht:

Code:
  ...
  SQLQuery.Open;
  Result:=SQLQuery.Fields[0].AsInteger;
  ...
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#6
  Alt 21. Jan 2003, 14: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
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#7
  Alt 21. Jan 2003, 15: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:
vLastId := GetMaxID('Mitarbeiter', 'Mit_ID'); gruß, harrybo
Harry Boldt
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#8
  Alt 21. Jan 2003, 15: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).
  Mit Zitat antworten Zitat
Benutzerbild von harrybo
harrybo

Registriert seit: 26. Nov 2002
Ort: Aachen
87 Beiträge
 
Delphi 6 Enterprise
 
#9
  Alt 21. Jan 2003, 16: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 '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
Harry Boldt
  Mit Zitat antworten Zitat
Benutzerbild von X-Dragon
X-Dragon

Registriert seit: 14. Jan 2003
Ort: Schortens
289 Beiträge
 
Delphi 6 Enterprise
 
#10
  Alt 21. Jan 2003, 16: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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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