Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireBird, Datentyp TIME clientseitig mit Delphi bestücken (https://www.delphipraxis.net/163722-firebird-datentyp-time-clientseitig-mit-delphi-bestuecken.html)

Daniel 13. Okt 2011 10:32

Datenbank: FireBird • Version: 2.5 • Zugriff über: FibPlus

FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Moin,

ich habe hier mit einer Datentpalte zutun, die vom Typ "TIME" ist. Wie setze ich deren Wert clientseitig in meiner Delphi-Anwendung? Gebe ich einen Timestamp, der nur einen Zeit-, aber keinen Datumswert enthält, bekomme ich einen Fehler, dass der Wert ungültig sei. Auch Tests mit fixen Ganz- oder Fließkommazahlen schlugen fehl. Nicht mal eine 0 (Zahlenwert) wird akzeptiert.

Ich hatte gehoft, dass ich auch diesen Wert wie üblich mit
Delphi-Quellcode:
FieldByName('...').Value:= xy
setzen kann. :gruebel:

tsteinmaurer 13. Okt 2011 10:37

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Hallo Daniel,

kann es vielleicht etwas mit dem Variant zu tun haben? Hast mal versucht native Zugriffs-Properties ala AsDateTime ... zu verwenden?

Daniel 13. Okt 2011 10:41

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Ja, .AsDateTime habe ich auch versucht - ohne Erfolg.


Ich sehe gerade, dass FibPlus ein .AsTime anbietet, laut Doku aber nur in der Query und nicht im DataSet - mal schauen, ob das so (noch) stimmt.

Lemmy 13. Okt 2011 11:03

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Hi,

Zitat:

In dialect 3, TIME stores the Time of day, with no date portion: "time-only". Storage is a 32-bit unsigned integer. Storable times range from 00:00 to 23:59:59.9999. ...

If time of day needs to be stored, extract the hours, minutes and seconds elements from the Date data and convert it to a string...
aus "The Firebird Book"... also versuchs mal über einene entsprechenden String....

Grüße

tsteinmaurer 13. Okt 2011 11:29

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
@Daniel: Kriegst du eine Delphi oder eine Firebird Exception? Da der TIME Datentyp mit Dialect 3 zur Verfügung steht ist die Frage, ob du dich mit FIBPlus auch mit Dialect 3 verbindest?

tsteinmaurer 13. Okt 2011 11:46

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Bei mir klappt ein:

Code:
DBGrid1.DataSource.DataSet.FieldByName('MYTIME').AsDateTime := Now;
Bei folgender Firebird 2.5.1 Dialect 3 Tabelle:

Code:
CREATE TABLE T1 
(
  ID                  BIGINT        NOT NULL,
  MYTIME                TIME,
 CONSTRAINT PK_T1 PRIMARY KEY (ID)
);
ohne Probleme. Verwende allerdings IBDAC 4 mit Delphi 2010.

Daniel 13. Okt 2011 12:03

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Ich werde das Szenario gleich mal auf ein Mini-Beispiel herunter brechen. Möglicherweise läuft hier irgendwas anderes schief, da der Datentyp des Felds korrekt als ftTime erkannt wird, aber keine der hier bisher genannten Zuweisungen funktionieren wollte.

Den SQL-Dialekt werde ich prüfen - ich habe das Projekt übernommen und wenn diese falsch gesetzt wäre, dann würde dies bedeuten, dass dem schon sehr lange Zeit so gewesen sein muss.


Vielen Dank schon mal für das Ausprobieren. :-)

mkinzler 13. Okt 2011 12:05

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Wenn die Datenbank schon alt ist ( aus IB Zeiten), dann bleibt der Dialect 1 bestehen.

Daniel 13. Okt 2011 12:08

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Also FibPlus verbindet sich explizit mit Dialekt 3. Das Feld steht ja auch so in der DB und wenn ich den Wert via Trigger zuweise (ich greife dazu auf CURRENT_TIMESTAMP zu), dann geht's auch und sowohl IBExpert als auch meine eigene Anwendung zeigen den korrekten Wert.

tsteinmaurer 13. Okt 2011 12:18

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Welchen Datentyp hat denn das persistente Feld when ftTime gesetzt ist? Bei mir wird ein persistentes Feld als TTimeField erstellt, wo dann FieldKind auf fkData gesetzt ist. Würd das wirklich mal mit einem einfachen Beispiel versuchen nachzubilden.

Daniel 13. Okt 2011 12:20

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
In diesem Projekt gibt es keine persistenten Felder. Möglicherweise ist das auch das Problem.

tsteinmaurer 13. Okt 2011 12:24

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Sollte nicht das Problem sein, weil mein einfaches Delphi-Beispiel auch ohne persistente Felder war.

Ist es nun eine Delphi oder eine Firebird Exception die du bekommst?

Daniel 13. Okt 2011 12:31

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Schaut mir eher nach einer Firebird-Exception aus:

Code:
exception class  : EFIBInterBaseError
exception message : MainForm.qQuery.InsertQuery: Expression evaluation not supported. Value exceeds the range for valid dates.

Main ($12c):
005b9040 xyz.exe   fib               534  +67 IBError
005c6a85 xyz.exe   FIBQuery         3294   +6 TFIBQuery.Call
005c835f xyz.exe   FIBQuery         3995  +87 TFIBQuery.ExecQuery
00595f18 xyz.exe   pFIBDataSet       854  +14 TpFIBDataSet.InternalPostRecord
005e5555 xyz.exe   FIBDataSet      10129  +82 TFIBCustomDataSet.InternalPost
0059643d xyz.exe   pFIBDataSet       999   +1 TpFIBDataSet.InternalPost
00554ae1 xyz.exe   DB              10816   +5 TDataSet.CheckOperation
0055477c xyz.exe   DB              10673   +7 TDataSet.Post
005d53e8 xyz.exe   FIBDataSet       3519   +2 TFIBCustomDataSet.Post

tsteinmaurer 13. Okt 2011 12:36

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Zeig mal wirklich die vollständige Tabellen DDL + Trigger etc. + mehr Delphi-Code

Daniel 13. Okt 2011 12:41

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Ich muss hier leider zeitlich bedingt einen kurzen Cut machen und werde das Beispiel erst später aufbereiten können. Ich habe ja noch die Hoffnung, dass sie die Ursache offenbart, sobald ich die Mini-Anwendung am Start habe.

Hansa 13. Okt 2011 13:46

AW: FireBird, Datentyp TIME clientseitig mit Delphi bestücken
 
Geh mal vorsichtshalber hin und erstelle die Standard-SQLs neu. Rechter Mausklick auf das Dataset -> SQL Generator -> Clear-SQLs -> Generate Modify SQLs. F9


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