Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage nach Datum (https://www.delphipraxis.net/70227-abfrage-nach-datum.html)

davar 27. Mai 2006 07:18

Datenbank: MySQL • Version: 4.x • Zugriff über: Zeos

Abfrage nach Datum
 
Hallo Leute,

man merkt wohl, dass ich wieder hart am Arbeiten bin :wink:

Die Frage wurde schon einige Male gestellt, habe die verschiedenen Varianten auch ausprobiert - geht aber immer noch nicht.

Also folgende Abfrage:

Delphi-Quellcode:
DecodeDate(DTPvon.date, Jahr, Monat, Tag);
sdatumvon:= inttostr(Jahr) + '-' + inttostr(Monat) + '-' + inttostr(Tag);

query.SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE datum > ' + sdatumvon;
geht nicht.

Ebenso auch das hier:

Delphi-Quellcode:
DecodeDate(DTPvon.date, Jahr, Monat, Tag);
sdatumvon:= inttostr(Jahr) + '-' + inttostr(Monat) + '-' + inttostr(Tag);

DecodeDate(DTPbis.date, Jahr, Monat, Tag);
sdatumbis:= inttostr(Jahr) + '-' + inttostr(Monat) + '-' + inttostr(Tag);

query.SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE datum BETWEEN ' + sdatumvon + ' AND ' + sdatumbis;
Das Datum wird dabei überhaupt nicht berücksichtigt.

Mit
Delphi-Quellcode:
showmessage(query.Fieldbyname('datum').AsString);
wird mir z.B. "15.05.2006" angezeigt. Sollte hier nicht eigentlich das Format YYYY-MM-DD verwendet werden? Und wenn ich das datum nicht umkodiere, sondern direkt "DTPvon.date" nehme, bekomme ich auch eine Fehlermeldung, diesmal, dass die SQL-Syntax nicht korrekt ist..


Jetzt hab ich mal zum Test
Delphi-Quellcode:
query.SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE datum < ' + sdatumvon;
eingegeben und nun werden mir alle Datensätze angezeigt, in denen das Datum leer ist..

Irgendwie weiss ich nicht mehr weiter..

MfG

davar

marabu 27. Mai 2006 07:27

Re: Abfrage nach Datum
 
Guten Morgen.

Wenn du mit Parametern arbeitest, dann vergisst du nicht deine Datum-Strings in Hochkommata einzupacken:

Delphi-Quellcode:
QuotedStr(sDatumVon)
Grüße vom marabu

davar 27. Mai 2006 07:47

Re: Abfrage nach Datum
 
Zitat:

Zitat von marabu
Guten Morgen.

Wenn du mit Parametern arbeitest, dann vergisst du nicht deine Datum-Strings in Hochkommata einzupacken:

Delphi-Quellcode:
QuotedStr(sDatumVon)
Grüße vom marabu

Das ist es gewesen. Danke!

Sharky 27. Mai 2006 07:50

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
... Das ist es gewesen. Danke!

Hai davar,

Du solltest trotzdem lieber mit Parametern arbeiten. Das hat riesen Vorteile.

davar 27. Mai 2006 08:01

Re: Abfrage nach Datum
 
Zitat:

Zitat von Sharky
Du solltest trotzdem lieber mit Parametern arbeiten. Das hat riesen Vorteile.

Hab ich vorhin versucht, hab aber eine Fehlermeldung bekommen. Bin dann davon ausgegangen, dass Zeos nicht so mit Parametern umgeht wie die normale TQuery-Komponente.

Was für Vorteile bringen denn Parameter? Bis jetzt habe ich keinen Unterschied festgestellt und so wie ich es jetzt mache war es eigentlich bequemer für mich..

Sharky 27. Mai 2006 08:11

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
... Was für Vorteile bringen denn Parameter? ...

Einer der Vorteile ist das Du dich nicht darum kümmern musst das die Daten im richtigen Format zum Server kommen. Gerade bei DateTime-Feldern musst Du ja, wenn Du es als String übergibst, immer wissen wie die Datenbank das Datum haben möchte.
Mit Parametern sähe das einfach so aus:
Delphi-Quellcode:
begin
  with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM arbeitszeit WHERE datum BETWEEN :datumvon AND :datumbis';
    ParamCheck := True;
    ParamByName('datumvon').AsDate := DTPvon.date;
    ParamByName('datumbis').AsDate := DTPbis.date;
    Open;
  end;
end;

davar 27. Mai 2006 08:27

Re: Abfrage nach Datum
 
Genau so
Delphi-Quellcode:
with query do
begin
     Close;
     SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE kundennummer = ' + querykunden.Fieldbyname('kundennummer').AsString + ' AND datum BETWEEN :datumvon AND :datumbis' ;
     ParamCheck:= true;
     ParamByName('datumvon').AsDate := DTPvon.date;
     ParamByName('datumbis').AsDate := DTPbis.date;
     Open;
end;
hab ich es jetzt gemacht, aber nun kommt die Meldung "Parameter 'kundennummer' nicht gefunden.' " Und genauso mit "datumvon", wenn ich "kundennummer" weglasse. Kann es sein, dass TZMySQLQuery anders mit Parametern umgeht als TQuery?

Sharky 27. Mai 2006 08:34

Re: Abfrage nach Datum
 
Hmmm ich arbeite ja auch mit den Zeos-Komponenten für den Zugriff auf mySQL. Ich würde es mal so versucben:

Delphi-Quellcode:
with query do
begin
     Close;
     SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE (kundennummer = :kundennummer) AND (datum BETWEEN :datumvon AND :datumbis)';
     ParamCheck:= true;
     ParamByName('kundennummer').AsString := querykunden.Fieldbyname('kundennummer').AsString;
     ParamByName('datumvon').AsDate := DTPvon.date;
     ParamByName('datumbis').AsDate := DTPbis.date;
     Open;
end;
Aber noch eine andere Frage: Warum speicherst Du die Kundennummer in der Arbeitszeittabelle? Besser wäre doch die ID (PrimaryKey) als Referenz zu verwenden.
Ach ja, ist die "Kundennummer" ein String oder nur eine Zahl? Wenn eine Zahl könntest Du natürlich auch .AsInteger als Übergabeformat benutzen.

davar 27. Mai 2006 08:56

Re: Abfrage nach Datum
 
Zitat:

Zitat von Sharky
Hmmm ich arbeite ja auch mit den Zeos-Komponenten für den Zugriff auf mySQL. Ich würde es mal so versucben:

Delphi-Quellcode:
with query do
begin
     Close;
     SQL.text:= 'SELECT * FROM `arbeitszeit` WHERE (kundennummer = :kundennummer) AND (datum BETWEEN :datumvon AND :datumbis)';
     ParamCheck:= true;
     ParamByName('kundennummer').AsString := querykunden.Fieldbyname('kundennummer').AsString;
     ParamByName('datumvon').AsDate := DTPvon.date;
     ParamByName('datumbis').AsDate := DTPbis.date;
     Open;
end;

Nein, auch so hilft es nicht. Bin schon kurz davor, das Arbeiten mit Parametern aufzugeben. Immer noch die gleiche Fehlermeldung.

Zitat:

Zitat von Sharky

Aber noch eine andere Frage: Warum speicherst Du die Kundennummer in der Arbeitszeittabelle? Besser wäre doch die ID (PrimaryKey) als Referenz zu verwenden.

Es werden die Arbeitszeiten von mehreren Kunden erfasst und es gibt eine Spalte für die Mitarbeiternummer, damit man mit den selben Daten die Arbeitszeit der Mitarbeiter ermitteln kann.

Zitat:

Zitat von Sharky
Ach ja, ist die "Kundennummer" ein String oder nur eine Zahl? Wenn eine Zahl könntest Du natürlich auch .AsInteger als Übergabeformat benutzen.

Hab ich auch als Integer versucht, aber daran liegt es auch nicht.. :cry:

Sharky 27. Mai 2006 09:03

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
... Kann es sein, dass TZMySQLQuery anders mit Parametern umgeht als TQuery?

Mit welcher Zeos-Version arbeitest Du denn? Bei mir heisst die Zeos-Query-Klasse: TZQuery.

mkinzler 27. Mai 2006 09:19

Re: Abfrage nach Datum
 
Zitat:

Zitat von Sharky
Mit welcher Zeos-Version arbeitest Du denn? Bei mir heisst die Zeos-Query-Klasse: TZQuery.

Bis einschließlich Zeos 4, gab es getrennte Kompos für die verschiedenen DBMS.
@davar: Mach mal eine Update auf eine aktuelle Version von Zeos.
Zitat:

Zitat von davar
Hab ich auch als Integer versucht, aber daran liegt es auch nicht..

Und warum hast du dann wieder einen string genommen.
@davar: Wird zum Kunden mehr als die Kundennummer gespeichert? Dann würde ich, wie Sharky schon geschrieben hat, die Daten normalisieren (alle Daten zu Kunden in eigene Tabelle) Oder ist die Kundennummer ein Fremdschlüsssel auf die Kundentabelle? Dann solltest du dir überlegen, der Kundentabelle einen künstlichen Primärschlüssel in Form einer ID( Integer) zu verpassen. (So das man die Kundennummer ändern könnte).
Zitat:

Zitat von davar
.. Was für Vorteile bringen denn Parameter? ...

Neben dem Vorteil, das man sich nicht um die Typen der Parameter kümmern muß, wie schon Skarky erwähnt hat, haben Parameter den Vorteil das wenn ein Query öfters verwendet wird, nicht immer der ganze Query an den Server geschickt werden muß, sondern nur die Parameter. Je nach DBMS entfällt dann auch das "Compilieren" der Abfragen, was weitere Geschwindigkeitsvorteile bringt.

marabu 27. Mai 2006 11:03

Re: Abfrage nach Datum
 
Zitat:

Zitat von davar
Kann es sein, dass TZMySQLQuery anders mit Parametern umgeht als TQuery?

Der Umgang mit den Parametern ist in der gemeinsamen Vorgängerklasse TDataSet implementiert. Mit Version 6.5.1 funktioniert bei mir übrigens alles wie erwartet.

Da es sich bei der Tabelle ARBEITSZEITEN um einen sogenannten Beziehungs-Datentyp (associative entity) handelt, sollten da wirklich nur Fremdschlüssel verwendet werden.

marabu


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