Delphi-PRAXiS
Seite 1 von 2  1 2   

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....


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:07 Uhr.
Seite 1 von 2  1 2   

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