Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Aus Wert ein Datum konventieren (https://www.delphipraxis.net/165025-aus-wert-ein-datum-konventieren.html)

ByTheTime 11. Dez 2011 19:28

Aus Wert ein Datum konventieren
 
Hallo,
ich zerbeche mir schon seit einiger Zeit den Kopf an einem Problem. Da mein Programm noch mit der guten, alten BDE arbeitet, jedoch nicht jeder der mein Prog hat, einfach so die Werte verarbeiten kann, habe ich ein kleines Tool geschreiben, das jeden Datensatz in Excel schreibt (somit kann jeder damit arbeiten, etc.). Aber in der DB sind wirklich ssseeehhhrrrr viele Datensätze, wenn ich das Prog durchlaufen lasse, dauert es fast 15min (!), bis alles in Excel ist. Es nervt jedoch etwas, wenn mann immer wieder warten muss, obwohl sich vllt. nur ein paar Datensätze ändern. Daher lese ich aus der vorhandenen Exceldatei den letzten Datensatz aus (Datum und Zeit). Mit Table1.FindKey möchte ich jetzt mein Prog auf den nächsten, in der Exceldatei noch nicht vorhandenen Datensatz springen lassen. Das funktioniert mit dem Datum bis jetzt. Allerdings hat Excel die doofe Gewohnheit, den bekommenen String (von einem Datensatz das Datum) in ein Benutzerdefiniertes Datum umzuwandeln (aus '10:27:41' wird '10:27:41 AM'. Wenn ich nun mein Prog die Exceldatei auslesen lasse (nach Datum und Zeit), findet er korrekt das Datum, die Zeit allerdings als Wert (0,4.....). Und hier tritt nun der Fehler auf, das er es in der DB nicht findet (wie auch?!). Aber wie soll ich den erhaltenen Wert nun umwandeln? StrToDate etc. funzt nicht!

Wolfgang Mix 11. Dez 2011 19:38

AW: Aus Wert ein Datum konventieren
 
Wenn ich richtig verstanden habe, brauchst du nur die ersten 8 Zeichen aus dem dem Datumstring (s).
Den Rest wirst du mit

Delphi-Quellcode:
delete(s,9,3)
los.

ByTheTime 11. Dez 2011 19:57

AW: Aus Wert ein Datum konventieren
 
Das mit dem Delete funktioniert zwar, aber ich hänge immer noch ein bisschen.

Delphi-Quellcode:
//Bisheriger Code:

 SDatum := VarToStr(Excel.Cells[e, 1].Value);
 SZeit := VarToStr(Excel.Cells[e, 2].Value);

 delete(SZeit, 1, 2);
 delete(SZeit, 9, 7);
 StrToDate(SZeit);
 //ShowMessage(SDatum + ', ' + SZeit);

 Table1.FindKey([SDatum, SZeit])

ByTheTime 11. Dez 2011 19:57

AW: Aus Wert ein Datum konventieren
 
Beim Date hängt es, da der Wert, den ich bekomme kein gültiges Datum ist.

Luckie 11. Dez 2011 20:26

AW: Aus Wert ein Datum konventieren
 
Was steht denn letztendlich in SZeit drin?

Question_mark 11. Dez 2011 21:00

AW: Aus Wert ein Datum konventieren
 
Hallo,

Zitat:

Zitat von "ByTheTime
Beim Date hängt es, da der Wert, den ich bekomme kein gültiges Datum ist.

Mal eine Frage : Handelt es sich bei Deinem OS um Windows 7 mit Multilanguage User Interface (MUI), so wie es von Microsoft für einige Großkunden abgefüllt wird ?

Gruß

Question_mark

ByTheTime 11. Dez 2011 21:06

AW: Aus Wert ein Datum konventieren
 
In Excel geht 11:24:35 rein:
Delphi-Quellcode:
Excel.Cells[i + c, 2].Value := Table1Zeit.Value;
In Excel steht das dann als 11:24:35 PM.
Aus Excel heraus mit
Delphi-Quellcode:
SZeit := (Excel.Cells[e, 2].Value);
kommt es als: 0,435295749386401(nur Bsp.)

Nach dem Delete:
Delphi-Quellcode:
 delete(SZeit, 1, 2);
 delete(SZeit, 9, 7);
steht dann da: 43529574

@Questin_mark: Gute frage, kann ich mir das iwo anschauen? Habe Win7 HP 64bit. Denke nicht, das MUI dabei ist. Sollten nur Englisch und Deutsch sein.

Bummi 11. Dez 2011 21:09

AW: Aus Wert ein Datum konventieren
 
Du bekommst schon TTime und TDate Werte letztlich ist TDateTime nur ein Double mit beispielsweise 0.5=12:00 0.75=18:00. Stringoperationen sind hier gar nicht angesagt.

Luckie 11. Dez 2011 21:15

AW: Aus Wert ein Datum konventieren
 
Na ja, das das kein gültiges Datum ist, ist offensichtlich. Anscheinend bekommst du die Uhrzeit als Float von Excel geliefert. Und wenn du die 0 und das Komma abschneidestm, kann das natürlich nicht mehr konvertiert werden.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const
  FloatTime = 0.435295749386401;
begin
  ShowMessage(TimeToStr(FloatTime));
end;

Question_mark 11. Dez 2011 21:35

AW: Aus Wert ein Datum konventieren
 
Hallo,

Zitat:

Zitat von ByTheTime
Denke nicht, das MUI dabei ist. Sollten nur Englisch und Deutsch sein.

Deutsch und englisch ist doch schon multilanguage ...
Hast Du den PC vom Saturn, Mediamarkt oder von deinem Arbeitgeber, der ein eigenes Lizenzabkommen mit MS hat, wie z.B. Siemens, Mercedes, Deutsche Bank oder was weiss ich ?

Wenn letzteres zutrifft, dann stelle einfach nur in der Systemeinstellung von Windows 7 die Regions- und Spracheinstellungen (also auch die Sprache und Darstellung von ShortTime, LongTime, ShortDate etc.) auf eine beliebige Sprache um und danach wieder auf deutsches Format zurück. Diese Win7 MUI Packages von MS haben einen Fehler, den MS zwar kennt, aber nicht beseitigen will. Auf der Win7 Oberfläche werden zwar z.B. in der Taskbar Datum und Uhrzeit korrekt im deutschen Format angezeigt .. Aber intern arbeitet Win7 immer noch mit den amerikanischen Formatierungen und da fällt man bei Datum/Zeitvergleichen mit Datenbanken etc. ganz mächtig auf die Sch...ze.

Gruß

Question_mark

Luckie 11. Dez 2011 21:40

AW: Aus Wert ein Datum konventieren
 
Wie ich schon gezeigt habe, hat es damit nichts zu tun.

Question_mark 11. Dez 2011 22:40

AW: Aus Wert ein Datum konventieren
 
Hallo,

Zitat:

Zitat von ByTheTime
In Excel steht das dann als 11:24:35 PM.

Sieht schon sehr nach amerikanischer Formatierung aus, da steht AM/PM ....

Zitat:

Zitat von Luckie
Wie ich schon gezeigt habe, hat es damit nichts zu tun.

Dann warten wir doch einfach mal ab, ob ByTheTime in der Lage ist, sein Betriebssystem zu identifizieren.

Wenn nicht, dann kann und will ich ihm auch nicht weiterhelfen.

Gruß

Question_mark

Sir Rufo 11. Dez 2011 22:52

AW: Aus Wert ein Datum konventieren
 
Zitat:

Zitat von Question_mark (Beitrag 1140889)
Hallo,

Zitat:

Zitat von ByTheTime
In Excel steht das dann als 11:24:35 PM.

Sieht schon sehr nach amerikanischer Formatierung aus, da steht AM/PM ....

Zitat:

Zitat von Luckie
Wie ich schon gezeigt habe, hat es damit nichts zu tun.

Dann warten wir doch einfach mal ab, ob ByTheTime in der Lage ist, sein Betriebssystem zu identifizieren.

Wenn nicht, dann kann und will ich ihm auch nicht weiterhelfen.

Gruß

Question_mark

Wenn man jemanden helfen möchte, dann sollte man zuhören oder in diesem Medium lesen:
Zitat:

Zitat von ByTheTime (Beitrag 1140868)
In Excel geht 11:24:35 rein:
Delphi-Quellcode:
Excel.Cells[i + c, 2].Value := Table1Zeit.Value;
In Excel steht das dann als 11:24:35 PM.
Aus Excel heraus mit
Delphi-Quellcode:
SZeit := (Excel.Cells[e, 2].Value);
kommt es als: 0,435295749386401(nur Bsp.)

Da wird also ein Float-Wert (als String) zurückgeliefert.
Was soll das also bitte schön mit irgendeiner Regions-Einstellung zu tun haben? :roll:

Die Lösung würde so aussehen:
Delphi-Quellcode:
var
  lTime : TTime;

  lTime := StrToFloat( Excel.Cells[e, 2].Value );
Wenn
Delphi-Quellcode:
Value
von Typ
Delphi-Quellcode:
Variant
ist dann sollte es sogar so funktionieren:

Delphi-Quellcode:
var
  lTime : TTime;

  lTime := Excel.Cells[e, 2].Value;

Bummi 11. Dez 2011 23:02

AW: Aus Wert ein Datum konventieren
 
@Question_mark
er braucht doch nur Datum als Float/TDate und Zeit als Float/TTime lesen und verwenden.

ByTheTime 12. Dez 2011 18:42

AW: Aus Wert ein Datum konventieren
 
Ich denke nicht das das was mit MUI zutun hat, habe Win7 HP und als Microsoft-Partner bekommt man min. Prof. ;)
Das mit dem Float werde ich mal ausprobieren (:S, hatte es schon im Hinterkopf). Das habe ich aber bis jetzt nicht gemacht, da ich gehört habe, das man die ersten 2 Stellen wohl nicht braucht (Null und Komma), sowie alles was nach der Achten steht (ist mir völlig unverständlich). Naja, kann leider gerade nicht an mein Delphi, werde mein Ergebniss spätestens morgen mal posten.

Sir Rufo 12. Dez 2011 19:51

AW: Aus Wert ein Datum konventieren
 
Für die Speicherung eines Datum/Zeitwertes sind mir 2 Verfahren bekannt:

1. Float-Wert (u.a. in Delphi benutzt)

1Tag = 24h = 100% = 1.0
12h = 50% = 0.5
etc.

2. Auch ein Float-Wert, aber
Code:
JJJJMMDD.HHNNSSZZZ
Dadurch wird der 12.12.2011 20:46:33.562 zu 20111212.204633562
Ein reiner Zeitwert 20:46:33.562 ist dann 0.204633562

Bummi 12. Dez 2011 20:07

AW: Aus Wert ein Datum konventieren
 
wo hast Du Nr 2. her? Zum rechnen taugt der irgendwie gar nicht....

Wolfgang Mix 12. Dez 2011 21:35

AW: Aus Wert ein Datum konventieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht hilft dies weiter

http://www.delphipraxis.net/142643-p...it-delphi.html


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