PDA

Vollständige Version anzeigen : Datums-/Zeitformat abweichend zu Acc2000 nach Konvertierung - Berechnungsfehler


jaymz1102
26.04.2011, 08:16
Hallo Forum,

ich habe eine Access 2000 Datenbank in eine Access 2003 Datenbank konvertiert. So weit, so gut. In dieser Datenbank, welche zur Zeiterfassung von IT-Tätigkeiten dient, werden Tickets angelegt, auf welche wiederum einzelne Tätigkeiten erfasst werden. Dabei werden in einer verknüpften Tabelle der Fremdschlüssel, das Datum, die Tätigkeitsbeschreibung sowie die dafür benötigte Zeit eingetragen, z.B. 00:15 (für 15min).

In einem späteren Vorgang werden aus diesen Einzeltätigkeiten Summen gebildet. Das geschieht bei VBA-Code. So ergibt sich am Monatsende für ein Ticket z.B. die Summe 118:30 h.

Die Felder zur Zeiteingabe sind mit "Zeit, lang" formatiert, um Eingabe und Anzeige von Zeiten >24h zuzulassen. Hat auch alles bisher einwandfrei funktioniert. Erst mit der Konvertierung in das Access 2003 Format kamen die Probleme.

Ich habe festgestellt, dass Access 2000 eine Eingabe von "00:50" in der zugrundeliegenden Tabelle im Format "30.12.1899 00:50:00" abspeichert, wohingegen Access 2003 daraus ein einfache "00:50:00" macht. Das führt dazu, das sich bei der Summenbildung Werte wie z.B. -297:30:00 ergeben. Die Formatierung der Felder im Formular sowie der Datentyp in der zugrundeliegenden Tabelle wurden nicht geändert.

Ich habe nun keinen Ansatz, warum das ein Unterschied zwischen Access 2000 und Access 2003 ist und wie ich ihn beheben kann. Ein Tipp wäre super!

ebs17
26.04.2011, 08:54
In einem späteren Vorgang werden aus diesen Einzeltätigkeiten Summen gebildet. Das geschieht bei VBA-Code.
In diesem Code wird ein Fehler liegen.
Wenn ich Zeiten addiere, kann es keine negativen Summen geben (unabhängig von einer Access-Version).
Daher solltest Du Dich
a) mit dem Date-Datentyp richtig beschäftigen und
b) die genannte Berechnung überprüfen.

jaymz1102
26.04.2011, 10:14
Der VBA-Code ist eigentlich unspektakulär. Es geht schon dabei los, dass ich in einer Tabelle die Ankunfts-, End-, Pausen- und sonstige Zeit eintrage, um damit letztlich die produktive Zeit zu erhalten. Wie folgt:

Ankunft: 7:00 Uhr
Pause: 1:00 h
Sonstiges: 0:20 h
Ende: 17:00 Uhr

Somit habe ich folgende produktive Zeit:
((17:00 - 7:00) - 1:00) - 0:20 = 8:40 h

Der Code macht das wie folgt (und das hat immer funktioniert unter Access 2000):

Me.TimeTotal = ((Me.TimeGo - Me.TimeCome) - Me.TimeBreak) - Me.TimeOther

Ich lasse mir die Werte der Felder per debug.print ausgeben:
01.01.1900 17:00:00
01.01.1900 07:00:00
01.01.1900 01:00:00
01.01.1900 00:20:00

Ergebnis:
27.12.1899 15:20:00

Im Formular steht dann 15:20:00. Das stimmt doch nicht.

jaymz1102
26.04.2011, 10:49
Vielleicht andersrum:

Access 2000 speichert bei der Eingabe des Werts "00:45" im Formular folgenden Wert in der zugrundeliegenden Tabelle:
30.12.1899 00:45:00

Access 2003 dagegen speichert denselben Wert "00:45" bei Eingabe im Formular in derselben Tabelle als:
00:45:00

Wenn ich nun den Wert dieses Records mit VBA in Access 2003 auslese und per debug.print ausgebe, dann sieht er wie folgt aus:
01.01.1900 00:45:00

Wie kann ich Access 2003 dazu veranlassen, den Wert identisch zu Access 2000 zu speichern?

kama
26.04.2011, 10:52
Hallo
Du vermischst Uhrzeit (07:00) mit Zeitmenge (00:20) das geht zwar, weil access Zeiten als dezimalbruch darstellt, du mußt aber dafür sorgen das diese auch so erkannt werden.
Hier ein Beispiel
?Format(#17:00#- #07:00#-#001:00#-#00:20#,"hh:nn")
" 08:40 Stunden"
Verlagere die Berechnung in eine dem Formular zugrunde liegende Abfrage
TimeTotal: TimeGo &"#" - "#" & TimeCome &"#" - "#" & TimeBreak - "#" & TimeOther & "#"

Wie kann ich Access 2003 dazu veranlassen, den Wert identisch zu Access 2000 zu speichern?

Format wäre dann text, aber welches Datum er davor setzt ist doch für die Berechnung vollkommen gleichgültig

ebs17
26.04.2011, 10:56
Ich lasse mir die Werte der Felder per debug.print ausgeben:
Bei Dir sieht man Formate, keine Werte. Ein Date-Wert ist intern eine Zahl vom Typ Double. Die Ganzzahlen stehen dabei für Tage, die Dezimalstellen stehen für Tagesbruchteile (= Zeiten). Eine reine Zeit kann nur einen Wert zwischen 0 und 1 haben, Darstellungen von Zeiten >= 24 Stunden sind daher nur über Sondermaßnahmen möglich.
Mit "richtigen" Zahlen kann man übersichtlich rechnen.
' z.B. so erhält man Werte (Zahlen)
Debug.Print Me.TimeGo * 1

Der "Nullpunkt" für die Zahlen liegt übrigens bei ...
?#12/30/1899# * 1
-> 0

' reine Zeit (ohne Tagesanteil)
?#12/30/1899 17:00:00# * 1
-> 0,708333333333333

' hier werden schon mal zusätzlich 2 Tage = 48 Stunden mitgeführt
?#1/1/1900 17:00:00# * 1
-> 2,70833333333333

kama
26.04.2011, 11:03
Hier mal aus dem direkt fenster
?Cdbl(#31/12/2011 17:00:00#)
40908,7083333333 >>>>Doublezahl für die bis zu diesem Zeitpunkt verstrichenen Tage und Sekunden
?Cdbl(#17:00:00#)
0,708333333333333 nur Sekunden als Double
?Format(Cdbl(#31/12/2011 17:00:00#),"dd/mm/yyyy hh:nn:ss")
31.12.2011 17:00:00
?Format(Cdbl(#17:00:00#),"dd/mm/yyyy hh:nn:ss")
30.12.1899 17:00:00
?Format(Cdbl(#17:00:00#),"hh:nn:ss")
17:00:00

Lanz Rudolf
26.04.2011, 11:34
Hallo
irgend wo in der OH (OnlineHilfe) steht so was :
So bedeutet der Wert -0,5 nicht etwa "29.12.1899 12:00", sondern 12 Uhr des Tages 0, also "30.12.1899 12:00"
genau so wie auch 0,5. Denn der Dezimalbruch 0,5 ist und bleibt 12 Uhr, egal ob vom Tag +0 oder vom Tag -0.
Die unweigerliche Konsequenz daraus ist schliesslich, dass Sie bei gleichen Datumswerten vor dem 30.12.1899
mit unterschiedlichem Uhrzeit-Anteil den Wert erst einmal zerlegen müssen, ehe Sie den Vergleich anstellen
können.was auch für das Sortieren gilt.
Der 30. Dezember 1899 00:00:00 Uhr wird durch die Zahl 0 dargestellt.
Der 30. Dezember 1899 12:00:00 Uhr wird durch die Zahl 0,5 dargestellt.

möglich währe auch das Dir ein solcher Format Helfen könnte
Format(Deindatumsfeld, "C")
C Zeigt das Datums in der Form ddddd und die Zeit in der Form ttttt an, und zwar in dieser Reihenfolge. Hat die fortlaufende Zahl
für das Datum keine Nachkommastellen, so wird nur das Datum angezeigt. Hat sie ausschliesslich Nachkommastellen, so wird
lediglich die Uhrzeit angezeigt.
ddddd Zeigt ein vollständiges Datum (einschliesslich Tag, Monat und Jahr) an, das entsprechend der Systemeinstellung für das kurze
Datumsformat formatiert ist. Die Voreinstellung für das kurze Datumsformat ist dd.mm.yy.
t t t t tZeigt eine vollständige Zeitangabe (einschliesslich Stunden, Minuten und Sekunden) an, die mit dem Zeit-Trennzeichen
formatiert ist, das in der Systemeinstellung für das Zeitformat festgelegt ist. Eine führende Null wird angezeigt, wenn die
entsprechende Option ausgewählt wurde und die Zeit vor 10:00 liegt. Die Voreinstellung für das Zeitformat ist h:mm:ss.
z.B. 9:12:12 09:12:12

z.B
Format("0:45", "C") gibt --> 00:45:00
Format("26.04.2011 0:45", "C") gibt -->26.04.2011 00:45:00

jaymz1102
26.04.2011, 12:00
Hallo an alle,

danke für die zahlreichen Tipps. Nun verstehe ich das Ganze schon etwas besser :D

Ich modifiziere mal meine Forms und Codes. Sieht schon besser aus.

Gruß aus München
Alex

Lanz Rudolf
26.04.2011, 12:37
Hallo
noch ein Tip
melde Dich doch hier im Forum an das Kostet NICHTS 0.0 €
und tut bestimmt nicht weh ;)

Lanz Rudolf
27.04.2011, 08:44
Hallo
evtl. klickst Du einmal auf den Link hinter Meine Doc
in meiner Fusszeile.
oder hier
http://cid-0838611f737bd3d9.office.live.com/self.aspx/ACC/ACCESS%202000BU%20Begleitunterlagen.pdf
und liest dort ab Seite 264 (10.12 Gennereles über den Datentyp (Datum/Uhrzeit) bis Seite 300
du kannst natürlich auch die ganze Pdf-Datei (Doc) lesen ;)