Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Datenbankabfrage:'SELECT COUNT(*) FROM DB' (https://www.delphipraxis.net/212951-datenbankabfrage-select-count-%2A-db.html)

Schleifchen 28. Apr 2023 08:50

Datenbank: SQLite • Version: 3 • Zugriff über: FDConnection

Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Hallo in die Runde, wie kann ich das Ergebnis von 'SELECT COUNT(*) FROM BeginnerDB' in ein Memo einfügen:
Code:
query.SQL.Text := 'SELECT COUNT(*) FROM BeginnerDB';
  query.Open();
  outputMemo.Text:=''
  outputMemo.Text:= IntToStr(query.Text);
funzt nicht - aber wie dann.

PS: bin absoluter Anfänger und versuche mich grad an SQLite, bitte um Verständniss :wink:

Danke
Stefan

Papaschlumpf73 28. Apr 2023 09:00

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Delphi-Quellcode:
outputMemo.Text:= IntToStr(query.Fields[0].Value);

Lemmy 28. Apr 2023 09:01

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
bei so was mach ich i.d.R

Delphi-Quellcode:
query.SQL.Text := 'SELECT COUNT(*) AS Anzahl FROM BeginnerDB';
  query.Open();
  outputMemo.Text:= qry.FieldByName('Anzahl').AsString
das outputMemo.Text:='' habe ich raus genommen, das ist an der Stelle nicht sinnvoll

Schleifchen 28. Apr 2023 12:07

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Danke, so läuft es perfekt:
Code:
outputMemo.Text:= IntToStr(query.Fields[0].Value);
Frage: gibt query.Fields[0] ein Array zurück wo in 0 die Rückgabe gespeichert ist?

Danke
Stefan

Delphi.Narium 28. Apr 2023 12:28

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
In Fields befinden sich alle Spalten aus dem Ergebnis des SQLs, die erste Spalte ist in Fields[0], die zweite in Fields[1], ...

In query.Fields.Count steht die Anzahl der Spalten aus dem Abfrageergebnis. Enthält das Ergebnis (wie hier) nur eine Spalte, so ist query.Fields.Count = 1 und der Inhalt dieser einen Spalte ist in query.Fields[0] zu finden. Enthält das Ergebnis einer Abfrage zehn Spalten, so ist query.Fields.Count = 10 und die einzelnen Spalteninhalte können query.Fields[0] bis query.Fields[9] entnommen werden.

Da das etwas abstrakt und vor allem auch unhandlich ist, kann man auch die von Lemmy angedeutete Variante nutzen.
Delphi-Quellcode:
query.SQL.Text := 'SELECT COUNT(*) AS Anzahl FROM BeginnerDB';
query.Open();
outputMemo.Text := query.FieldByName('Anzahl').AsString;
Im SQL gibt man für jede Spalte den Namen an, bei
Delphi-Quellcode:
select * from Tabelle
werden die Namen aus der Tabelle genommen.

Im Quelltext kann man dann die Werte der Spalten über query.FieldByName('NameDerSpalte') erhalten, was deutlich einfacher und verständlicher ist, da man hier nicht wissen muss, an welcher Position sich die Spalte im Abfrageergebnis befindet. Hier ist es also egal, ob sich eine Spalte im Ergebnis nun in query.Fields[0], query.Fields[1], ..., query.Fields[n] befindet. Die "Suche" nimmt einem FieldByName ab und bei Änderungen in der Abfrage und einer daraus eventuell resultierenden Verschiebung der Spalten im Ergebnis, muss hier nicht im Quelltext "nachgebessert" werden, um sicherzustellen, das query.Fields[0] ... noch auf die korrekte Spalte verweisen.

Schleifchen 28. Apr 2023 13:05

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Habt Dank für Eure Mühe:thumb: nun ist alles bisschen klarer.

Delphi.Narium 28. Apr 2023 13:24

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Die Spalte in Lemmys SQL heißt Anzahl, weil Lemmy hinter Count(*) halt AS Anzahl geschrieben hat, derweil Count(*) gibt ja die Anzahl der passenden Sätze zurück. man kann auch
Delphi-Quellcode:
select count(*) as Bratkartoffel from Tabelle
schreiben, dann muss man im Quelltext eben query.FieldByName('Bratkartoffel') schreiben. Der "Text" hinter dem AS gibt einfach nur an, unter welchem Namen man die entsprechende Spalte später Ansprechen möchte.

Real gibt es aber keine Spalte mit dem Namen Anzahl in Lemmys SQL, Anzahl ist hier nur ein Alias auf Count(*). Aktuallisieren kann man Anzahl hier nicht, da Count(*) immer nur die aktuelle Menge an Datensätzen aus dem SQL angibt. Fügt man Sätze hinzu oder entfernt welche, so wird ein nachfolgendes Count(*) eben die dann aktuelle Menge an Datensätzen angeben.

Bevor Du Dich damit beschäftigst, wie Du Ergebnisse von Abfragen in Delphi weiterverarbeiten kannst, solltest Du Dir zuerst die Grundzüge für die Nutzung von SQL erarbeiten. Dies kann noch losgelöst von SQLite und Delphi geschehen, da dies bei allen Datenbanken (fast) gleich ist.

Frag' bitte mal die Suchmaschine Deiner Wahl nach "Tutorial SQL" und schau, welches für Dich geeignet ist. Wenn es "nur" um die Syntax von SQL geht, könnte eine Suche nach "Referenz SQL" hilfreich sein. Wenn die Grundlagen dort verstanden sind, wird die Umsetzung mit Delphi deutlich einfacher.

Klaus01 28. Apr 2023 13:24

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Zitat:

Zitat von Schleifchen (Beitrag 1521758)
Die von Lemmy gewählt Variant setzt voraus, das die Tabelle eine Spalte 'Anzahl' hat. D.h. in jedem Datensatz muss diese Spalte beim Hinzufügen oder Löschen von Datensätzen aktualisiert werden?
Wenn ja: wie ist das zu erreichen?

Nein, dem ist nicht so, die Spalte wird mit dem Spaltenamen "Anzahl" zurückgegeben.
Die Spalte kann auch Pustekuchen heißen wenn dann ein as folgt mit einer anderen Bezeichnung wird sie mit dieser Bezeichnung ausgegeben.

Grüße
Klaus

Lemmy 28. Apr 2023 13:35

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Zitat:

Zitat von Schleifchen (Beitrag 1521758)
Habt Dank für Eure Mühe:thumb: nun ist alles bisschen klarer.

Protipp für die Zukunft: ;-)
Lass deine Fragen stehen, sie können insbesondere denen helfen, die irgendwann in Zukunft nach einer Lösung zu ihrer Frage sind und über deine Frage jetzt leider nicht mehr stolpern können.

Schleifchen 28. Apr 2023 13:38

AW: Datenbankabfrage:'SELECT COUNT(*) FROM DB'
 
Ja, klar - ich lasse zukünftig die Beiträg wie sie sind. Ich meinte den Hinweis auf das Alias nicht gelesen zu haben. Aber es war ja schon eine neuer Beitrag.

Also, alles perfekto - Danke
Stefan


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