Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Probleme mit datetime und TSQLQuery (https://www.delphipraxis.net/115693-probleme-mit-datetime-und-tsqlquery.html)

toyoman 16. Jun 2008 13:39

Datenbank: Interbase • Version: 7.1 • Zugriff über: DBXpress

Probleme mit datetime und TSQLQuery
 
Hallo

Habe seit Delphi 2007 folgendes Problem (Programm wurde ursprünglich mit Delphi7 geschrieben).

siehe Code:

Delphi-Quellcode:
   // Mutationsuser und Mutationsdatum eintragen
   wdatum:=strtodatetime(formatdatetime('dd.MM.yyyy hh:nn', now));
   updPersonal.ParamByName('MUTDATUM').AsTime:=wdatum;
   //   showmessage(datetimetostr(updPersonal.Params.ParamByName('MUTDATUM').AsTime));  // TEST
   updPersonal.ParamByName('MUTUSER').AsString:=uppercase(username);
updPersonal ist eine TSQLQuery. Mithilfe dieser Komponente wird ein Update auf eine Tabelle durchgeführt. In ein Feld MUTDAUM wird das aktuelle Datum inkl. Uhrzeit eingetragen. Ich weise der Variable wdatum (tdate) das Datum und Zeit zu.
Wenn ich die Variable wdatum auslese oder anzeigen lasse stimmt das Datum auch perfekt. Auch nach der Zuweisung (siehe showmessage Zeile) wird das korrekte Datum angezeigt.

ABER:
in der Tabelle ist nach dem Vorgang folgendes gespeichert: 30.12.1899 13:40:00
Das Datum ist falsch (also wie leer), die Zeit aber stimmt.

Wie kommt sowas?

shmia 16. Jun 2008 13:43

Re: Probleme mit datetime und TSQLQuery
 
Delphi-Quellcode:
updPersonal.ParamByName('MUTDATUM').AsTime:=wdatum;  // Falsch
updPersonal.ParamByName('MUTDATUM').AsDateTime:=Now;  // Richtig

toyoman 16. Jun 2008 13:48

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von shmia
Delphi-Quellcode:
updPersonal.ParamByName('MUTDATUM').AsTime:=wdatum;  // Falsch
updPersonal.ParamByName('MUTDATUM').AsDateTime:=Now;  // Richtig

diese Änderung bringt leider nichts. So hatte ich es anfangs in Delphi 7 und auch damals hat das nicht gefunzt, darum hab ich es dann umgebaut mit dieser formatdatetime Geschichte.
Resultat wenn ich deine "richtige" Variante einbaue:
30.12.1899 14:45:39
-> Zeit korrekt, Datum nicht

showmessage(datetimetostr(now)); bringt das korrekte Datum, Zeit...

RavenIV 16. Jun 2008 14:09

Re: Probleme mit datetime und TSQLQuery
 
Was willst Du eigentlich mit der Datumsformatierung erreichen?
Now ist vom Typ TDateTime und das kann man natürlich mit AsDateTime zuweisen.
Und Du MUSST AsDateTime verwenden, wenn Du Datum und zeit haben willst.

Ich tippe eher, dass das DB-Feld nur ein Time-Feld ist und nicht DateTime.

Ein Bisschen mehr Code wäre auch nicht schlecht.
z.B. das, wo Du das Query zusammenbaust.

shmia 16. Jun 2008 14:22

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von RavenIV
Ich tippe eher, dass das DB-Feld nur ein Time-Feld ist und nicht DateTime.

Ja, Firebird/Interbase hat hier drei Datentypen: DATE | TIME | TIMESTAMP. Demnach wäre TIMESTAMP wohl richtig.

toyoman 16. Jun 2008 14:27

Re: Probleme mit datetime und TSQLQuery
 
du meinst so:
Delphi-Quellcode:
updPersonal.ParamByName('MUTDATUM').AsDateTime:=now;
wollte ich ursprünglich wie gesagt so machen. Funktioniert aber nicht. Fehlermeldung:
Exception der Klasse EDatabaseError mit der Meldung 'Fehlender Wert für Parameter 'MUTDATUM' aufgetreten. Darum der Handstand mit der Datumsformatierung.

Die Query wird so gefüllt:
Delphi-Quellcode:
// Update Query mit Statement versehen
       queryfuellen(updPersonal,'SQL_UPDATE_PERSONAL_DIVERSE.dat','MAD_PERSONAL');
wobei queryfuellen eine Funktion von mir ist:

Delphi-Quellcode:
procedure QueryFuellen(var queryname: TSQLQuery; prgpath, dateiname, tabellenname : string);
var str:TStringList;
begin
   // SQL Statement einlesen (SQL Strings)
   if fileexists(prgpath+dateiname) then
   begin
       str:=TStringList.Create;  // eingebaut aufgrund von Problemen in Delphi 2007 (direkt loadfromfile verwenden hat nicht mehr funktioniert)
       str.LoadFromFile(prgpath+dateiname);  // 21.05.2008 nsa

       queryname.SQL.Text:=str.text;
       str.free;
       //TQuery(FindComponent(queryname)).SQL.Text
   end else
   begin
       Application.Messagebox(pchar(tabellenname+': SQL Datei: '+prgpath+dateiname+' nicht gefunden!'),pchar('FEHLER'),MB_OK or MB_ICONWARNING);
   end;
end;
Glaube zwar nicht, dass das weiterhilft. Es ist ein normales befüllen mit einem SQL Statement bei welchem dann die Parameter einzeln zugewiesen werden. Das funktioniert ja auch bei allen anderen Feldern nur bei diesen ERSTELLDATUM und MUTDATUM Feldern, welche in Interbase als DATE Felder definiert sind (Datum und Zeit) nicht mehr.

Wie gesagt vorher in Delphi 7 hat alles gefunzt ohne Codeänderung!

Zitat:

Zitat von RavenIV
Was willst Du eigentlich mit der Datumsformatierung erreichen?
Now ist vom Typ TDateTime und das kann man natürlich mit AsDateTime zuweisen.
Und Du MUSST AsDateTime verwenden, wenn Du Datum und zeit haben willst.

Ich tippe eher, dass das DB-Feld nur ein Time-Feld ist und nicht DateTime.

Ein Bisschen mehr Code wäre auch nicht schlecht.
z.B. das, wo Du das Query zusammenbaust.


RavenIV 16. Jun 2008 14:34

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von toyoman
Die Query wird so gefüllt:
Delphi-Quellcode:
// Update Query mit Statement versehen
       queryfuellen(updPersonal,'SQL_UPDATE_PERSONAL_DIVERSE.dat','MAD_PERSONAL');

Und was steht in der Datei drin?
Das wäre auch interessant.

Weiterhin kannst Du anstelle von .AsDateTime auch mal .Value versuchen.
Dann sollte "automatisch" der richtige Datentyp genommen werden.

toyoman 16. Jun 2008 14:37

Re: Probleme mit datetime und TSQLQuery
 
du willst aber auch alles wissen :)
bitteschön:

SQL-Code:
update mad_personal set
AKTIV='J',MADFIRMA=:MADFIRMA,KURZZ=:KURZZ,PERSONALNR=:PERSONALNR,NAME=:NAME,MITSTATUS=:MITSTATUS,JAHR=:JAHR,
ADRNR=:ADRNR,PERSONAL_ID=:PERSONAL_ID,PERS_TYP=:PERS_TYP,GEBURTSDATUM=:GEBURTSDATUM,
EINTRITT=:EINTRITTSDATUM,AUSTRITT=:AUSTRITTSDATUM,STDSATZ=:STUNDENSATZ,PERSGRUPPE=:PERSONALGRUPPE,BENUTZER=:BENUTZER,
VORNAME=:VORNAME,APPL_SPRACHE=:APPL_SPRACHE,KALENDERDEF_ID=:KALENDER_ID,FUNKTION_ID=:FUNKTIONID,ARBEITSVERTRAG_PROZENT=:ANSTELLUNGSPROZ,
MUTUSER=:MUTUSER,MUTDATUM=:MUTDATUM
where
PERSONALNR = '$NUMMER' and MADFIRMA = :MADFIRMA
Zitat:

Zitat von RavenIV
Zitat:

Zitat von toyoman
Die Query wird so gefüllt:
Delphi-Quellcode:
// Update Query mit Statement versehen
       queryfuellen(updPersonal,'SQL_UPDATE_PERSONAL_DIVERSE.dat','MAD_PERSONAL');

Und was steht in der Datei drin?
Das wäre auch interessant.

Weiterhin kannst Du anstelle von .AsDateTime auch mal .Value versuchen.
Dann sollte "automatisch" der richtige Datentyp genommen werden.


toyoman 16. Jun 2008 14:40

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von RavenIV
Weiterhin kannst Du anstelle von .AsDateTime auch mal .Value versuchen.
Dann sollte "automatisch" der richtige Datentyp genommen werden.

bei Verwendung von .value krieg ich folgende Exception:
SQL error code = -303
conversion error from string "39615.65138888889 " aufgetreten

toyoman 16. Jun 2008 14:52

Re: Probleme mit datetime und TSQLQuery
 
Funktioniert nun:

updPersonal.ParamByName('MUTDATUM').asString:=form atdatetime('dd.MM.yyyy hh:nn', now);

ist mir zwar nicht klar warum aber wenn ich das als String zuweise gehts....

RavenIV 16. Jun 2008 14:58

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von toyoman
Funktioniert nun:

updPersonal.ParamByName('MUTDATUM').asString:=form atdatetime('dd.MM.yyyy hh:nn', now);

ist mir zwar nicht klar warum aber wenn ich das als String zuweise gehts....

Kann es sein, dass das Feld in der DB kein Datum-Zeit-Feld ist, sondern vom Typ VarChar oder so?

toyoman 16. Jun 2008 15:00

Re: Probleme mit datetime und TSQLQuery
 
Nein ist als DATE definiert also klar ein Datumsfeld.

Zitat:

Zitat von RavenIV
Zitat:

Zitat von toyoman
Funktioniert nun:

updPersonal.ParamByName('MUTDATUM').asString:=form atdatetime('dd.MM.yyyy hh:nn', now);

ist mir zwar nicht klar warum aber wenn ich das als String zuweise gehts....

Kann es sein, dass das Feld in der DB kein Datum-Zeit-Feld ist, sondern vom Typ VarChar oder so?


RavenIV 16. Jun 2008 15:13

Re: Probleme mit datetime und TSQLQuery
 
<Klugscheiss ein>
Die meisten Leute schreiben die Antwort auf ein Zitat unter das Zitat.

Also so:
*********************

Zitat:

Zitat von toyoman
Funktioniert nun:

updPersonal.ParamByName('MUTDATUM').asString:=form atdatetime('dd.MM.yyyy hh:nn', now);

ist mir zwar nicht klar warum aber wenn ich das als String zuweise gehts....

Kann es sein, dass das Feld in der DB kein Datum-Zeit-Feld ist, sondern vom Typ VarChar oder so?

**********************

<Klugscheiss aus>

toyoman 16. Jun 2008 15:18

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von RavenIV
<Klugscheiss ein>
Die meisten Leute schreiben die Antwort auf ein Zitat unter das Zitat.

Also so:
*********************

Zitat:

Zitat von toyoman
Funktioniert nun:

updPersonal.ParamByName('MUTDATUM').asString:=form atdatetime('dd.MM.yyyy hh:nn', now);

ist mir zwar nicht klar warum aber wenn ich das als String zuweise gehts....

Kann es sein, dass das Feld in der DB kein Datum-Zeit-Feld ist, sondern vom Typ VarChar oder so?

**********************

<Klugscheiss aus>

ok, das hab ich mich jedesmal gefragt, wie soll ich das jetzt machen -> oben oder unten? danke für die info. obwohl ich gern alles etwas anders mach als alle :)

zum glück hast du klugscheiss am schluss wieder ausgeschaltet! ;)

mkinzler 16. Jun 2008 15:22

Re: Probleme mit datetime und TSQLQuery
 
Handelt es sich um eine alte Dialect-1 DB? Denn DATE sollte keine Zeitanteil haben.
Welchen Typ hat der Parameter?

toyoman 16. Jun 2008 15:26

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von mkinzler
Handelt es sich um eine alte Dialect-1 DB? Denn DATE sollte keine Zeitanteil haben.
Welchen Typ hat der Parameter?

Jetzt fragst du mich was... keine Ahnung ehrlichgesagt. Wie kann ich das rausfinden?

mkinzler 16. Jun 2008 15:29

Re: Probleme mit datetime und TSQLQuery
 
Sollte in den Verbindungsoptionen stehen

toyoman 16. Jun 2008 15:38

Re: Probleme mit datetime und TSQLQuery
 
Zitat:

Zitat von mkinzler
Sollte in den Verbindungsoptionen stehen

ja scheint eine Dialect 1 DB zu sein. Ich geben den Parameter SQLDialect = 1 mit....
ich kann zwar auch SQLDialect = 3 mitgeben, scheint keinen Unterschied zu machen...

mkinzler 16. Jun 2008 15:42

Re: Probleme mit datetime und TSQLQuery
 
Wenn die DB Dialect-1 ist bringt der Parameter nichts. Mach mal testweise ein Backup/Restore


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