TimerDiff/TimerInit will nicht mit großen Zahlen rechnen

  • Hallo liebe Community,

    wie die Überschrift schon sagt, möchte die genannte Funktion keine großen Zahlen verarbeiten.
    Ich möchte die Differenz im Format hh:mm:ss vom Zeitpunkt A zum Zeitpunkt B haben.
    Gebe ich ihm durch eine Klick auf die Buttons im GUI eine Differenz von einigen Minuten, funktioniert das alles wunderbar. Bei knapp 8 Stunden macht er dann ganz andere Differenzen daraus.
    Wie das bei anderen Zahlen aussieht kann ich euch leider nicht sagen, da ich noch nichts anderes versucht habe das größer als eine Stunde ist.
    Würde mich sehr über Hilfe freuen.

    #Edit: Gelöst!

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.8.1
    Programm Version: 1.0.2
    Autor: Domenick L.
    Kontakt: [email='dnick92@web.de'][/email]

    [/autoit] [autoit][/autoit] [autoit]

    Script Funktion:
    Dokumentiert ihre Arbeitzeiten samt Pausen übersichtlich in einer .csv-Datei.
    Die Gesamt Arbeits- und Pausenzeit wird automatisch ausgerechnet.
    Es kann nur ein Pausenstart und ein Pausenende berechnet werden,
    also nur eine Pause!
    Werte die sie doppelt eintragen lassen, werden überschrieben!

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #NoTrayIcon
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Arbeitszeiten - Version 1.0.2", 300, 220)

    [/autoit] [autoit][/autoit] [autoit]

    $Start = GUICtrlCreateButton("Anfang", 10, 105, 90, 35)
    $Stop = GUICtrlCreateButton("Feierabend", 110, 105, 90, 35)
    $Ende = GUICtrlCreateButton("Ende", 220, 105, 70, 35)
    $PauseStart = GUICtrlCreateButton("Pause-Start", 10, 150, 90, 30)
    $PauseEnde = GUICtrlCreateButton("Pause-Ende", 110, 150, 90, 30)
    $Update = GUICtrlCreateButton("Auf neue Updates prüfen", 10, 190, 190, 20)
    $Hilfe = GUICtrlCreateButton("Homepage", 220, 190, 70, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel ("Dieses Programm dokumentiert deine Arbeitszeiten.", 10, 10)
    GUICtrlCreateLabel ("Beginnst du deinen Arbeitstag, drücke ""Anfang"",", 10, 35)
    GUICtrlCreateLabel ("Beendest du ihn, drücke ""Feierabend"".", 10, 50)
    GUICtrlCreateLabel ("Das Dokument wird Standardmäßig als .csv-Datei", 10, 65)
    GUICtrlCreateLabel ("in dem Ordner C:\Users\"&@UserName&"\Arbeits-Info gespeichert.", 10, 80)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Datum = @MDAY & "." & @MON & "." & @YEAR
    Global $kurzDatum = @MON & "." & @YEAR
    Global $Pfad = ("C:\Users\"&@UserName&"\Arbeits-Info")
    Global $csvPfad = ("C:\Users\"&@UserName&"\Arbeits-Info\Arbeitszeiten-"&$kurzDatum&".csv")
    Global $ini = ("C:\Users\"&@UserName&"\Documents\Arbeitszeiten.ini")
    Global $section = ("Arbeitszeiten")
    Global $GesamtHH, $GesamtMM, $GesamtSS, $PauseHH, $PauseMM, $PauseSS

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists ($Pfad) Then DirCreate ($Pfad)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case $msg = $Start

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists ($csvPfad) Then FileWrite ($csvPfad, " Datum ; ;
    Begonnen ; ; Pause von ; Pause bis ; ; Beendet ; ; Pause ; Gesamt" &
    @CRLF & @CRLF)
    If FileExists ($ini) Then FileDelete ($ini)
    IniWrite ($ini, $section, "Start", TimerInit())
    FileWrite ($csvPfad, " " & $Datum & "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    Case $msg = $PauseStart
    IniWrite ($ini, $section, "PauseStart", TimerInit())
    FileWrite ($csvPfad, "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    Sleep (1000)
    MsgBox (0, "Hinweis", "Bitte vergesse nicht, deine Pause auch wieder zu beenden!")
    Case $msg = $PauseEnde
    IniWrite ($ini, $section, "Pause", TimerDiff(IniRead($ini, $section, "PauseStart","0x00")))
    FileWrite ($csvPfad, ";" & @HOUR & ":" & @MIN & ":" & @SEC)
    Case $msg = $Stop
    _GesamtPause ()
    IniWrite ($ini, $section, "Gesamt", TimerDiff(IniRead($ini, $section, "Start","0x00")))
    _Gesamt ()
    FileWrite ($csvPfad, "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    FileWrite ($csvPfad, "; ;" & $Pause & ";" & $Gesamt & @CRLF)
    Case $msg = $Hilfe
    ShellExecute ("http://gabbadome.de/programme/")
    Case $msg = $Update
    _Update ()
    EndSelect
    Until $msg = -3 or $msg = $Ende

    [/autoit] [autoit][/autoit] [autoit]

    Func _Gesamt ()
    Local $Gesamt1 = IniRead ($ini, $section, "Gesamt","0x00") - IniRead ($ini, $section, "Pause", "0x00")
    _TicksToTime($Gesamt1, $GesamtHH, $GesamtMM, $GesamtSS)
    Global $Gesamt = StringFormat ("i:i:i", $GesamtHH, $GesamtMM, $GesamtSS)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GesamtPause ()
    _TicksToTime(IniRead($ini, $section, "Pause", "0x00"), $PauseHH, $PauseMM, $PauseSS)
    Global $Pause = StringFormat ("i:i:i", $PauseHH, $PauseMM, $PauseSS)
    If Not IniRead ($ini, $section, "PauseStart", "0x00") Then IniWrite ($ini, $section, "PauseStart", "00")
    If Not IniRead ($ini, $section, "Pause", "0x00") Then IniWrite ($ini, $section, "Pause", "00")
    If IniRead ($ini, $section, "PauseStart", "0x00") = 0 Then FileWrite ($csvPfad, "; ;00:00:00")
    If IniRead ($ini, $section, "Pause", "0x00") = 0 Then FileWrite ($csvPfad, ";00:00:00")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Update ()
    $version = "1.0.2"
    HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.6.10")

    [/autoit] [autoit][/autoit] [autoit]


    InetGet("http://th10812-web487.vorschau.server3.tophoster.de/download/Version.txt","C:\Users\"&@UserName&"\Downloads\Version.txt",
    1, 0)
    $file = FileOpen ("C:\Users\"&@UserName&"\Downloads\Version.txt", 0)
    $line = FileReadLine($file, 1)
    If $line = $version Then
    MsgBox(0, "Update", "Es ist kein Update vorhanden!")
    Else
    If MsgBox (4, "Update","Es ist ein Update verfügbar!"&@CRLF&"Wollen sie es jetzt herunterladen?")= 6 Then
    HttpSetUserAgent ("Firefox")

    [/autoit] [autoit][/autoit] [autoit]

    InetGet
    ("http://th10812-web487.vorschau.server3.tophoster.de/download/Arbeitszeiten-Zeilen.exe","C:\Users\"&@UserName&"\Downloads\Arbeitszeiten-Zeilen.exe",
    1, 0)
    If MsgBox (4, "Update","Das Update wurde erfolgreich
    beendet!"&@CRLF&"Wollen sie den Ordner mit der neuen Version
    öffnen?") = 6 Then
    ShellExecute ("C:\Users\"&@UserName&"\Downloads")
    EndIf
    EndIf
    EndIf
    FileClose ($file)
    FileDelete("C:\Users\"&@UserName&"\Downloads\Version.txt")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]



    Lösung:

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.8.1
    Programm Version: 1.0.3
    Autor: Domenick L.
    Kontakt: [email='dnick92@web.de'][/email]

    [/autoit] [autoit][/autoit] [autoit]

    Script Funktion:
    Dokumentiert ihre Arbeitzeiten samt Pausen übersichtlich in einer .csv-Datei.
    Die Gesamt Arbeits- und Pausenzeit wird automatisch ausgerechnet.
    Es kann nur ein Pausenstart und ein Pausenende berechnet werden,
    also nur eine Pause!
    Werte die sie doppelt eintragen lassen, werden überschrieben!

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #NoTrayIcon
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Arbeitszeiten - Version 1.0.3", 300, 220)

    [/autoit] [autoit][/autoit] [autoit]

    $Start = GUICtrlCreateButton("Anfang", 10, 105, 90, 35)
    $Stop = GUICtrlCreateButton("Feierabend", 110, 105, 90, 35)
    $Ende = GUICtrlCreateButton("Ende", 220, 105, 70, 35)
    $PauseStart = GUICtrlCreateButton("Pause-Start", 10, 150, 90, 30)
    $PauseEnde = GUICtrlCreateButton("Pause-Ende", 110, 150, 90, 30)
    $Update = GUICtrlCreateButton("Auf neue Updates prüfen", 10, 190, 190, 20)
    $Hilfe = GUICtrlCreateButton("Homepage", 220, 190, 70, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel ("Dieses Programm dokumentiert deine Arbeitszeiten.", 10, 10)
    GUICtrlCreateLabel ("Beginnst du deinen Arbeitstag, drücke ""Anfang"",", 10, 35)
    GUICtrlCreateLabel ("Beendest du ihn, drücke ""Feierabend"".", 10, 50)
    GUICtrlCreateLabel ("Das Dokument wird Standardmäßig als .csv-Datei", 10, 65)
    GUICtrlCreateLabel ("in dem Ordner C:\Users\"&@UserName&"\Arbeits-Info gespeichert.", 10, 80)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Datum = @MDAY & "." & @MON & "." & @YEAR
    Global $kurzDatum = @MON & "." & @YEAR
    Global $Pfad = ("C:\Users\"&@UserName&"\Arbeits-Info")
    Global $csvPfad = ("C:\Users\"&@UserName&"\Arbeits-Info\Arbeitszeiten-"&$kurzDatum&".csv")
    Global $ini = ("C:\Users\"&@UserName&"\Documents\Arbeitszeiten.ini")
    Global $section = ("Arbeitszeiten")
    Global $GesamtHH, $GesamtMM, $GesamtSS, $PauseHH, $PauseMM, $PauseSS

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists ($Pfad) Then DirCreate ($Pfad)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case $msg = $Start
    If Not FileExists ($csvPfad) Then FileWrite ($csvPfad, " Datum ; ; Begonnen ; ; Pause von ; Pause bis ; ; Beendet ; ; Pause ; Gesamt" & @CRLF & @CRLF)
    If FileExists ($ini) Then FileDelete ($ini)
    IniWrite ($ini, $section, "Start", _NowCalc())
    FileWrite ($csvPfad, " " & $Datum & "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    Case $msg = $PauseStart
    IniWrite ($ini, $section, "PauseStart", _NowCalc())
    FileWrite ($csvPfad, "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    Sleep (1000)
    MsgBox (0, "Hinweis", "Bitte vergesse nicht, deine Pause auch wieder zu beenden!")
    Case $msg = $PauseEnde
    IniWrite ($ini, $section, "Pause", _DateDiff ('s',(IniRead($ini, $section, "PauseStart","0x00")), _NowCalc()))
    FileWrite ($csvPfad, ";" & @HOUR & ":" & @MIN & ":" & @SEC)
    Case $msg = $Stop
    _GesamtPause ()
    IniWrite ($ini, $section, "Gesamt", _DateDiff ('s',(IniRead($ini, $section, "Start","0x00")), _NowCalc()))
    _Gesamt ()
    FileWrite ($csvPfad, "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    FileWrite ($csvPfad, "; ;" & $Pause & ";" & $Gesamt & @CRLF)
    Case $msg = $Hilfe
    ShellExecute ("http://gabbadome.de/programme/")
    Case $msg = $Update
    _Update ()
    EndSelect
    Until $msg = -3 or $msg = $Ende

    [/autoit] [autoit][/autoit] [autoit]

    Func _Gesamt ()
    Local $Gesamt1 = IniRead ($ini, $section, "Gesamt","0x00") - IniRead ($ini, $section, "Pause", "0x00")
    Global $Gesamt = _Umrechnen ($Gesamt1)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GesamtPause ()
    Global $Pause = _Umrechnen (IniRead($ini, $section, "Pause", ""))
    If Not IniRead ($ini, $section, "PauseStart", "0x00") Then IniWrite ($ini, $section, "PauseStart", "00")
    If Not IniRead ($ini, $section, "Pause", "0x00") Then IniWrite ($ini, $section, "Pause", "00")
    If IniRead ($ini, $section, "PauseStart", "0x00") = 0 Then FileWrite ($csvPfad, "; ;00:00:00")
    If IniRead ($ini, $section, "Pause", "0x00") = 0 Then FileWrite ($csvPfad, ";00:00:00")

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Umrechnen ($i)
    Local $H, $M, $S
    $H = Int ($i/3600)
    $M = Int ($i/60 - $H*60)
    $S = $i - $H*3600 - $M*60
    Return StringRight('00' & $H, 2) & ':' & StringRight('00' & $M, 2) & ':' & StringRight('00' & $S, 2)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Update ()
    $version = "1.0.3"
    HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.6.10")
    InetGet("http://th10812-web487.vorschau.server3.tophoster.de/download/Version.txt","C:\Users\"&@UserName&"\Downloads\Version.txt", 1, 0)
    $file = FileOpen ("C:\Users\"&@UserName&"\Downloads\Version.txt", 0)
    $line = FileReadLine($file, 1)
    If $line = $version Then
    MsgBox(0, "Update", "Es ist kein Update vorhanden!")
    Else
    If MsgBox (4, "Update","Es ist ein Update verfügbar!"&@CRLF&"Wollen sie es jetzt herunterladen?")= 6 Then
    HttpSetUserAgent ("Firefox")
    InetGet ("http://th10812-web487.vorschau.server3.tophoster.de/download/Arbeitszeiten-Zeilen.exe","C:\Users\"&@UserName&"\Downloads\Arbeitszeiten-Zeilen.exe", 1, 0)
    If MsgBox (4, "Update","Das Update wurde erfolgreich beendet!"&@CRLF&"Wollen sie den Ordner mit der neuen Version öffnen?") = 6 Then
    ShellExecute ("C:\Users\"&@UserName&"\Downloads")
    EndIf
    EndIf
    EndIf
    FileClose ($file)
    FileDelete("C:\Users\"&@UserName&"\Downloads\Version.txt")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]

    PS: Das Programm oder das Script steht unter der "Creative Commons"-Lizenz http://creativecommons.org/licenses/by-nc-nd/3.0/de/

    6 Mal editiert, zuletzt von Gabbadome (28. September 2012 um 15:26)

  • Die Timerfunktionen sind glaube ich auch nicht dafür gedacht in solchen Zeiträumen zu arbeiten.
    Soweit ich weiß wird irgendeine Anzahl Takte gezählt und anschileßend über den Prozessortakt die Zeit berechnet.

    Für größere Zeiträume gibts aber auch andere Funktionen.
    (Hab damit soetwas noch nie realisiert, aber das müsste klappen).

    Schau dir mal _DateDiff() und _NowCalc() genauer an. (incl der Hilfe-Beispiele)
    Damit kannst du dir einen Timer der ein beliebiges Intervall abdeckt erstellen.

  • Das sieht schon sehr gut aus danke.

    Nur zum Verständnis: um die Ausgabe im Format hh:mm:ss zu haben, muss ich die Ausgabe in Sekunden machen, und dann das Format des Strings verändern richtig?

  • Hab mal ein Beispiel gemacht.
    Es kann sein, dass diese Funktion völligen Mist ausrechnet. Die habe ich mir grade ausgedacht und nur ganz kurz getestet.
    Da müsste man evtl noch ne unabhängige Meinung (oder eine andere Funktion die das selbe tut) haben bevor man das für irgendwas wichtiges einsetzt.

    Wenn das so funktioniert kannst du das natürlich einfach übernehmen.

    Spoiler anzeigen
    [autoit]


    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global $Timer, $TimerDiff

    [/autoit] [autoit][/autoit] [autoit]

    $Timer = _NowCalc() ; Timer zünden

    [/autoit] [autoit][/autoit] [autoit]

    Sleep(5000) ; Warten

    [/autoit] [autoit][/autoit] [autoit]

    $TimerDiff = _DateDiff('s', $Timer, _NowCalc()) ; TimerDiff

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(_SecToHHMMSS($TimerDiff) & @CRLF) ; Umrechnen in HH:MM:SS

    [/autoit] [autoit][/autoit] [autoit]

    Func _SecToHHMMSS($i)

    [/autoit] [autoit][/autoit] [autoit]

    Local $H, $M, $S

    [/autoit] [autoit][/autoit] [autoit]

    $H = Int($i/3600)
    $M = Int($i/60 - $H*60)
    $S = $i - $H * 3600 - $M * 60

    [/autoit] [autoit][/autoit] [autoit]

    Return StringRight('00' & $H, 2) & ':' & StringRight('00' & $M, 2) & ':' & StringRight('00' & $S, 2)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit]
  • Sieht aus als könnte es funktionieren ;)
    Allerdings musst du mir mal eben erklären, was $i da macht

  • Danke euch beiden :)
    Alles verstanden und setz mich jetzt an die Umsetzung.
    Falls ich da noch was verhaue, frag ich hier nochmal :p

  • Okay ich krige grade eine mittelschwere Krise :D
    Jetzt funktioniert hier garnichts mehr. Meine Ausgabe Datei sieht aus wie ein Mienenfeld und richtig kalkulieren tut er auch nicht.
    Kann mal jemand drüber gucken?
    Btw: Ich habe vor knapp 4 Wochen erst AutoIt gelernt, also bitte nicht so hart sein ;)

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.8.1
    Programm Version: 1.0.2
    Autor: Domenick L.
    Kontakt: [email='dnick92@web.de'][/email]

    [/autoit] [autoit][/autoit] [autoit]

    Script Funktion:
    Dokumentiert ihre Arbeitzeiten samt Pausen übersichtlich in einer .csv-Datei.
    Die Gesamt Arbeits- und Pausenzeit wird automatisch ausgerechnet.
    Es kann nur ein Pausenstart und ein Pausenende berechnet werden,
    also nur eine Pause!
    Werte die sie doppelt eintragen lassen, werden überschrieben!

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    #NoTrayIcon
    #include <Date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Arbeitszeiten - Version 1.0.2", 300, 220)

    [/autoit] [autoit][/autoit] [autoit]

    $Start = GUICtrlCreateButton("Anfang", 10, 105, 90, 35)
    $Stop = GUICtrlCreateButton("Feierabend", 110, 105, 90, 35)
    $Ende = GUICtrlCreateButton("Ende", 220, 105, 70, 35)
    $PauseStart = GUICtrlCreateButton("Pause-Start", 10, 150, 90, 30)
    $PauseEnde = GUICtrlCreateButton("Pause-Ende", 110, 150, 90, 30)
    $Update = GUICtrlCreateButton("Auf neue Updates prüfen", 10, 190, 190, 20)
    $Hilfe = GUICtrlCreateButton("Homepage", 220, 190, 70, 20)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateLabel ("Dieses Programm dokumentiert deine Arbeitszeiten.", 10, 10)
    GUICtrlCreateLabel ("Beginnst du deinen Arbeitstag, drücke ""Anfang"",", 10, 35)
    GUICtrlCreateLabel ("Beendest du ihn, drücke ""Feierabend"".", 10, 50)
    GUICtrlCreateLabel ("Das Dokument wird Standardmäßig als .csv-Datei", 10, 65)
    GUICtrlCreateLabel ("in dem Ordner C:\Users\"&@UserName&"\Arbeits-Info gespeichert.", 10, 80)

    [/autoit] [autoit][/autoit] [autoit]

    Global $Datum = @MDAY & "." & @MON & "." & @YEAR
    Global $kurzDatum = @MON & "." & @YEAR
    Global $Pfad = ("C:\Users\"&@UserName&"\Arbeits-Info")
    Global $csvPfad = ("C:\Users\"&@UserName&"\Arbeits-Info\Arbeitszeiten-"&$kurzDatum&".csv")
    Global $ini = ("C:\Users\"&@UserName&"\Documents\Arbeitszeiten.ini")
    Global $section = ("Arbeitszeiten")
    Global $GesamtHH, $GesamtMM, $GesamtSS, $PauseHH, $PauseMM, $PauseSS

    [/autoit] [autoit][/autoit] [autoit]

    If Not FileExists ($Pfad) Then DirCreate ($Pfad)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $msg = GUIGetMsg()

    [/autoit] [autoit][/autoit] [autoit]

    Select
    Case $msg = $Start
    If Not FileExists ($csvPfad) Then FileWrite ($csvPfad, " Datum ; ; Begonnen ; ; Pause von ; Pause bis ; ; Beendet ; ; Pause ; Gesamt" & @CRLF & @CRLF)
    If FileExists ($ini) Then FileDelete ($ini)
    IniWrite ($ini, $section, "Start", _NowCalc())
    FileWrite ($csvPfad, " " & $Datum & "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    Case $msg = $PauseStart
    IniWrite ($ini, $section, "PauseStart", _NowCalc())
    FileWrite ($csvPfad, "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    Sleep (1000)
    MsgBox (0, "Hinweis", "Bitte vergesse nicht, deine Pause auch wieder zu beenden!")
    Case $msg = $PauseEnde
    IniWrite ($ini, $section, "Pause", _Umrechnen (_DateDiff('s',(IniRead($ini, $section, "PauseStart","0x00")), _NowCalc())))
    FileWrite ($csvPfad, ";" & @HOUR & ":" & @MIN & ":" & @SEC)
    Case $msg = $Stop
    _GesamtPause ()
    IniWrite ($ini, $section, "Gesamt", _Umrechnen (_DateDiff('s',(IniRead($ini, $section, "Start","0x00")), _NowCalc())))
    _Gesamt ()
    FileWrite ($csvPfad, "; ;" & @HOUR & ":" & @MIN & ":" & @SEC)
    FileWrite ($csvPfad, "; ;" & $Pause & ";" & $Gesamt & @CRLF)
    Case $msg = $Hilfe
    ShellExecute ("http://gabbadome.de/programme/")
    Case $msg = $Update
    _Update ()
    EndSelect
    Until $msg = -3 or $msg = $Ende

    [/autoit] [autoit][/autoit] [autoit]

    Func _Gesamt ()
    Global $Gesamt = IniRead ($ini, $section, "Gesamt","0x00") - IniRead ($ini, $section, "Pause", "0x00")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GesamtPause ()
    If Not IniRead ($ini, $section, "PauseStart", "0x00") Then IniWrite ($ini, $section, "PauseStart", "00")
    If Not IniRead ($ini, $section, "Pause", "0x00") Then IniWrite ($ini, $section, "Pause", "00")
    If IniRead ($ini, $section, "PauseStart", "0x00") = 0 Then FileWrite ($csvPfad, "; ;00:00:00")
    If IniRead ($ini, $section, "Pause", "0x00") = 0 Then FileWrite ($csvPfad, ";00:00:00")
    Global $Pause = IniRead($ini, $section, "Pause", "0x00")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Umrechnen ($i)
    Local $H, $M, $S
    $H = Int ($i/3600)
    $M = Int ($i/60 - $H*60)
    $S = $i - $H*3600 - $M*60
    Return StringRight('00' & $H, 2) & ':' & StringRight('00' & $M, 2) & ':' & StringRight('00' & $S, 2)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Update ()
    $version = "1.0.2"
    HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.1.6) Gecko/20091201 Firefox/3.6.10")
    InetGet("http://th10812-web487.vorschau.server3.tophoster.de/download/Version.txt","C:\Users\"&@UserName&"\Downloads\Version.txt", 1, 0)
    $file = FileOpen ("C:\Users\"&@UserName&"\Downloads\Version.txt", 0)
    $line = FileReadLine($file, 1)
    If $line = $version Then
    MsgBox(0, "Update", "Es ist kein Update vorhanden!")
    Else
    If MsgBox (4, "Update","Es ist ein Update verfügbar!"&@CRLF&"Wollen sie es jetzt herunterladen?")= 6 Then
    HttpSetUserAgent ("Firefox")
    InetGet ("http://th10812-web487.vorschau.server3.tophoster.de/download/Arbeitszeiten-Zeilen.exe","C:\Users\"&@UserName&"\Downloads\Arbeitszeiten-Zeilen.exe", 1, 0)
    If MsgBox (4, "Update","Das Update wurde erfolgreich beendet!"&@CRLF&"Wollen sie den Ordner mit der neuen Version öffnen?") = 6 Then
    ShellExecute ("C:\Users\"&@UserName&"\Downloads")
    EndIf
    EndIf
    EndIf
    FileClose ($file)
    FileDelete("C:\Users\"&@UserName&"\Downloads\Version.txt")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Exit

    [/autoit]

    #Edit: Also wenn ich die Umrechnungs-Funktion raus lasse, funkt alles wunderbar... -.-*

    PS: Das Programm steht uner der "Creative-Commons-Lizens" --> http://creativecommons.org/licenses/by-nc-nd/3.0/de/

    4 Mal editiert, zuletzt von Gabbadome (28. September 2012 um 12:31)

  • Man kann sich die eigene Umrechnung aber auch etwas vereinfachen und auf das Abschneiden von Nachkommastellen via int() verzichten, wenn man datediff() einfach mehrmals aufruft und die Ergebnisse zusammensetzt. Erleichtert wie bei mir z.B eine fallabhängiege Ausgabe im passenden Format. Bei mir war es nicht wichtig immer eine sekundengenaue Zeit anzugeben, weil das Programm teils wochenlang läuft und dann Tag + Stunden völlig ausreichen. Die Lösung von Mars schaut auf den ersten Blick aber auch fehlerfrei aus und liefert vermutlich korrekte Ergebnisse. Allerdings fehlen bei ihm die Tage in der Ausgabe, sofern das für dich relevant sein sollte.

    Spoiler anzeigen
    [autoit]


    #include <date.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $totalRuntime = _NowCalc()

    [/autoit] [autoit][/autoit] [autoit]

    sleep(3000)
    $tString1 = getFormatedTimeDiff($totalRuntime)

    [/autoit] [autoit][/autoit] [autoit]

    sleep(60000)
    $tString2 = getFormatedTimeDiff($totalRuntime)
    msgbox(0,"","diff1: " & $tString1 & @crlf & "diff2: " & $tString2 & @crlf)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func getFormatedTimeDiff($time)

    [/autoit] [autoit][/autoit] [autoit]

    local $timeString, $now, $days, $hours, $minutes, $seconds

    [/autoit] [autoit][/autoit] [autoit]

    $now = _NowCalc()

    [/autoit] [autoit][/autoit] [autoit]

    $days = _DateDiff( 'D',$time,$now)
    $hours = _DateDiff( 'h',$time,$now)
    $minutes = _DateDiff( 'n',$time,$now)
    $seconds = _DateDiff( 's',$time,$now)

    [/autoit] [autoit][/autoit] [autoit]

    If $days < 1 Then
    If $hours < 1 Then
    If $minutes < 1 Then
    $timeString = $seconds & " seconds."
    Else
    $timeString = $minutes & " minutes and " & $seconds-($minutes*60) & " seconds."
    EndIf
    Else
    $timeString = $hours & " hours and " & $minutes-($hours*60) & " minutes."
    EndIf
    Else
    $timeString = $days & " days and " & $hours-($days*24) & " hours."
    endif

    [/autoit] [autoit][/autoit] [autoit]

    return $timeString
    endfunc

    [/autoit]

    EDIT: Dein Script habe ich noch nicht angesehn. Kann ich also gerade auch noch nichts dazu sagen was schief läuft...
    EDIT2: Auf den ersten Blick denke ich aber, dass Mars Lösung eher für dich geeignet ist.

  • Danke erst einmal für die Antwort.
    Nein, Tage sind für mich nicht relevant, da hier die Stunden eines Arbeitstages aufgezeichnet werden sollen und dies sollte nicht mehr als 24 Stunden sein ;)
    Also wie schon geschrieben klappt alles super wenn ich die Funktion zur Umrechnung weg lasse und die Ausgabe in Sekunden lasse.
    Ich steig grade selber nicht mehr bei mir durch... -.-*

  • Ich steig zwar noch nicht ganz durch, aber mal paar Dinge die mir aufgefallen sind und erstmal nichts mit der eigentlichen Berechnung zu tun haben:

    1. Die Variablen $Pause und $Gesamt sind nicht deklariert, siehe Warnung von Scite Syntax check
    2. Ein Arbeitstag sollte zwar nicht mehr als 24h haben, aber darf doch gerne auch mehr als eine Pause haben oder nicht? Jedenfalls erlaubst du mehrere Pausenstarts verhaust dir dabei aber deine csv Struktur und gibst einen falschen Gesamtpausenwert in der ini (und csv?) an.
    3. Deine CSV wird auch bei Feierabend verhunzt, weil hier eines der doppelten "Semikolons" fehlt (bin ich gerade unsicher, da du scheinbar teilwerte mit einem einzelnen semikolon trennst... kA sieht komisch aus). Allgemein ist es ungewöhnlich ein doppeltes Trennzeichen zu verwenden und nicht wirklich konform mit einer CSV. Ein einfaches ohne Leerzeichen zwischen den Werten würde eher dem gängigen Schema entsprechen


    Allgemein verstehe ich noch nicht ganz wozu du überhaupt ini und csv brauchst. Die ini scheint ja nur temporär zu sein und wird bei jedem Arbeitsbeginn überschrieben, also unnötig?


    Hier mal eine Struktur die ich vorschlagen würde:

    in der csv speicherst du nur folgende Dinge und zwar nicht bei jeder Aktion, sondern erst bei Feierabend.

    Code
    Datum;Arbeitsbeginn;Feierabend;PausenzeitGesamt;AnzahlDerPausen;AnwesenheitGesamt;AnwesenheitAbzüglichPause
    28.09.2012;13:22:43;13:27:43;00:00:30;1;00:05:00;00:04:30

    Im Script selbst arbeitest du am besten mit einem Array, welches folgende Infos enthält und während dem Scriptverlauf aktualisiert wird:

    [autoit]


    global $aDate[7]
    $aData[0]="hier steht das heutige Datum" ; wird bei Programmstart ins Array geschrieben
    $aData[1]="hier steht die Uhrzeit Arbeitsbeginn" ; wird bei Arbeitsbeginn ins Array geschrieben
    $aData[2]="hier steht die Uhrzeit Feierabend" ; wird am Ende bei Feierabend ins array geschrieben
    $aData[3]="hier steht die Gesamtzeit aller Pausen" ; muss bei jedem Pauseende mit der vorherigen Pausenzeit addiert werden (timeadd oder dateadd oder sowas gibts denke ich.... ???)
    $aData[4]="hier steht die Gesamtanzahl der Pausen" ; ubound($aPause)-1 --> bei der 2D Array Variante, siehe unten
    $aData[5]="hier steht die Differenz von Arbeitsbeginn und Ende" ; wird bei Feierabend ins Array geschrieben
    $aData[6]="hier berechnest du die Differenz von der Gesamtzeit minus der Pausenzeit" ; wird auch erst bei feierabend geschrieben

    [/autoit]

    als zweites Array würde ich noch ein Pausenarray einplanen:

    [autoit]


    global $aPause[3]
    $aPause[0]="Start aktuelle Pause" ; wird bei jedem Pausenstart neu gesetzt
    $aPause[1]="Ende aktuelle Pause" ; wird bei jedem Ende der Pause neu gesetzt
    $aPause[2]="Summe der Pausenzeiten" ; wird immer aktualisiert wenn die Pause beendet wird (dateadd/timeadd... ???)
    ;eigtl unnötig, wir haben im data array ja bereits eine Pausengesamtzeit, kannst das Pausenarray also theoretisch auch mit 2 simplen variablen für start und Ende ersetzen... und die summe dann immer im aData array ersetzen...

    [/autoit][autoit][/autoit][autoit]

    ;alternativ und vorallem besser wäre ein 2d array, in dem du jede pause mit den einzelzeiten speicherst und diese dann am ende in aData in addierter Form ausgibst:

    [/autoit][autoit][/autoit][autoit]

    global $aPause[1][3]

    [/autoit][autoit][/autoit][autoit]

    $aPause[0][0]="Start Pause"
    $aPause[0][1]="Ende Pause"
    $aPause[0][2]="Pausenzeit"

    [/autoit][autoit][/autoit][autoit]

    ;neue Pause hinzufügen:

    [/autoit][autoit][/autoit][autoit]

    redim $aPause[ubound($aPause)+1][3] ; macht dein array eine Zeile größer

    [/autoit][autoit][/autoit][autoit]

    $aPause[ubound($aPause)-1][0]="Start Pause 1" ; schreibt jeweils in die neue und letzte Zeile des Arrays...
    $aPause[ubound($aPause)-1][1]="Ende Pause 1" ; schreibt jeweils in die neue und letzte Zeile des Arrays...
    $aPause[ubound($aPause)-1][2]="Pausenzeit 1" ; schreibt jeweils in die neue und letzte Zeile des Arrays...

    [/autoit][autoit][/autoit][autoit]

    ;usw.

    [/autoit][autoit][/autoit][autoit]

    ;am Ende dann die Pausenzeiten in einer Schleife addieren und in $aData vermerken:

    [/autoit][autoit][/autoit][autoit]

    dim $pauseTimeTotal="00:00:00"
    for $i=1 to ubound($aPause)-1
    $pauseTimeTotal = _dateAdd($pauseTimeTotal,$aPause[$i][2]) ; achtung pseudocode, bitte hilfe auf richtigen funktionsnamen und parameter anwendung prüfen...
    next
    $aData[3]=$pauseTimeTotal
    $aData[4]=ubound($aPause)-1

    [/autoit]

    Der Button zum Pause starten sollte im übrigen deaktiviert werden, wenn eine Pause bereits läuft und noch nicht beendet wurde, genauso wie der Button zum Beenden der Pause deaktiviert werden sollte wenn garkeine Pause läuft. Das Selbe gilt für Feierabend und Arbeitsbeginn. Nur so kannst du fehlerhafte Dateneingaben verhindern.

    [autoit]


    guictrlsetstate($control,$GUI_DISABLE)
    guictrlsetstate($control,$GUI_ENABLE)

    [/autoit]


    Vorteil ist:

    Du kannst jetzt bei Programmende z.B. prüfen ob überhaupt der Arbeitstag ordentlich beendet wurd, wenn nicht fehlen noch Arrayeinträge.
    Der Arbeitstag kann nur beendet werden wenn zuvor die Pause beendet wurde.
    Ausserdem würde ich noch eine Funktion schaffen um die Pausenzeit zu korriegieren, wenn "Pause beenden" vergessen oder zu spät gedrückt wurde. In Verbindung mit dem 2D Array könntest du das sekundengenau anhand der Start und Endzeit machen und die Summe neu berechnen lassen. Ist aber erstmal nicht so wichtig. Schön wäre zusätzlich noch ein Counter der permanent die Differenz zwischen aktueller geleisteter Arbeitszeit und der Regelarbeitszeit angibt, so dass man sieht wann man endlich den schönen Feierabend Button drücken darf. Aber auch das wäre nur eine Spielerei.

    Bei Programmende oder Feierabend schreibst du dann deine CSV durch aneinanderreihen der Arrayeinträge:

    [autoit]


    $dataString=""
    for $i=0 to ubound($adata)-1
    $dataString &= $aData[$i] & ";"
    next
    filewrite($csv,stringtrimright($dataString,1) & @crlf) ; stringtrimright entfernt das letzt semikolon, weil zuviel...

    [/autoit]

    Um das ganze perfekt zu machen bastelst du dir dann noch eine Listviewübersicht die dir die geammelten Daten der CSV schön übersichtlich und nach Monat filterbar anzeigt und vielleicht noch statisch auswertet, wie durchschnittliche Pausenzeit / durchschnittliche Pausenanzahl pro Tag / Minus oder Plusstunden zur Regelarbeitszeit usw. Jaja alles sehr aufwendig und jedemenge Arbeit, aber nett wäre es jedenfalls ;)

    2 Mal editiert, zuletzt von misterspeed (28. September 2012 um 14:51)

  • Und nochmal vielen herzlichen Dank für deinen Beitrag. Sehr hilfreich für mich.
    Allerdings hast du wohl einen Satz von mir überlesen: Ich habe AutoIt vor nicht mal einem Monat angefangen zu lernen!
    Dafür hören sich deine Aussagen doch sehr nach "wie dumm bist du eigentlich?" -Aussagen an ;)
    Stört mich aber auch nicht weiter weil du mir dennoch zumindest viele Verbesserungsideen gegeben hast.

    Eine .ini-Datei muss meiner Meinung nach dabei sein, damit man das Programm beliebig oft öffnen und schließen kann. Würde ich dann alles in Arrays speichern wäre doch alles immer wieder flöten gegangen, desshalb eine .ini ^^

    Ich glaube auch beim kopieren ist dir ein Fehler unterlaufen, denn diese Fehlermeldung hatte ich noch nie und ich habe bei mir auch beide Variablen deklariert!

    Zur Pausen Funktion: Ich habe schlichtweg noch keine Zeit gehabt mich mit dem Thema näher zu beschäftigen und es ist auch eher für Azubis in meinem Betrieb gedacht (wird sollten nur eine Pause haben) ;)

    Die " ; " habe ich extra so eingebaut, damit nicht alles aneinander steht und eine Freizeile bleibt. Nur der Übersicht halber.

    Die Ausschaltfunktion werde ich direkt implementieren. LIKE IT :thumbup:

    Den Rest den du die am Ende erwähnt hast, schwebt ales schon als Idee in meinem Köppchen. Da "learning by doing" aber auf der Arbeit immer nur geht wenn ich grade nichts anderes zu tun habe, wird das noch einige Zeit und Suchen dauern bis ich alles so ab wie ich das will. Eben desshalb habe ich auch extra einen Update-Server eingerichtet, damit man auch immer auf dem neuesten Stand meines Ideenreichtums ist :P

    So und jetzt fertig aus Thema schließen :D

  • Nein warum sollte ich dich für dumm halten. Sieh es einfach als wertvolle Wissenserweiterung durch jemanden der wesentlich länger Erfahrung mit Autoit hat und ähnliche Programme schon viele male geschrieben hat.
    Um Arrays und Schleifen wirst du auf Dauer jedenfalls nicht rumkommen, wenn du ernsthaft programmieren willst, weder in Autoit noch in anderen Sprachen. Das sind 2 wesentliche Grundfunktionen einer jeden Programmiersprache und sollten frühst möglich verstanden werden. Dazu findest du hier im übrigen auch anwenderfreundliche Tutorials (glaube von Bugfix).

    Wie dem auch sei, viel Erfolg beim Autoit erlernen. ;)


    PS: Ich hatte meinen Beitrag noch einige male editiert nachdem du gepostet hast, vielleicht nochmal anschaun oder einfach fragen wenn manche Dinge so für dich unklar sind. Schliessen brauchst du den Thread nicht, editiere einfach deinen ersten Beitrag und setze das Threadpräfix von "offen" auf "gelöst".

  • Um Arrays und Schleifen wirst du auf Dauer jedenfalls nicht rumkommen, wenn du ernsthaft programmieren willst, weder in Autoit noch in anderen Sprachen.

    Ist ja auch nicht mein einziges Programm und AutoIt auch nicht die einzige Sprache die ich Im Moment lerne ;)
    Nur um dich zu beruhigen: PHP-HTML-MySQL Grundkenntnisse sind ebenfalls vorhanden und da ohne Schleifen und Arrays vernünftig zu arbeiten ist ja fast unmöglich :D

    Ich bin dir wie gesagt auch dankbar für deinen ausführlichen Beitrag hier ^^
    Magst mit deine Mail-Adresse geben für weitere Hilfen oder vielleicht auch Koorperationen? ;)

    Lösung wird in den ersten Beitrag implementiert!

  • Freut mich, dass du auch noch andere Sprachen lernst und zumindestens die Grundlagen der Programmierung geläufig sind. Dann sollte Autoit ja keine besondere Herausforderung sein, sehr ähnliche Syntax wie PHP. Allerdings gebe ich zu, dass ich selbst nie wirklich PHP gelernt habe und nur ein wenig JAVA und C behersche. Autoit ist meiner Meinung nach die einzige Sprache in der ich sehr gute Kenntnisse habe. Nach mehreren Jahren Autoit fällt es einem aber auch wesentlich leichter sich auf andere Sprachen einzulassen und man weiß in etwa nach was man suchen muss wenn man bestimmte Dinge in der fremden Sprache umsetzen will.

    Kleiner Nachtrag noch zum aktuellen Script, weils mir eben aufgefallen ist...

    Dir fehlen Includes für die GUI wenn du meinen Vorschlag mit der Button (de)aktivierung umsetzen willst. In der Hilfe zu guictrlsetstate() sollten diese im Beispiel vorhanden sein. Wenn ich mich recht entsinne brauchst du für die Konstante $GUI_DISABLE usw. das #include <GUIConstantsEx.au3>.

    Bezüglich meiner Abneigung gegen Privatsupport habe ich dir ja bereits in deiner PN geantwortet.

    3 Mal editiert, zuletzt von misterspeed (28. September 2012 um 16:43)

  • Ist mir sofort mein implementieren der Funktionen aufgefallen, dass da ein Include fehlt ;)
    Trotzdem danke für die Erwähnung.
    Deine PN werde ich mir Morgen dann mal in Ruhe durchlesen.
    Und für alle die es Interessiert: Sobald meine Homepage wieder aufgebaut ist, gibts es HIER immer Neuigkeiten über mein(e) Programm(e).