Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TPgIntervalField auf NULL setzen (https://www.delphipraxis.net/176958-tpgintervalfield-auf-null-setzen.html)

himitsu 7. Okt 2013 15:49

Datenbank: postgres • Version: 9.1 • Zugriff über: PgDAC

TPgIntervalField auf NULL setzen
 
Moin,

wie bekommt man soein TPgIntervalField eigentlich wieder leer, bzw. auf NULL gesetzt?

So geht es zwar:
SQL-Code:
UPDATE test SET t_interval = NULL WHERE t_id = 3
.

Aber wie geht das in einem TPgQuery, bzw. über die angehängten Edits/Grids?

Delphi-Quellcode:
t_interval.Clear; // das Edit, bzw. ein DBLookupEdit
Sql.FieldByName('t_interval').Clear;
Sql.FieldByName('t_interval').AsString := '';
...
Der DB-Monitor zeigt auch an, daß immer nur das "alte" interne TPgInterval übertragen wird, egal was ich versuche.


Man kann das feld z.B. im Grid leer machen und Posten, aber nach dem Refresh ist der alte Wert wieder da.
Andere Intervalle lassen sich problemlos eintragen, nur das NULL nicht.
Und sowas wie "0 mons" nimmt der Parser auch nicht an und es knallt beim Posten.
Solange das Feld leer ist, gibt es keine Probleme, aber wenn einmal was drin steht, dann bekomm ich das nicht mehr weg.



[edit]
Vermuten tun wir allerdings jetzt erstmal einen BUG im PgDAC. (DevExpress spielt zwar auch mit, aber da vermutlich nicht)

mkinzler 7. Okt 2013 16:53

AW: TPgIntervalField auf NULL setzen
 
Funktioniert
Delphi-Quellcode:
Sql.FieldByName('t_interval').Value := NULL;
?

Aviator 7. Okt 2013 16:54

AW: TPgIntervalField auf NULL setzen
 
Nur
Delphi-Quellcode:
Sql.FieldByName('t_interval').Clear;
und dann ein Post funktioniert nicht? Normalerweise ist das ja die übliche Vorgehensweise um NULL Werte zu setzen. Ob das bei Postgres bzw. der TSQL Komponente anders ist weiß ich allerdings auch nicht.

himitsu 7. Okt 2013 17:02

AW: TPgIntervalField auf NULL setzen
 
Delphi-Quellcode:
:= Null;
hatte ich auch schon ausprobiert.
Also alles Einzeln und auch Mehreres zusammen und direkt danach ein Post.

Nichts geht.

Ein IsNull meint zwar noch kurz vor dem Post, daß es nun Null sei und ohne Refresh ist das Feld auch "leer", aber ein Blick in die Datenbank, bzw. nach einem Refresh/RefreshRecord ist es wieder da.

Aviator 7. Okt 2013 17:21

AW: TPgIntervalField auf NULL setzen
 
Ich habe gerade des öfteren gelesen, dass die
Delphi-Quellcode:
Datatype
Eigenschaft des Feldes vorher festgelegt werden soll, damit das funktioniert. Ob das hier jetzt weiterhilft bzw. das überhaupt stimmt kann ich natürlich nicht sagen.

Und dann noch etwas: Schonmal mit der TParam.Bound Eigenschaft rumgespielt, ob das was bringt? (Ebenfalls gerade mehrfach gelesen.)

himitsu 7. Okt 2013 17:57

AW: TPgIntervalField auf NULL setzen
 
Bound ist eh nur ein Getter und mehr als Lesen kann man damit also nicht.

Außerdem werden die Insert/Update/Delete-statements, sowie deren Parameter stantardmäßig automatisch vom TPgQuery erzeugt.
Da kommt man so auch nicht so leicht ran, ohne wieder alles selberzumachen.

Der DataType wird vom TPgIntervalField im Constructor gesetzt. (ftPgInterval = 106)



Sobald einmal diese interne TPgInterval-Instanz erstellt wurde (wenn nicht NULL), dann geht die einfach nicht mehr weg.

himitsu 8. Okt 2013 13:45

AW: TPgIntervalField auf NULL setzen
 
nur nochmal Einiges aufgezählt:
Delphi-Quellcode:
Sql.FieldByName('t_interval').AsString := '';

Sql.FieldByName('t_interval').AsString := '00:00:00';

Sql.FieldByName('t_interval').Clear;

with (Sql.FieldByName('t_interval') as TPgIntervalField).AsPgInterval do begin
  MonthsFull := 0;
  Days       := 0;
  SecondsFull := 0;
end;
Sql.FieldByName('t_interval').SetData(nil, True);
Sobald die Zeit auf "0" gesetzt wird, dann knallt es beim Post mit folgendem Fehler.
Zitat:

EPgError:
invalid input syntax for type interval: ""
Vorallem der Letzte versuchte das hinzubekommen, wie der Status vom TPgIntervalField ursprünglich ist, wenn das Feld schon als NULL aus der DB ausgelesen wurde.



Nja, außer einer Meldung an DavArt (PgDAC) und zu warten wann der Fehler behoben wird, scheint wohl nicht möglich zu sein.
Ich hab in unserem Projekt erstmal aufgegeben und neben die Felder einen Button gemacht, welcher direkt das Update-Statement zur Datenbank schickt.
(das Update- und Insert-Statement manuell zu erstellen und das nicht vom PgDAC erledigen zu lassen ist hier keine so schöne Variante, da diese praktisch überall automatisch generiert werden und wir bei Änderungen diese Statements ganz bestimmt übersehn würden)

TRomano 8. Okt 2013 18:12

AW: TPgIntervalField auf NULL setzen
 
Vielleicht FieldByName(BlaBla').AsVariant := NULL ???


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