Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datum vergleichen (https://www.delphipraxis.net/1689-datum-vergleichen.html)

Barzy2x 18. Dez 2002 12:31


Datum vergleichen
 
Folgende Abfrage habe ich formuliert:
Code:
Query1.SQL.Add('SELECT Uhrzeit,Convert(datetime,convert(char(10),Datum,104)),Beschreibung FROM TestTabelle WHERE Datum < GetDate()');
Ich möchte aus der Tabelle, die Uhrzeit,Datum und Beschreibung enthält alle Datensätze anzeigen lassen die Datum kleiner aktuelles Datum beinhalten. Delphi meldet mir jedoch "Ungültiges Befehlsende Symbol String". Weiß jemand wo der Fehler liegt?

harrybo 18. Dez 2002 13:54

Hi Barzy2x,

In Deiner WHERE Klausel wird wahrscheinlich ein String erwartet, und der - weil Datum - wahrscheinlich noch in Hochkommata. Also versuch mal
Code:
SELECT ... +
'WHERE Datum < ' + QuotedStr(DateToStr(GetDate()));
Die Syntax ist hier allerdings datenbankabhängig

gruß, harrybo

P.S. Ich würde es hilfreich finden, wenn bei Fragen in diesem Forum immer von vorn herein auch mit angegeben würde, mit welcher Datenbank man arbeitet - es gibt einfach zu viele spezifische Unterschiede.

Barzy2x 18. Dez 2002 14:23

Arbeite mit einer Paradox Tabelle. Erhalte nun den Fehler : Ungültiges Schlüsselwort Symbol-String...

TheRebel 18. Dez 2002 14:46

Das Problem liegt höchstwahrscheinlich nicht nur im syntaktisch falschen Aufbau der SQL Anfrage. (funktionen bzw variablen von delphi müssen ausserhalb des strings stehen Query.Sql.Add('SQLANWEISUNG TEIL1 '+getdate()+'SQLANWEISUNG TEIL2'); sonst werden sie nicht ausgewertet)

Sondern wohl vorallem darin das das Local SQL von Delphi die CONVERT Funktion nicht kennt (siehe Handbuch Local Sql, irgendwo auf ihrer Harddisk, am besten nach sql suchen) Das Problem hatte ich auch schon.

Barzy2x 18. Dez 2002 17:25

Das hat mir schon weitergeholfen. Dennoch hänge ich immer noch an einem Problem. Welche SQL Anweisung vermittelt, das ich das Datum der Spalte mit dem aktuellen Datum auf dem System vergleichen will (z.B ...WHERE (Extract((month from Datum)) = aktDatum). ich kann nicht ein stat. Datum für aktDatum eingeben, da sich Delphi melden soll wenn ein bestimmtes Datum erreicht wurde. Weiß jemand wie ich mit SQL das Datum auf dem System erhalte?

xbu58 18. Dez 2002 17:47

Hallo Barzy

So wie ich verstehe, arbeitest Du mit Paradox. Bin deshalb nicht sicher, ob das funktioniert aber Du kannst einmal folgendes versuchen:

Code:
Select * from Tabelle where datumfeld > GetDate()
Auf SQLServer funktioniert das. Also versuch es einmal.

Gruss
Xaver

Barzy2x 18. Dez 2002 17:53

Das habe ich schon ausprobiert. Leider ohne Erfolg. Fehlermeldung: Merkmal nicht verfügbar. Scheint an Local SQL zu scheitern.

xbu58 18. Dez 2002 17:59

Ich denke, das heisst, dass Du in diesem Falle das SQL-Statement jedes mal vor der Aktivierung anpassen musst.

Ich würde das wie folgt machen:
SQL-Statement
Code:
SELECT * FROM TableName WHERE DataField > :CurDate
Aufruf in Delphi:
Code:
Query.ParamByName('CurDate').AsDateTime := Now;
Query.Active := true;
....
Gruss
Xaver

Barzy2x 18. Dez 2002 18:13

Muss ich den Parameter CurDate vorher deklarieren? Delphi meldet dass er ihn nicht findet...

xbu58 18. Dez 2002 18:20

Normalerweise wird dier Parameter automatisch erstellt, wenn Du das SQL-Statement im Delphi erfasst. Du kannst das nachsehen, indem Du das Property Params öffnest. Ev. musst Du hier noch das Property DataType definieren. Damit hat es sich.

Gruss
Xaver

Barzy2x 18. Dez 2002 18:38

Danke, das läuft. Zwar meldet delphi einen Fehler wenn es keine passenden datensätze findet, aber das kann ich sicher mit einer TRY EXCEPT bedingung abfangen.

MrSpock 19. Dez 2002 07:10

Hallo Barzy2x,

welchen Fehler meldet Paradox denn? Dass keine Datensätze gefunden werden ist ja kein Fehler, sondern wird durch eine leere Datenmenge gekennzeichnet, also könnte noch woanders ein Wurm drin sein.

Barzy2x 19. Dez 2002 07:28

Es wird ein, meiner Meinung nach, recht ungewöhnlicher Fehler gemeldet:
Ungültiges Schlüsselwort Symbolstring SELECT. Dies wird gemeldet wenn keine Datensätze gefunden werden und wenn die Abfrage ein zweites Mal ausgeführt wird.

MrSpock 19. Dez 2002 07:48

Hallo Barzy2x,

ich denke es ist eher umgekehrt: Es wird eine leere Datenmenge angezeigt, weil das SQL Statement nicht korrekt ist. Poste doch mal den aktuellen Code, der der SQL Eigenschaft seinen Inhalt gibt.

Barzy2x 19. Dez 2002 10:05

Das Problem liegt nicht darin das eine leere Datenmenge angezeigt wird. Die SQL Anweisung zeigt beim ersten Ausführen Datensätze an, wenn diese vorhanden sind. Wenn ich diese Abfrage jedoch nochmal starte wird der oben beschriebene Fahler angezeigt. Folgenden Code benutze ich zur Abfrage
Code:
procedure TTerminVerwaltung.BitBtn1Click(Sender: TObject);
begin

DatenbankOeffnen.Edit1.Text = 'Testtabelle.db'
Query1.ParamByName('CurDate').AsDate := date;
Query1.SQL.Add('SELECT Uhrzeit,Datum,Beschreibung FROM TestTabelle WHERE datum < :CurDate')
Query1.Open;
END;
Muss ich eventuell diese Abfrage in irgendeiner Form schließen, damit beim zweite Zugriff kein Fehler gemeldet wird?

harrybo 19. Dez 2002 10:47

Hi Barzy2x,
bei einem erneuten Aufruf einer Abfrage sollte diese, falls geöffnet zunächst geschlossen werden. Dein Problem liegt aber daran, dass das Property SQL eine Liste ist, und Du bei jedem Add dort eine Zeile hinzufügst. Beim erneuten Aufruf sollte daher die Liste gecleart werden, allerdings nur, wenn das SQL Statement sich ändert, ansonsten kann die Zeile einfach raus. Also:
Code:
procedure TTerminVerwaltung.BitBtn1Click(Sender: TObject);
begin
  with Query1 do begin
    if Active then
      Close;
    DatenbankOeffnen.Edit1.Text = 'Testtabelle.db'
    ParamByName('CurDate').AsDate := date;
    // nur wenn sich SQL ändert
    // SQL.Clear;
    // SQL.Add('SELECT ...')
    Open;
  end
end;
Als Hinweis noch: die Zeile DatenbankOeffnen.Edit1.Text = 'Testtabelle.db' wird unnötigerweise bei jeder Aktualisierung der Abfrage durchlaufen und ist daher hier nicht gut platziert. Für das Requery bietet sich eine eigene Routine an, an die als Parameter den variablen Wert der Abfrage, also den Parameter der Abfrage erhält:

Code:
procedure RequeryQuery1(ADate: TDateTime);
begin
  with Query1 do try
    DisableControls; //friert eventuelle Anzeig in Grid o.ä. ein
    if Active then
      Close;
    ParamByName('CurDate').AsDate := ADate;
    Open;
  finally
    EnableControls;
  end;
end;
Dann sähe Dein ButtonClick so aus:
Code:
procedure TTerminVerwaltung.BitBtn1Click(Sender: TObject);
begin
  DatenbankOeffnen.Edit1.Text = 'Testtabelle.db';
  RequeryQuery1(date);
end;
Vorteil dabei: Du kannst jederzeit per Code die Abfrage aktualisieren und die Routine macht auch wirklich nur, was draufsteht.

gruß, harrybo


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