Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Abfrage mit Where Bedingung auf einen Zeitraum (https://www.delphipraxis.net/34430-sql-abfrage-mit-where-bedingung-auf-einen-zeitraum.html)

stonimahoni 23. Nov 2004 08:54


SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
hi leute.

ich hab folgendes problem :

ich möchte mir datensätze aus meiner access db filtern und anzeigen lassen per sql befehl die in einem bestimmten zeitraum liegen.


anbei mein codeschnipsel :

Delphi-Quellcode:
     sqlstr := 'SELECT auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.TatGarantie,'
     + 'hersteller.Herstellernr, hersteller.Firma,'
     + 'Sum(auftrag.Gesamtkostrep) AS [Summe von Gesamtkostrep], auftrag.Abgeholt '
     + 'FROM wgr INNER JOIN (hersteller INNER JOIN auftrag ON hersteller.Herstellernr = auftrag.Herstellernr) '
     + 'ON wgr.Wgr = auftrag.Wgr GROUP BY auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.TatGarantie, '
     + 'hersteller.Herstellernr, hersteller.Firma, auftrag.Abgeholt where Annahmedatum between '+ von.text + ' and ' + bis.text ;

von und bis.text sind jeweils edit felder in denen ich das datum ( den zeitraum ) eingebe.
mein primäres problem besteht darin, dass der mir abkackt wenn ich den selectbefehl abschicke - und zwar zeit er mir an, dass am ende von meinem string noch ein gänsefüsschen sei ( " ) oder ein ( ' )
und ich weiss net wo der das herholt ?! :((

und noch ne frage nebenher : muss ich die editfelder selber oder hier im code speziell was abändern damit der rafft das ich ein datum eingebe oder is das egal ? in der db ist das feld ein datumsfeld.


hoffe ihr könnt mir helfen :/

mfg

stoni

DerAndereMicha 23. Nov 2004 09:20

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Probiers mal mit QuotedStr(von.text) bzw. QuotedStr(bis.text). Weiß
zwar nicht ob Access genauso reagiert wie der SQL-Server, aber ich vermute mal ja.

shmia 23. Nov 2004 09:23

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Ein Vergleich mit Datumsfeldern ist immer etwas problematisch.
Deshalb sollte man unbedingt Parameter verwenden:
Delphi-Quellcode:
SQL.TEXT := ....'where Annahmedatum >= :Von AND Annahmedatum < :Bis';
ADOQuery1.Parameters.ParamValues['Von'] := Date-30.0; // =Heute vor 30 Tagen
ADOQuery1.Parameters.ParamValues['Bis'] := Date;
ADOQuery1.Open;

AlphaBug 23. Nov 2004 09:26

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Hallo stonimahoni :hi:

Wenn möglich, dann würde ich für die Datumswerte Parameter benutzen,
oder es mit QuotedStr versuchen.

Desweiteren gehört imho die Where-Klausel vor das Group-By :gruebel: .
(Lasse mich auch gern eines besseren belehren)

stonimahoni 23. Nov 2004 10:04

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
hi leute

danke erstmal für eure hilfe

@ shmia : deinen code kapier ich nicht ganz und weiss nicht den bei mir einzubauen weil bei dir sieht es nicht so aus als würdest du den inhalt der beiden editfelder abfragen und mit dem -3ß tagen - das brauch ich ja nicht und kann und mag ich auch nicht festlegen

@ deranderemicha und alphabug :
habs mit quotedstr(von.text) und quotedstr(bis.text) probiert :

so sieht mein code atm aus :

Delphi-Quellcode:
     sqlstr := 'SELECT auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.TatGarantie,'
     + 'hersteller.Herstellernr, hersteller.Firma,'
     + 'Sum(auftrag.Gesamtkostrep) AS [Summe von Gesamtkostrep], auftrag.Abgeholt '
     + 'FROM wgr INNER JOIN (hersteller INNER JOIN auftrag ON hersteller.Herstellernr = auftrag.Herstellernr) '
     + 'ON wgr.Wgr = auftrag.Wgr GROUP BY auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.TatGarantie, '
+ 'hersteller.Herstellernr, hersteller.Firma, auftrag.Abgeholt where Annahmedatum between ' + QuotedStr(von.text) + ' and ' + QuotedStr(bis.text);

folgende fehlermeldung kommt :
meldung : 'syntaxfehler ( fehlender operator ) in abfrageausdruck 'auftrag.abgeholt where
annahmedatum between 'datum das ich eingegeben habe' and 'datum das ich eingegeben habe'".
prozess wurde angehalten....

es geht wohl nur noch um das mist ( " ) am ende und ich weiss nicht woher das kommt :((

shmia 23. Nov 2004 10:14

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Zitat:

Zitat von stonimahoni
@ shmia : deinen code kapier ich nicht ganz und weiss nicht den bei mir einzubauen weil bei dir sieht es nicht so aus als würdest du den inhalt der beiden editfelder abfragen und mit dem -3ß tagen - das brauch ich ja nicht und kann und mag ich auch nicht festlegen

Na dann halt so:
Delphi-Quellcode:
SQL.TEXT := ....'where Annahmedatum >= :Von AND Annahmedatum < :Bis';
ADOQuery1.Parameters.ParamValues['Von'] := StrToDate(von.Text);
ADOQuery1.Parameters.ParamValues['Bis'] := StrToDate(bis.Text);
ADOQuery1.Open;
Ich würde dir empfehlen, die Edit-felder von und bis als TDateTimePicker anzulegen.
Nur so lässt sich sicherstellen, dass kein Unsinn als Datum eingegeben wird.

Hansa 23. Nov 2004 10:20

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
ICh habe shmias Beispiel etwas geändert (ist aber nicht so wichtig :

Zitat:

Zitat von shmia
Ein Vergleich mit Datumsfeldern ist immer etwas problematisch.
Deshalb sollte man unbedingt Parameter verwenden:
Delphi-Quellcode:
SQL.TEXT := ....'where Annahmedatum >= :Von AND Annahmedatum < :Bis';
ADOQuery1.Parameters.ParamByName('VON).AsDateTime := Datum1;
ADOQuery1.Parameters.ParamByName('Bis').AsDateTime := Datum2;
ADOQuery1.Open;

Was du jetzt nicht verstehst ist wohl, wo Datum1 und Datum2 herkommen ? Z.B. aus einem Edit :

Delphi-Quellcode:
Datum1 := StrToDate (Edit1.Text);

stonimahoni 23. Nov 2004 10:50

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
@ shmia : so hat er nur mit dem von und dem bis nix anfangen können

@ hansa : amt hab ich nur da problem das er folgendes hinschreibt : undefinierter bezeichner : 'asdatetime'

was nun ?

btw : ich hasse es so planlos zu sein :( :wall:

mikhal 23. Nov 2004 11:13

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Verwende statt "AsDateTime" "Value", dann sollte es funktionieren.

Grüße
Mikhal

s14 23. Nov 2004 11:18

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Hallo, schon mal so probiert?

Delphi-Quellcode:
sqlstr := 'SELECT auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.TatGarantie,'
     + 'hersteller.Herstellernr, hersteller.Firma,'
     + 'Sum(auftrag.Gesamtkostrep) AS [Summe von Gesamtkostrep], auftrag.Abgeholt '
     + 'FROM wgr INNER JOIN (hersteller INNER JOIN auftrag ON hersteller.Herstellernr = auftrag.Herstellernr) '
     + 'ON wgr.Wgr = auftrag.Wgr GROUP BY auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.TatGarantie, '
+ 'hersteller.Herstellernr, hersteller.Firma, auftrag.Abgeholt where Annahmedatum between ' + QuotedStr(von.text) + ' and ' + QuotedStr(bis.text) + '''';

stonimahoni 23. Nov 2004 11:19

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
oder auch nicht :(
@mikhal :
parameter 'von' wurde nicht gefunden ?!


@ s14 :

undefinierter bezeichner: 'b'
array typ erforderlich


:cry: :cry:

mikhal 23. Nov 2004 11:24

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Hast du im ObjectInspector die Parameter auch definiert? Sprich: Hast du festgelegt, welchen Typ die Daten haben (ftDateTime)?

Grüße
Mikhal

stonimahoni 23. Nov 2004 11:28

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
@ mikhal :

du meinst bei den iegenschaften der edit felder ?
wo kann ich dort das (ftDateTime) einstellen ????

s14 23. Nov 2004 11:40

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Zitat:

undefinierter bezeichner: 'b'
Ich wollte eigentlich die letzten Zeichen im SQLStr fett markieren, habe den Tag aber wieder entfernt weil er nicht korrekt angezeigt wurde. Ich wollte nur vermitteln, daß vielleicht nur das abschließende Anführungszeichen im SQLStr fehlt.

mikhal 23. Nov 2004 11:41

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
Nein, In deiner AdoQuery hast du doch Parameter festgelegt. Diesen Parametersn mußt du über die Eigenschaft Params den Datentyp mitgeben, sonst sind diese Parameter undefiniert.

Mir stellt sich jetzt die Frage, für welche Variante du dich entscheiden hast: Das Select-Statement mit Parametern (also WHERE Annahmedatum BETWEEN :Von AND :Bis...) oder die Variante, in der das Statement zusammengefrickelt wird. Beide haben Vor- und Nachteile, aber wie bereits festgestellt wurde, überwiegen bei Datumsfeldern die Vorteile eindeutig bei der Variante mit Parameterübergabe. Vielleicht solltest du nach der Parameterübergabe noch folgende Zeile in deinen Quelltext einfügen, bevor du die Query erneut öffnest:
Code:
AdoQuery1.Prepared := True;
Grüße
Mikhal

stonimahoni 23. Nov 2004 11:52

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
@ s14 : ne wird ja alles einwandfrei compiliert, nur beim ausführen bekomme ich dann nen fehler wie schon oben beschrieben mit den "gänsefüsschen" :(

@ mikhal :
ich probiere all eure vorschläge aus :)
atm bin ich bei folgendem :

Delphi-Quellcode:
     + 'hersteller.Herstellernr, hersteller.Firma, auftrag.Abgeholt where Annahmedatum >= :Von AND Annahmedatum < :Bis';
     ADOQR_Statistik.Parameters.ParamByName('Von').Value := Datum1;
     ADOQR_Statistik.Parameters.ParamByName('Bis').Value := Datum2;

s14 23. Nov 2004 12:14

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
@stonimahoni: Ich meinte ja auch nicht den Compiler, sondern tatsächlich das abschließende Anführungszeichen.
Nicht der Compiler braucht das, sehrwohl aber der DB-Server. 8)

stonimahoni 23. Nov 2004 15:17

Re: SQL Abfrage mit Where Bedingung auf einen Zeitraum
 
ok...hab das ganze teil gelöst *freu*

anbei der quellcode :
Delphi-Quellcode:
     with ADODataSetstatistik do begin
          Active:= False;
          sqlstr:= 'SELECT auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.Kostentraeger, auftrag.TatGarantie,'
          + ' hersteller.Firma, Sum(auftrag.Gesamtkostrep) AS [Summe von Gesamtkostrep] '
          + 'FROM wgr INNER JOIN (hersteller INNER JOIN auftrag ON hersteller.Herstellernr = auftrag.Herstellernr) '
          + ' ON wgr.Wgr = auftrag.Wgr '
          + 'where Annahmedatum between DATEVALUE ("' + von.Text + '") and DATEVALUE ("' + bis.Text +'") '
          + 'GROUP BY auftrag.Wgr, wgr.Wgr_Bezeichnung, auftrag.Kostentraeger, auftrag.TatGarantie, hersteller.Firma '
          + 'HAVING (((Sum(auftrag.Gesamtkostrep))>0));';
          CommandText := sqlstr;
          Active:= True;
so long... :)

mfg

stoni


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