Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00 (https://www.delphipraxis.net/210984-datetime-anzeige-dbgrid-ist-bei-der-zeit-00-00-00-a.html)

Smiley 9. Jul 2022 15:17

Datenbank: SQLite • Version: D10.4 • Zugriff über: FireDAC

DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Ich habe in einer SQLite Datenbank eine Tabelle mit einem DateTime Wert.
Diesen zeige ich in einem DBGrid an.
Im GridInit habe ich explizit noch eingetragen:

Code:
TDateTimeField(grdKasse.Columns[7].Field).DisplayFormat:= 'dd.mm.yyyy hh:nn:ss';
Als Anzeige im Grid bekomme ich aber angezeigt "07.07.2022 00:00:00"
In der Tabelle sind unterschiedliche Zeiten enthalten. Nur das DBGrid zeigt es als 00:00:00 an.
Definiert wurde die Tabelle mit:

Code:
  qKasse.SQL.Text := 'Create Table If Not Exists Kasse ' +
    '(Nr INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,' +
    ' Name VARCHAR(100), EPreis Real, Menge Integer,Frei VARCHAR(1), ' +
    'Rabatt VARCHAR(1), Summe Real,Datum datetime, Bemerkung VARCHAR(200))';
  qKasse.ExecSQL;
Könnt ihr mir da einen Tip geben was ich falsch mache?

hoika 9. Jul 2022 20:14

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Hallo,
mal dd.mm.yy probiert?

Zum Test, ob das DisplayFormat überhaupt funktioniert.

Papaschlumpf73 10. Jul 2022 09:52

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Du schießt hier ein bisschen von hinten durch die Brust.

Das TDateTimeField gehört zum Dataset und hat eigentlich nichts mit dem Grid tun. So kann man es zwar auch machen; es ist jedoch sehr fehleranfällig. Sobald sich die Column-ID der Datumsspalte ändert, läuft das schon auf einen Fehler hinaus.

Beispiel unter der Annahme, dass das Dataset qKasseTbl heißt:

Wenn du die Felder persistent dem Dataset hinzugefügt hast, kannst du die DisplayFormat-Eigenschaft gleich im Objektinspektor setzen, oder im Code per qKasseTblDatum.DisplayFormat:='xyz'. Ansonsten geht auch qKasseTbl.FieldbyName('Datum').DisplayFormat:='xyz '

Wenn die Felder nicht persistent sind, geht's eigentlich nur über qKasseTbl.FieldbyName('Datum').DisplayFormat:='xyz ' - aber erst nachdem die Tabelle z.B. mit qKasseTbl.Open geöffnet wurde. Davor sind die Felder ja noch nicht verfügbar.

Uwe Raabe 10. Jul 2022 10:54

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Seit einigen Delphi-Versionen kann man ja auch persistente und nicht-persistente Felder nebeneinander im DataSet haben (siehe TFieldsAutoCreationMode). Dann legt man sich die eben persistent an, bei denen man bestimmte Einstellungen oder Events haben will und die anderen lässt man automatisch erzeugen.

Smiley 10. Jul 2022 13:30

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Kann es sein dass wir hier von verschiedenen Sprachen sprechen?

Bei "qKasse.FieldbyName('Datum')." gibt es keine DisplayFormat Eigenschaft.
In den Persistenten Feldern finde ich weder im Query noch im Grid eine Eigenschaft Display Format.

Es gibt in der Query unter FormatOptions die Eigenschaft FmtDisplayDateTime, diese habe ich auch auf "dd.mm.yyyy hh:nn:ss" gesetzt.

Uwe Raabe 10. Jul 2022 13:53

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
TField kennt kein DisplayFormat, TDateTimeField aber schon.

Wenn du bei deiner Query persistente Felder hast, welchen Typ hat dann das Feld für "Datum"?

Smiley 10. Jul 2022 14:10

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Liste der Anhänge anzeigen (Anzahl: 1)
Meine Query sieht so aus, wenn ich ein doppelklick auf die Query mache:
https://www.delphipraxis.net/attachm...1&d=1657454877

Dort steht nur "Date" als Typ.
Kann SQLite kein DateTime ? ich habe es aber im Create als DateTime angelegt.
Code:
  qKasse.SQL.Text := 'Create Table If Not Exists Kasse ' +
    '(Nr INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,' +
    ' Name VARCHAR(100), EPreis Real, Menge Integer,Frei VARCHAR(1), ' +
    'Rabatt VARCHAR(1), Summe Real,Datum datetime, Bemerkung VARCHAR(200))';
  qKasse.ExecSQL;

Smiley 10. Jul 2022 14:14

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier noch ein Bild von den Feldern im DBGrid
https://www.delphipraxis.net/attachm...1&d=1657455266

Smiley 10. Jul 2022 14:20

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Liste der Anhänge anzeigen (Anzahl: 1)
So sieht es im SQLiteSpy aus:
https://www.delphipraxis.net/attachm...1&d=1657455639

Smiley 10. Jul 2022 14:50

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Hier der Inhalt des Formulars frmKasse:

Code:
procedure TfrmKasse.FormActivate(Sender: TObject);
begin
  grdKasse.DataSource:=DM.dsKasse;
  GridKasseInit;
end;

procedure TfrmKasse.GridKasseInit;
begin
  grdKasse.Columns[0].Width := 30;
  grdKasse.Columns[1].Width := 120; // Name
  grdKasse.Columns[2].Width := 50; // Prei
  grdKasse.Columns[3].Width := 50; // Menge
  grdKasse.Columns[4].Width := 40; // Frei
  grdKasse.Columns[5].Width := 40; // Rabatt
  grdKasse.Columns[6].Width := 50; // Summe
  grdKasse.Columns[7].Width := 180; // Datum
  grdKasse.Columns[8].Width := 300; // Bemerkung
  (DM.qKasse.FieldByName('Datum') as Tdatetimefield).DisplayFormat := 'dd.mm.yyyy hh:nn:ss';
//  TDateTimeField(grdKasse.Columns[7].Field).DisplayFormat:= 'dd.mm.yyyy hh:nn:ss';
  TCurrencyField(grdKasse.Columns[2].Field).DisplayFormat:= '###0.00';
  TCurrencyField(grdKasse.Columns[3].Field).DisplayFormat:= '###0.00';
  TCurrencyField(grdKasse.Columns[6].Field).DisplayFormat:= '###0.00';
end;

Uwe Raabe 10. Jul 2022 15:32

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Zitat:

Zitat von Smiley (Beitrag 1508629)
Dort steht nur "Date" als Typ.
Kann SQLite kein DateTime ? ich habe es aber im Create als DateTime angelegt.

Die Doku sagt dazu:
Zitat:

2.2. Date and Time Datatype
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values:

TEXT as ISO8601 strings ("YYYY-MM-DD HH:MM:SS.SSS").
REAL as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar.
INTEGER as Unix Time, the number of seconds since 1970-01-01 00:00:00 UTC.
Applications can choose to store dates and times in any of these formats and freely convert between formats using the built-in date and time functions.
Tatsache ist, dass das Feld als Date ankommt und nicht als DateTime. Warum das so ist, kann ich im Moment auch nicht sagen.

Smiley 10. Jul 2022 15:57

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Gespeichert wird das Datum schon richtig mit Zeit, wie man im SQLiteSpy sieht, dort werden die Datumsangaben mit der richtigen Zeit angezeigt.

Etwas anderes noch mit der Formatangabe. Die Minuten werden mal mit mm und mal mit nn angegeben.
Selbst in DelphiBasics http://www.delphibasics.co.uk/RTL.as...formatdatetime wird es mal mit mm und nn angegeben.
nn = Minute number as 2 digits
LongTimeFormat = hh:mm:ss
Was ist denn nun richtig ?

Uwe Raabe 10. Jul 2022 16:27

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Zitat:

Zitat von Smiley (Beitrag 1508635)
Gespeichert wird das Datum schon richtig mit Zeit, wie man im SQLiteSpy sieht, dort werden die Datumsangaben mit der richtigen Zeit angezeigt.

Allerdings steht dort auch als Typ "date" und FireDAC wandelt das in ein TDateField um. Vielleicht hilft es, wenn du beim Select das Feld explizit als DateTime castest.

Zitat:

Zitat von Smiley (Beitrag 1508635)
Etwas anderes noch mit der Formatangabe. Die Minuten werden mal mit mm und mal mit nn angegeben.
Selbst in DelphiBasics http://www.delphibasics.co.uk/RTL.as...formatdatetime wird es mal mit mm und nn angegeben.
nn = Minute number as 2 digits
LongTimeFormat = hh:mm:ss
Was ist denn nun richtig ?

Formell korrekt ist hh:nn:ss (zur Unterscheidung vom Monat), aber die internen Routinen tolerieren auch ein hh:mm:ss. Letzteres ist wohl auch Windows geschuldet, das auf Anfrage genau dieses zurückgibt.

himitsu 10. Jul 2022 17:41

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Was sagt denn FieldType/DataType?
Und gibt es bei FireDAC nicht auch irgendwo die inneren TypInfos, also das was das DBMS/Treiber dem FD für einen Typ nennt?

Smiley 10. Jul 2022 18:12

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Danke Uwe für die klare Erklärung beim Timeformat.

Mit dem Casten im SQL habe ich etwas gefunden aber noch nicht richtig die Anwendung verstanden. Eventuell auch convert verwenden, da blick ich aber noch weniger durch.

So würde ich es machen nach dem was ich gelesen habe:
Code:
qKasse.SQL.Text := 'Select Nr,Name,EPreis,Menge,Frei,Rabatt,Summe,  cast(Datum AS DateTime) AS Datum,  Bemerkung from Kasse order by Datum Asc';
Hier bekomme ich aber die Meldung: ungültige Typumwandlung.

Kann da jemand helfen wie man das Datum als DateTime richtig casted im SQL Select ?

Smiley 10. Jul 2022 18:19

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Liste der Anhänge anzeigen (Anzahl: 2)
@himitsu
ich habe im FDConnection und Query folgendes gesetzt, das wirkt sich aber nicht aus.

Smiley 10. Jul 2022 19:04

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Ich habe jetzt einen SQL String gefunden der mir Datum und Zeit anzeigt, aber im englischen format 2022-07-07 14:02:05.
Nachformatieren im GridInit bringt einen Typumwandlungsfehler.

Code:
  qKasse.SQL.Text := 'Select Nr,Name,EPreis,Menge,Frei,Rabatt,Summe, '+
                     'Datetime(Datum) AS Datum ,Bemerkung '+
                     'from Kasse order by Datum Asc';

Delphi.Narium 10. Jul 2022 19:34

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
How the DateTime() Function Works in SQLite und dort nach strftime suchen.

Eventuell sowas?
SQL-Code:
select strftime('%d.%m.%y %H:%M:%S', Datum) as Datum from tabelle

Smiley 11. Jul 2022 08:22

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Danke Delphi.Narium für den Hinweis und den Link mit der hilfreichen Erklärung.
Aber ich weiß nicht wie ich strftime in meinen String einbinden soll.
Dies hier funktioniert nicht wegen der Hochkommas:
Code:
qKasse.SQL.Text := 'Select Nr,Name,EPreis,Menge,Frei,Rabatt,Summe, '+
                   'strftime('%d.%m.%y %H:%M:%S', Datum) as Datum ,Bemerkung '+
                   'from Kasse order by Datum Asc';
Mit
Code:
  qKasse.SQL.Text := 'Select Nr,Name,EPreis,Menge,Frei,Rabatt,Summe, '+
                     'Datetime(Datum) AS Datum ,Bemerkung '+
                     'from Kasse order by Datum Asc';
funktioniert das noch da hier keine Hochkommas verwendet werden.
Ansonsten wäre strftime Ideal für mich um eine beliebige Formatierung des DateTime Strings hinzubekommen.

Delphi.Narium 11. Jul 2022 08:37

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Delphi-Quellcode:
qKasse.SQL.Text := 'Select Nr, Name, EPreis, Menge, Frei, Rabatt, Summe, ' +
                   'strftime(''%d.%m.%y %H:%M:%S'', Datum) as Datum, Bemerkung ' +
                   'from Kasse order by Datum Asc';

Smiley 11. Jul 2022 09:10

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Ich hatte es mit Anführungszeichen (Shift-2) probiert, das hat nicht funktioniert, mit 2 einfachen Anführungszeichen nimmt der Compiler das.

Diese Syntax lässt sich compilieren, es wird aber kein Wert im Grid angezeigt, das Datumsfeld ist leer.
Mit dem DateTime-Befehl funktioniert es nur lässt sich da nichts formatieren.

Frickler 11. Jul 2022 09:38

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Zitat:

Zitat von himitsu (Beitrag 1508637)
Was sagt denn FieldType/DataType?
Und gibt es bei FireDAC nicht auch irgendwo die inneren TypInfos, also das was das DBMS/Treiber dem FD für einen Typ nennt?

Gibts in FireDAC sowas wie Data Mapping (wie in UniDAC), wo man angeben kann, welchen TFieldType ein Feld haben soll? Dann einfach "datum" als ftDateTime mappen.


Im SQLite-Editor "SQLite Expert Personal" kann man als internes Format für Datumsfelder explizit angeben "Borland TDateTime", aber halt auch andere Optionen. SQLiteSpy hat die "Delphi-Brille" hingegen permanent auf, deswegen fällt eventuell hintenüber, dass es auch anders geht.

hhcm 11. Jul 2022 09:43

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Liste der Anhänge anzeigen (Anzahl: 1)
Verstehe ich etwas falsch?
Ich habe gerade ein neues Projekt angelegt.
- FDconnection, FDQuery, DataSource + DBGrid auf ein Formular.
- FDConnection an eine SQLite-DB. Diese hat eine Tabelle und ein Feld mit dem Typ DATETIME
- Das Feld persistent eingebunden und es wurde korrekt als TDateTimeField erkannt.

Selbst im Designer kann ich das DisplayFormat ändern und es wird auch korrekt angezeigt.

Getestet mit Delphi 10.4

Uwe Raabe 11. Jul 2022 09:54

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Zitat:

Zitat von hhcm (Beitrag 1508654)
Verstehe ich etwas falsch?

Nein, tust du nicht. In der Regel funktioniert das auch einfach ohne weiteres Zutun. Das Problem ist also kein generelles sondern eher lokal, wobei da viele Ursachen in Frage kommen.

Smiley 11. Jul 2022 10:56

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Liste der Anhänge anzeigen (Anzahl: 2)
Bei mir sieht das alles anders, im ObjectInspector, aus.
Ich habe mal ein Bild von dem pesistenten Feld Datum gemacht und ein Bild des Ergebnisgrids, wenn ich nur "Select * from Kasse" mache.

Uwe Raabe 11. Jul 2022 11:27

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Kannst du das an einem minimalen Beispiel-Projekt reproduzieren? Damit könnten wir bestimmt was anfangen.

Smiley 11. Jul 2022 11:40

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
So Leute ich habe es hinbekommen, weiß nur nicht wo die Ursache genau liegt.
Es war irgendetwas in der Query.
Uwe hatte recht mit seiner Aussage: " Das Problem ist also kein generelles sondern eher lokal, wobei da viele Ursachen in Frage kommen. "

Ich habe die Query komplett gelöscht und neu hinzugefügt, danach hat es funktioniert.

Im Objectinspector wird das persistente Feld jetzt auch als TDateTime Field und nicht mehr als TDate Field angezeigt.

Viel Wind um nichts.
Sorry Leute dass ich euch so viel Arbeit gemacht habe.

haentschman 11. Jul 2022 11:43

AW: DateTime Anzeige in DBGrid ist bei der Zeit 00:00:00
 
Hallöle...8-)

qKasse TDateField (siehe Screenshot)

statt

TDateTimeField

...könnt ihr mich auch mal was schreiben lassen. :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 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 by Thomas Breitkreuz