Autor Beitrag
wmolzahn
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 08.03.10 14:31 
Ich habe ein Riesenproblem:
Ich steige um von Delphi 7 auf 2010 und befürchte, dass im Zusammenhang mit den neuen TIB-Komponenten das Standardverhalten bei der Übergabe von NULL an (Firebird 1.5) Date-Felder geändert wurde.
Bisher habe ich NULL-Values an ein Datefield so übergeben:
ausblenden Delphi-Quelltext
1:
2:
Dataset1.FieldByName('DateField1').AsString := '' bzw.
Dataset1.FieldByName('DateField1').clear

Damit kam (nach Post und Commit) in der DB immer schön ein NULL-Wert an.
Jetzt - unter Delphi 2010 - führen beide Varianten dazu, dass der letzte bzw. alte Wert wiederhergestellt wird. Offensichtlich wird ein Leerstring als inkorrekt angesehen und deshalb wird der letzte korrekte Wert restauriert.

Dies ist ein großes Problem, u.a. führen viele fertige SQL-Queries zu falschen Ergebnissen, weil ich mit '... where Datefield1 is null' arbeite etc.

Weiß jemand zu diesem Thema Rat und kann helfen? Ich wäre sehr dankbar. :(

Moderiert von user profile iconNarses: Color- durch Delphi-Tags ersetzt
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 08.03.10 16:54 
Hab zwar nur D2007, kann ich aber nicht nachvollziehen.
Mehr Code wäre nicht schlecht.

_________________
PROGRAMMER: A device for converting coffee into software.
wmolzahn Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 09.03.10 10:18 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Hab zwar nur D2007, kann ich aber nicht nachvollziehen.
Mehr Code wäre nicht schlecht.


Das Problem habe ich auch erst mit Delphi 2010. Ich bin von Delphi 7 umgestiegen. Vorher war alles ok. Derselbe Code läuft jetzt nicht mehr. Mein derzeitiger Wissensstand ist wie folgt:

Ausgangssituation:
Datensatz aus DB gelesen, DateField hat einen korrekten Inhalt '01.01.2010'

Alternative Maßnahmen, um NULL in das dateField zu bekommen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
TIBDataset1.FieldByName('DateField1').clear;  //  neuer Inhalt: '01.01.2010'
TIBDataset1.FieldByName('DateField1').AsString := '';  //  neuer Inhalt: '01.01.2010'
TIBDataset1.FieldByName('DateField1').Value := Null;  //  neuer inhalt: '01.01.2010'
TIBDataset1.FieldByName('DateField1').Value := Unassigned; //  neuer Inhalt: '30.12.1899'
TIBDataset1.FieldByName('DateField1').AsVariant := Unassigned;  //  neuer Inhalt: '30.12.1899'

Egal was ich tue, ich schaffe es nicht den gewünschten NULL-Wert in das DateField zuzuweisen. Interessanterweise ist aber ein NULL-Wert drin, wenn ich den Datensatz per INSERT frisch angelegt habe - und er bleibt solange drin, bis ich ihn erstmalig mit einem gültigen Datum überschreibe. Ab dann heißt es: Nie wieder NULL.

Erstaunlicherweise funktioniert das Ganze aber noch (wie unter D7) mit Integer und String. Wenn ich also Attributen diesen Typs z.B. Leerstrings zuweise und den Inhalt dann in der DB abspeichere, finde ich dort auch den erwünschten NULL-Wert wieder.

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
ssb-blume
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: Di 09.03.10 12:39 
Hallo
'Datafield' ist in der DB als Datum-Typ deklariert. Ein Datum muss existieren, es kann höchstens auf den Anfang (1890...) gesetzt werden.
Wandle den Typ des Feldes in 'String' um, dann geht es einwandfrei. Außerdem lässt sich dann auch schön nach Tag, Monat oder Jahr selektieren (mit Like..)
Hansi

_________________
Brain: an apparatus with which we think we think.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Di 09.03.10 12:53 
Mit meiner Frage nach dem "mehr Quellcode" wollte ich eigentlich darauf hinaus, ob du mit DataSet.Edit bzw. DataSet.Post arbeitest.
Was passiert, wenn du den Wert per SQL Befehl auf NULL setzt? Update Tabelle SET DateField = NULL where .....

user profile iconssb-blume hat folgendes geschrieben Zum zitierten Posting springen:
Hallo
'Datafield' ist in der DB als Datum-Typ deklariert. Ein Datum muss existieren, es kann höchstens auf den Anfang (1890...) gesetzt werden.

Soweit ich weiß kann man unter Firebird auch datumswerte auf NULL setzen. Voraussetzung ist natürlich, dass das Feld nicht die Eigenschaft "not null" hat, und kein Standardwert vorgegeben ist.

user profile iconssb-blume hat folgendes geschrieben Zum zitierten Posting springen:
Wandle den Typ des Feldes in 'String' um, dann geht es einwandfrei. Außerdem lässt sich dann auch schön nach Tag, Monat oder Jahr selektieren (mit Like..)
Hansi

Sorry, aber dieser "Tipp" ist Quatsch.
Sortier doch mal bite nach Datum..
order by Jahr, Monat, Tag, oder wie?
Und wenn man nicht aufpasst, trägt man den 2.2. ein, und schon wird er nach dem 10.2. angezeigt, juhu.

_________________
PROGRAMMER: A device for converting coffee into software.
Ralf1504
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 08.04.10 13:57 
Ich habe das gleiche Problem.
TDateField.Clear; ergibt unter Delphi2010(Update 4; 5) nicht TDateField.IsNull = true sondern 30.12.1899.


Bin gerade dabei ein Projekt von Delphi2007 auf Delphi2010 umzustellen.
Dieses ist dabei derzeit mein größten (aber nicht einziges) Problem, welches noch auf eine Lösung wartet.
Unter Delphi2007 läuft alles richtig.
Ralf1504
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 22.04.10 12:46