Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Datumsformat in DB ändern von 04 nach 20004 (https://www.delphipraxis.net/67357-datumsformat-db-aendern-von-04-nach-20004-a.html)

torud 13. Apr 2006 14:10


Datumsformat in DB ändern von 04 nach 20004
 
Hallo Wissende,

ich habe eine Datenbank, in der ich früher das Datumsformat so eintrug: dd.mm.yy

Ich habe in der Zwischenzeit das Format auf dd.mm.yyyy umgestellt. Allerdings muss ich nun die alten in der DB verbleibenden Datensätze ändern, damit es passt, wenn ich damit was anstellen will.

Das hier ist mein bisheriger Code. Allerdings erhalte ich nur utopschie Daten:

Delphi-Quellcode:
procedure TForm1.btn_set_dateClick(Sender: TObject);
var
  datum:TDateTime;
begin
    with Table1 do
      begin
        while not Eof do
          begin
            Datum := Trunc(FieldValues['date']);
            ShowMessage(FormatDateTime('dd.mm.yyyy',Datum));
            Next;
          end
      end
end;
Es war wohl gut, dass ich mir erstmal nur die Mesaagebox habe anzeigen lassen und nicht gleich zurück in die DB geschrieben habe. Was mache ich falsche, oder was fehlt da noch?

torud 13. Apr 2006 15:10

Re: Datumsformat in DB ändern von 04 nach 20004
 
Das Problem war oder ist, dass ich damals ein anderes Datumsformat auf dem System eingrichtet hatte. Viel Schwerer wiegt der Fehler, dass das Feld vom Typ her String ist. Mit diesem Code habe ich es zumindestens inhaltlich erstmal gelöst.

Delphi-Quellcode:
procedure TForm1.btn_set_dateClick(Sender: TObject);
var
  datum:TDateTime;
begin
    with Table1 do
      begin
        while not Eof do
          begin
            edit;
            Datum := StrToDate(FieldValues['date']);
            FieldValues['date'] := Datum;
            post;
            Next;
          end
      end
end;

Jelly 13. Apr 2006 19:33

Re: Datumsformat in DB ändern von 04 nach 20004
 
Wenn dein Datumfeld "date" ein String, so wird dies vermutlich fehlschlagen, weil Datum vom Typ TDateTime ist.
Delphi-Quellcode:
FieldValues['date'] := Datum;
Es bleibt Dir also nichts anderes übrig, als weiterhin mit Strings zu arbeiten... Aber vielleicht gehts auch in einem Ruck, wenn du mir verräts, um welche Datenbank es sich hierbei handelt.
(Und wie kommt man auf die Idee, ein Datumsfeld als String zu speichern :gruebel: )

marabu 13. Apr 2006 19:41

Re: Datumsformat in DB ändern von 04 nach 20004
 
Hallo Tom und Tom,

Zitat:

Zitat von Jelly
Und wie kommt man auf die Idee, ein Datumsfeld als String zu speichern

wenn die Tabelle sowieso reorganisiert wird, dann würde ich gleich den Feldtyp entsprechend ändern.

Grüße vom marabu

torud 13. Apr 2006 20:13

Re: Datumsformat in DB ändern von 04 nach 20004
 
Ach ja ich weiss. Ich war damals noch dümmer als ich es noch immer zu sein scheine. Es handelte sich um ein dbf-Datei. Also was nettes mit der BDE. Klar kann ich das ändern, aber das Problem ist, dass ich dann eines der Programme, die darauf zugrifen auch wieder neu kompolieren muss, und dies ist etwas tricky, da das nur auf Arbeit geht und ich dort derzeit absolut keine Zeit habe, leider.

Ich kam blos in die Verlegenheit diese DB nun zu benutzen, weil das FA bei mir anfragte, wie es mal mit ner Ust.-Erklärung wäre. Hm und da die anscheinend alle sganz genau wissen wollen, wollte ich eben mal ne Routine über die DB jage, damit die mir alle verkauften Lizenzen von 2005 ausspuckt. Es ging dann über SQL mit fixer Angabe der ID´s (von - bis).

Vielmehr Kopfschmerzen macht mir das Thema FA, weil ich da nicht wirklich die grosse Ahnung habe und die vom FA sich weigerten mir ne nette Auskunft zu geben. Is wohl aber was für nen eigenen Thread...

@Jelly, es klappte aber trotzdem. Vermutlich lag es einfach daran, dass es sich bei der Übergabe dann um einen Variant handelte!? Egal, das Thema ist vorerst durch...

Jelly 13. Apr 2006 21:32

Re: Datumsformat in DB ändern von 04 nach 20004
 
Also bei DBase ist glaub ich nicht viel mit einem direktem SQL Befehl um die besagte Spalte zu verändern. Rezentere DB Systeme bieten auch Stringbehandlungsroutinen mit, damit wärs einfacher. So bleibt dir wohl nix anderes übrig, also das Datensatz für Datensatz zu lösen. Wichtig dabei ist aber, dass du lediglich mit Strings arbeitest, weil Du ja nicht auf TimeStamp umsteigen kannst.

Hier mal ein Schnippsel, allerdings ungetestet:

Delphi-Quellcode:
procedure TForm1.btn_set_dateClick(Sender: TObject);
var
  oldDate, newDate : string ;
begin
    with Table1 do
      First ;
      begin
        while not Eof do
          begin
            edit;
            oldDate := FieldByName('date').AsString ;
            try
               dd := StrToInt(copy(oldDate,1,2)) ;
               mm := StrToInt(copy(oldDate,4,2)) ;
               yy := StrToInt(copy(oldDate,7,2)) ;
            except
               raise exception.create (oldDate + ' konnte nicht ins neue Format konvertiert werden') ;
            end ;
            if yy >= 70   // ab 1970 berücksichtigt. Älter wird als 2069 interpretiert
            then yy := 1900 + y
            else yy := 2000 + y ;
            FieldValues['date'] := FormatDateTime ('dd.mm.yyyy',EncodeDate (yy,mm,dd)) ;
            post;
            Next;
          end
      end
end;


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