Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit Datefeld in DB, wenn Datum nicht vorhanden ist (https://www.delphipraxis.net/106325-problem-mit-datefeld-db-wenn-datum-nicht-vorhanden-ist.html)

guidok 9. Jan 2008 08:48

Datenbank: Absolute DB • Zugriff über: absQuery

Problem mit Datefeld in DB, wenn Datum nicht vorhanden ist
 
Ich habe ein kleines Problem mit einem DATETIME Feld in einer DB.

Ich importiere die Feldinhalte aus einer Textdatei in die Datenbank. Unter anderem gibt es das Feld GWENDE, welches ein Datum enthält. In manchen Fällen enthält es jedoch auch keine Daten.

So füge ich die Daten in die DB ein. Die Übergabe der Daten erfolgt über den Record TP.

Delphi-Quellcode:
  TTP = record
    TPID: String;
    TPBEZ: String;
    KST: String;
    SAPNR: String;
    ANLNR: String;
    HERST: String;
    GWENDE: TDateTime;
    AUS: Boolean;
    LASTCH: TDateTime;
  end;

...

    SQL.Add('INSERT INTO TP VALUES(:PTPID,:PTPBEZ,:PKST,:PSAPNR,:PANLNR,:PHERST,:PGWENDE,:PAUS,:PLASTCH);');
    Params.ParamValues['PTPID']:=TP.TPID;
    Params.ParamValues['PTPBEZ']:=TP.TPBEZ;
    Params.ParamValues['PKST']:=TP.KST;
    Params.ParamValues['PSAPNR']:=TP.SAPNR;
    Params.ParamValues['PANLNR']:=TP.ANLNR;
    Params.ParamValues['PHERST']:=TP.HERST;
    Params.ParamValues['PGWENDE']:=TP.GWENDE;
    Params.ParamValues['PAUS']:=TP.AUS;
    Params.ParamValues['PLASTCH']:=TP.LASTCH;
Beim Auslesen der Daten aus der Textdatei muss ich dem Feld TP.GWENDE etwas zuweisen. Falls keine Daten vorhanden sind weise ich 0 zu, was dummerweise beim Auslesen der Daten aus der DB zu einem Datum von 30.12.1899 führt, klar. Jetzt könnte ich das natürlich einfach optisch kaschieren und bei der Anzeige im Falle von diesem Datum nichts anzeigen, aber das gefällt mir nicht so ganz. Ich hätte lieber, dass das Feld in der DB einfach leer ist. Aber mir fällt nicht ein wie ich dass hinkriege.

Jemand ne Idee? Danke!

mkinzler 9. Jan 2008 08:50

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Setze es doch auf NULL

guidok 9. Jan 2008 09:00

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Wie?

Delphi-Quellcode:
    Params.ParamValues['PGWENDE']:=NULL;
funktioniert ja so nicht.

Muss ich jetzt je nachdem, ob ein Datum vorhanden ist oder nicht zwei unterschiedliche INSERTS machen?

RavenIV 9. Jan 2008 09:04

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Zitat:

Zitat von guidok
Wie?

Delphi-Quellcode:
    Params.ParamValues['PGWENDE']:=NULL;
funktioniert ja so nicht.

Muss ich jetzt je nachdem, ob ein Datum vorhanden ist oder nicht zwei unterschiedliche INSERTS machen?

Versuch es mal so:
Delphi-Quellcode:
    Params.ParamByName('PGWENDE').Value := nil;
Vorraussetzung ist natürlich, dass in der DB das Feld PGWENDE nicht als not-Null definiert ist. Es muss also NULL-Werte akzeptieren.

/Offtopic
Weiter oben im Code musst Du ein
with Query do
haben. Sei so gut und eliminiere das with.

marabu 9. Jan 2008 09:22

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Hallo,

mit der Methode Clear() wird normalerweise ein Parameter auf NULL gesetzt. Sobald NULL-Werte verarbeitet werden sollen, sind binäre Datentypen in der Zwischenspeicherstruktur TTP nicht so optimal, da dann doch wieder ein Wert aus dem Wertebereich speziell interpretiert werden muss.

Freundliche Grüße

guidok 9. Jan 2008 09:42

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Delphi-Quellcode:
Params.ParamByName('PGWENDE').Value := nil;
Funktioniert nicht.

Delphi-Quellcode:
Params.ParamByName('PGWENDE').Clear;
Scheint zu funktionieren (bin nicht ganz sicher).

Das Problem ist jetzt, dass ich ja das Feld auch auslesen muss und nach dem SELECT zur Anzeige demselben Record TP zuweise.
Delphi-Quellcode:
TP.TPID := FieldByName('TPID').AsString;
TP.TPBEZ := FieldByName('TPBEZ').AsString;
TP.KST := FieldByName('KST').AsString;
TP.SAPNR := FieldByName('SAPNR').AsString;
TP.ANLNR := FieldByName('ANLNR').AsString;
TP.HERST := FieldByName('HERST').AsString;
TP.GWENDE := FieldByName('GWENDE').AsDateTime;
TP.AUS := FieldByName('AUS').AsBoolean;
TP.LASTCH := FieldByName('LASTCH').AsDateTime;
Letztendlich bekomme ich dann wieder die Anzeige "1899", was mich zu folgendem Zitat bringt:

Zitat:

Sobald NULL-Werte verarbeitet werden sollen, sind binäre Datentypen in der Zwischenspeicherstruktur TTP nicht so optimal, da dann doch wieder ein Wert aus dem Wertebereich speziell interpretiert werden muss.
Stimme ich voll zu. Idee dazu?

mashutu 9. Jan 2008 09:47

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Delphi-Quellcode:
if FieldByName('GWENDE').ISNull then
  TP.GWENDE := -1
else
  TP.GWENDE := FieldByName('GWENDE').AsDateTime;
Dann musst Du eben in Deinem Programm
TP.GWENDE auf -1 abfragen

Es wuerde sich ohnehin empfehlen statt eines Records ein Objkekt zu nehmen, dann koennten die Felder als properties angesprochen und ausgelesen werden, wo du die entsprechenden Fallunterscheidungen einbauen kannst...

guidok 9. Jan 2008 10:11

Re: Problem mit Datefeld in DB, wenn Datum nicht vorhanden i
 
Zitat:

Zitat von mashutu
Delphi-Quellcode:
if FieldByName('GWENDE').ISNull then
  TP.GWENDE := -1
else
  TP.GWENDE := FieldByName('GWENDE').AsDateTime;
Dann musst Du eben in Deinem Programm
TP.GWENDE auf -1 abfragen

Es wuerde sich ohnehin empfehlen statt eines Records ein Objkekt zu nehmen, dann koennten die Felder als properties angesprochen und ausgelesen werden, wo du die entsprechenden Fallunterscheidungen einbauen kannst...

Hilft nicht so richtig weiter, da -1 dem 29.12.1899 entspricht. Ich werde das jetzt doch bei der Anzeige abfangen, nicht schön, geht aber am schnellsten.


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