AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit Datefeld in DB, wenn Datum nicht vorhanden ist
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Datefeld in DB, wenn Datum nicht vorhanden ist

Ein Thema von guidok · begonnen am 9. Jan 2008 · letzter Beitrag vom 9. Jan 2008
Antwort Antwort
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#1

Problem mit Datefeld in DB, wenn Datum nicht vorhanden ist

  Alt 9. Jan 2008, 09:48
Datenbank: Absolute DB • Zugriff über: absQuery
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!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 9. Jan 2008, 09:50
Setze es doch auf NULL
Markus Kinzler
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#3

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

  Alt 9. Jan 2008, 10:00
Wie?

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

Muss ich jetzt je nachdem, ob ein Datum vorhanden ist oder nicht zwei unterschiedliche INSERTS machen?
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#4

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

  Alt 9. Jan 2008, 10:04
Zitat von guidok:
Wie?

    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:
    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.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

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

  Alt 9. Jan 2008, 10:22
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
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#6

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

  Alt 9. Jan 2008, 10:42
Params.ParamByName('PGWENDE').Value := nil; Funktioniert nicht.

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?
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#7

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

  Alt 9. Jan 2008, 10:47
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...
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
guidok

Registriert seit: 28. Jun 2007
417 Beiträge
 
#8

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

  Alt 9. Jan 2008, 11:11
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 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