Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Berechnetes Feld ändern Integer<->DateTime (https://www.delphipraxis.net/201951-berechnetes-feld-aendern-integer-datetime.html)

geesmith 12. Sep 2019 20:24

Datenbank: SQLite • Version: 5.3 • Zugriff über: DBGrid Table

Berechnetes Feld ändern Integer<->DateTime
 
Hallo zusammen

Zugegeben, der Titel ist etwas unglücklich gewählt, denn ein berechnetes Feld lässt sich nicht ändern. Aber der Titel sagt zumindest meine Intention aus.

Was habe ich:
- Eine Datenbanktabelle mit der Spalte HISTDATE. Darin steht z.B. 119243 (ist ein Datum in einem speziellen julianischen Format)
- Eine Table-Komponente (unitable von devart).
- Ein DBGrid (von devexpress) mit der Spalte "HistDate". Die Spalte ist vom Typ TDateTime und hat eine DateEdit-Komponente.
(Ich glaube und hoffe die Hersteller obiger Komponenten tun in diesem Fall nichts zur Sache)

Was will ich:
1. Anzeige der HISTDATE-Tabellenwerte im DBGrid im *gregorianischen Format*. Also nicht 119243, sondern als DateTime 24.06.2019.
2. Das Datum im Grid soll dann editierbar sein und der editierte Wert soll als 119243 wieder in der Tabelle gespeichert werden.

Was habe ich schon gemacht:
Punkt 1 schaffe ich mit einem berechnetem Feld. ich erstelle in der Table ein neues berechnetes Feld und mit CalcFields errechne ich den DateTime-Wert aus diesem speziellem Datumswert. Im Grid weise ich der Spalte dann mein berechnetes Feld zu. Das Datum wird dann wunderbar im Grid angezeigt.

Was ist mein Problem:
Der DateTime-Wert im Grid lässt sich nicht ändern. Ich komme nicht drauf wie ich diesen DateTime-Wert in das Table-Feld HISTDATE zurückschreiben kann.
Habe schon mit onGetText und onSetText geschaut. Aber da der Wert im Grid ein DateTime-Wert ist, erschent mir das nicht zielführend.

Habt ihr eine Idee wie ich das machen könnte?

Uwe Raabe 12. Sep 2019 20:36

AW: Berechnetes Feld ändern Integer<->DateTime
 
Für sowas gibt es bei einem TField die Events OnGetText und OnSetText.

geesmith 12. Sep 2019 21:16

AW: Berechnetes Feld ändern Integer<->DateTime
 
Danke für deinen Hinweis Uwe. Wie geschrieben hatte ich mich in diese Richtung mit onGetText und onSetText bereits orientiert. Habe jedoch keine Möglichkeiten gesehen, da bei onGetText und onSetText mit Strings gearbeitet wird. Ich benötige jedoch eine Umwandlung Integer<->DateTime. Das Grid-Feld ist ein DateTime-Feld. Falls du dennoch Chancen siehst.. dürfte ich dich bitten einen kurzen Pseudo-Code zu posten? Danke!

stifflersmom 13. Sep 2019 08:10

AW: Berechnetes Feld ändern Integer<->DateTime
 
Du kannst Doch den String -> nach TDateTime umwandeln und dann in Dein Integer

geesmith 13. Sep 2019 12:24

AW: Berechnetes Feld ändern Integer<->DateTime
 
Danke für deine Antwort stifflersmom

Wie soll das deiner Meinung nach ausschauen?

Ich habe in der TTable ein Data-Feld "HISTDATE" welches den Tabellenwert inne hat.

Soll ich nun ein GetText und SetText auf diesem Feld machen?

So sieht die Get-Funktion aus:
Code:
procedure TFrame_Base_Brick.UniTable_BrickHistHISTDATEGetText(Sender: TField;
  var Text: string; DisplayText: Boolean);
begin
  inherited;
  Text := JulianToGregorian(FieldbyName('HISTDATE').asInteger); // Funktion gibt TDateTime zurück
end;
Ich habe einen var Text:String. Wie soll ich da jetzt einen DateTime-Wert reinschreiben?

...und dann gleiches Spiel mit SetText..
Code:
procedure TFrame_Base_Brick.UniTable_BrickHistHISTDATESetText(Sender: TField;
  const Text: string);
begin
  inherited;

end;

haentschman 13. Sep 2019 12:28

AW: Berechnetes Feld ändern Integer<->DateTime
 
Moin...8-)
Delphi-Quellcode:
DateToStr
http://docwiki.embarcadero.com/Libra...tils.DateToStr

Uwe Raabe 13. Sep 2019 12:55

AW: Berechnetes Feld ändern Integer<->DateTime
 
Ich sehe gerade, daß es gar nicht um ein Standard-TDBGrid geht, sondern das von DevExpress! Da muss ich passen.

hoika 13. Sep 2019 13:30

AW: Berechnetes Feld ändern Integer<->DateTime
 
Hallo,
dann nimm doch ein Dummy-Feld für die Datumsanzeige (OnGetText/OnSetText),
dein eigentliches Datumsfeld versteckst du.

OnGetText
Text:= Konvertiere(Verstecktes_DatumsFeld)

geesmith 30. Sep 2019 14:58

AW: Berechnetes Feld ändern Integer<->DateTime
 
Nur noch zur Information, falls es jemanden interessiert. Ich hatte hierzu bei Devexpress nachgefragt. Hier ist die Antwort:

Zitat:

"Calculated Field" is one of standard types of DataSet Fields. They are read-only. This behavior is standard and we cannot regulate this.

As for the task, I recommend you consider opening an extra dialog form, where you will be able to edit the clicked cell value. For example:
1. Handle the cell's double click;
2. Open the dialog form and show there a converted date in a DateEdit editor;
3. The end user can edit the value and close the dialog form;
4. Post the required value to the DataSet after you close the dialog form.



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