Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQLQuery Datensätze mit Bedingung zählen (https://www.delphipraxis.net/163555-sqlquery-datensaetze-mit-bedingung-zaehlen.html)

Nico93 4. Okt 2011 12:34

Datenbank: Firebird • Version: 2.5 • Zugriff über: ibexpert

SQLQuery Datensätze mit Bedingung zählen
 
Hallo Zusammen,

ich bin noch Neuling und habe daher leider noch nicht so die Ahnung.
Auch nach langem Suchen habe ich noch keine Lösung für mein Problem gefunden.

Zum Problem:

Ich habe eine Datenbank, welche unter anderem eine Spalte Datum enthält.
Über ein SQLQuery möchte ich jetzt die Anzahl der Datensätze ermitteln, welche in einem bestimmten Zeitraum befinden.
Dazu habe ich folgendes versucht, was mir jedoch immer die Fehlermeldung "Unknown Column xxxxxxxx at line xxxxxx" zurückgibt.
Die Variablen "von" und "bis" werden durch ein DateTimePicker ermittelt und direkt in einen string umgewandelt.

Code:
SQLQuery1.close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.ADD('SELECT COUNT (*) AS Z FROM AUSGABEN WHERE DATUM BETWEEN '+von+' and '+bis);
SQLQuery1.EXECSQL;
SQLQuery1.open;
ausgaben := SQLQuery1.FieldByName ('Z').AsInteger;
Wäre super wenn mir jemand weiterhelfen könnte.

p80286 4. Okt 2011 12:38

AW: SQLQuery Datensätze mit Bedingung zählen
 
Zitat:

Zitat von Nico93 (Beitrag 1128311)
Ich habe eine Datenbank, welche unter anderem eine Spalte Datum enthält.

Und welches Format hat sie?

Gruß
K-H

Nico93 4. Okt 2011 12:39

AW: SQLQuery Datensätze mit Bedingung zählen
 
Das Format der Spalte DATUM ist "Date"

FaTaLGuiLLoTiNe 4. Okt 2011 12:50

AW: SQLQuery Datensätze mit Bedingung zählen
 
Wieso machst du erst ein ExecSQL und dann nochmal ein Open?

Ich kenne IBExpert zwar nicht, aber bei allen mir bekannten Query-Komponenten führt man Abfragen (SELECT) mit Open aus und Datenmanipulationen (INSERT, UPDATE) mit ExecSQL. Ersteres sollte in diesem Fall also reichen.

Nico93 4. Okt 2011 12:56

AW: SQLQuery Datensätze mit Bedingung zählen
 
Liste der Anhänge anzeigen (Anzahl: 1)
habe ich gerade ausprobiert aber bringt leider immer noch nichts es kommt dauernd folgende Fehlermeldung, wie im Anhang zu sehen.

FaTaLGuiLLoTiNe 4. Okt 2011 12:59

AW: SQLQuery Datensätze mit Bedingung zählen
 
Anführungszeichen um die Datumsangaben machen. Oder, noch VIEL besser: Parameter verwenden.

//edit:

Delphi-Quellcode:
SQLQuery.Close;
SQLQuery.SQL.Clear;
SQLQuery.SQL.Add('SELECT COUNT (*) AS Z FROM Ausgaben WHERE Datum BETWEEN :von AND :bis');
SQLQuery.ParamByName('von').AsDate := Von;
SQLQuery.ParamByName('bis').AsDate := Bis;
SQLQuery.Open;
Nur mal so, ungetestet.

mschaefer 4. Okt 2011 13:01

AW: SQLQuery Datensätze mit Bedingung zählen
 
Delphi-Quellcode:
SELECT * FROM Orders WHERE Orderdate >= '2009-05-09' AND Orderdate <'2012-04-15'


Grüße in die Runde

DeddyH 4. Okt 2011 13:04

AW: SQLQuery Datensätze mit Bedingung zählen
 
BETWEEN muss eigentlich auch gehen, vermutlich waren von und bis nur nicht befüllt. Das würde zumindest die Fehlermeldung plausibel erklären.

vagtler 4. Okt 2011 13:05

AW: SQLQuery Datensätze mit Bedingung zählen
 
Zitat:

Zitat von mschaefer (Beitrag 1128329)
Delphi-Quellcode:
SELECT * FROM Orders WHERE Orderdate >= '2009-05-09' AND Orderdate <'2012-04-15'

Was hast Du gegen BETWEEN?

p80286 4. Okt 2011 13:13

AW: SQLQuery Datensätze mit Bedingung zählen
 
Zitat:

Zitat von vagtler (Beitrag 1128333)
Zitat:

Zitat von mschaefer (Beitrag 1128329)
Delphi-Quellcode:
SELECT * FROM Orders WHERE Orderdate >= '2009-05-09' AND Orderdate <'2012-04-15'

Was hast Du gegen BETWEEN?

vermutlich garnichts?
aber es gibt SQL-Dialekte, die sich da etwas zickig anstellen.

Gruß
K-H

jobo 4. Okt 2011 13:19

AW: SQLQuery Datensätze mit Bedingung zählen
 
Vielleicht hilft ein QuotedStr, wenn man unbedingt auf die Parametrierung verzichten will.

Nico93 4. Okt 2011 13:24

AW: SQLQuery Datensätze mit Bedingung zählen
 
Super das war die Lösung.

Sieht jetzt wie folgt aus:

Code:
SQLQuery1.close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT (*) AS Z FROM AUSGABEN WHERE DATUM BETWEEN ('+QuotedStr(von)+') AND ('+QuotedStr(bis)+')');
SQLQuery1.open;
ausgaben := SQLQuery1.FieldByName('Z').AsInteger;
Vielen Dank für die Hilfen.

DeddyH 4. Okt 2011 13:27

AW: SQLQuery Datensätze mit Bedingung zählen
 
Parameter wären trotzdem besser. Irgendwie erscheint es mir unlogisch, ein Datenformat(TDate) in ein anderes (String) zu pressen, welches man dann auch noch aufbereiten (QuotedStr) muss.

Nico93 4. Okt 2011 13:29

AW: SQLQuery Datensätze mit Bedingung zählen
 
wie würde das denn aussehen?

ich habe eben versucht mit:
Code:
SQLQuery.ParamByName('von').AsDate := von;
und dann sagt er mir dauernd "Parameter nicht gefunden"

DeddyH 4. Okt 2011 13:34

AW: SQLQuery Datensätze mit Bedingung zählen
 
Wie hast Du die Parameter denn definiert? So wie in #6 mit Doppelpunkten? Dann sollten sie eigentlich gefunden werden.

Nico93 4. Okt 2011 13:39

AW: SQLQuery Datensätze mit Bedingung zählen
 
Ja wenn ich wie in #6 die Parameter definiere, dann sagt Delphi mir, dass "Z" nicht gefunden wurde.
Wenn ich die Zeile SQLQuery.SQL.ADD(.....); unter die beiden Zeilen SQLQuery.parambyname.... setze dann kommt die Meldung,
dass die Parameter nicht gefunden werden.

DeddyH 4. Okt 2011 13:41

AW: SQLQuery Datensätze mit Bedingung zählen
 
Zeig nochmal den kompletten Code, da ist bestimmt nur ein kleiner Fehler drin.

Nico93 4. Okt 2011 13:44

AW: SQLQuery Datensätze mit Bedingung zählen
 
Code:
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT (*) AS Z FROM AUSGABEN WHERE DATUM BETWEEN :von AND :bis');
SQLQuery1.ParamByName('von').AsDate := Von;
SQLQuery1.ParamByName('bis').AsDate := Bis;
SQLQuery1.Open;

DeddyH 4. Okt 2011 13:46

AW: SQLQuery Datensätze mit Bedingung zählen
 
Das sieht eigentlich korrekt aus. Was geschieht, wenn Du mal testhalber den Feldalias Z weglässt?

vagtler 4. Okt 2011 13:51

AW: SQLQuery Datensätze mit Bedingung zählen
 
Zitat:

Zitat von p80286 (Beitrag 1128336)
[...] vermutlich garnichts? [...]

Vermuten kann man viel und bringt fachlich rein gar nichts.

Zitat:

aber es gibt SQL-Dialekte, die sich da etwas zickig anstellen.
Das verwendete RDBMS ist angegeben.

Nico93 4. Okt 2011 13:56

AW: SQLQuery Datensätze mit Bedingung zählen
 
So jetzt habe ich die Lösung.
Funktioniert mit dem Parametern viel besser.
Wenn ich die Parameter als .value definiere, dann funktioniert auch alles.

Hier der Quelltext:

Code:
SQLQuery1.Close;
SQLQuery1.SQL.Clear;
SQLQuery1.SQL.Add('SELECT COUNT (*) AS Z FROM AUSGABEN WHERE DATUM BETWEEN :von AND :bis');
SQLQuery1.ParamByName('von').value := von;
SQLQuery1.ParamByName('bis').value := bis;
SQLQuery1.Open;
Vielen Dank nochmal für die Hilfen

DeddyH 4. Okt 2011 13:58

AW: SQLQuery Datensätze mit Bedingung zählen
 
Das wäre mein nächster Vorschlag gewesen. Das dauert zwar evtl. einen kleinen Tick länger, dafür muss man sich im Normalfall aber um den passenden Datentyp keinen Kopf machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf