Arbeitzeit Erfassung

  • :D Hi,

    kleines Programm, um die Arbeitszeit nachzuweisen. Berechnet Überstunden, Pausezeiten, Urlaubstage usw.. speichert die Zeiten in sqllite. Auch wenns niemand brauchen kann poste ich es trotzdem mal.

    UPDATE: (09.01.09)
    - jetzt können auch Urlaubstage eingetragen werden.
    - die sortierfunktion funktioniert jetzt auch. (danke an Oscar und bugfix)

    UPDATE: (08.01.09)
    Da die alte Version mit der aktuellen 3.3.0.0 nicht mehr funktioniert, habe ich das Programm umgeschrieben.

    - Jetzt werden die Daten nicht mehr in TXT Dateien gespeichert, sondern in einer Sqlite Datenbank
    - Es wird pro angemeldeter Benutzer die Daten abgelegt, d.h. in der Datenbank können So viele Benutzer Ihre Daten speichern, aber sehen nur Ihre eigenen.
    - Die monatlich Aufteilung wurde entfernt. Jetzt sieht man einfach alle eigenen Einträge.
    - Die bereits vorhandenen Überstunden können in der Datei ini.ini :D eingetragen werde(pro benutzer) und erscheint dann in der Statistik. z.B.

    Spoiler anzeigen


    (ini.ini - Datei)
    ---
    [over]
    benutzer1=20

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    4 Mal editiert, zuletzt von franzp (9. Januar 2009 um 14:45)

  • Nach einigem wilden drücken von Tasten, Tabs etz. stürzt das Skript ab und es kommt die Fehlermeldung:

    Code
    C:\Dokumente und Einstellungen\manticore\Desktop\zeit.au3 (433) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $pause_summe = $pause_summe + $array2[3]
    $pause_summe = $pause_summe + ^ ERROR
  • :D ja mag sein. Habe es mit wilden drücken nicht getestet.
    Es werden die Eingaben nicht auf Richtigkeit geprüft, also wird das passieren, wenn Eingaben nicht das gewünschte Format haben. :whistling:

    Vielleicht wird das in Version 1.1 korrigiert.

    vielen Dank.
    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Hi TOMTOM25m, ja klar darfst Du adaptieren!

    Ja ich wollte das auch erst mit mysql und dann mit sqlite machen, aber es sind pro Montag nur 20-25 Einträge und da ist es am einfachsten das in eine Datei zu schreiben. Und deswegen erzeugt er Pro Monat jeweils eine eigene Datei.

    viel Spaß. Ich bin auf Dein Ergebniss gespannt!

    schöne WE.

    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Hi,

    komisch diese Fehlermeldung! Wieso kennt er die Funktion _Stringsplit nicht ? Seltsam.. Bei mir funktioniert Tab gesamt, allerdings habe ich gerade gesehen, dass der Tab Gesamt nicht korrekt rechnet.. :whistling: Da muss ich nochmal was ändern.

    Und was meinst Du mit Nutzer erkennen? Es ist doch keine Nutzerabhängigkeit vorhanden..

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Ich meine,

    Oscars Destopsperre erkennt den USB-Stick des Nutzers anhand der USB-Stick-ID. Diesen Umstand könntest Du dir zu nutze machen.
    Also man steckt den Stick ein und Dein Programm erkennt den Stick von "Max Muster" dessen Zeiterfassung nun weiter geht.

    Tipp2: Kindersicherung - Wie lange darf "Mäxchen" den PC nutzen. :rolleyes:

    Ich versuche nur weitere Anwendungsmöglichkeiten vorzustellen. ;)

  • Hi Franz,

    könntest du mir mal bei deinem script weiter helfen?
    Ich hab folgendes problem mit der Arbeitszeit:
    Tägliche Arbeitszeit 8,64
    Wöchentliche Arbeitszeit 43,2
    Dies funktioniert bei mir nicht.

    Gruss
    MadMax

  • einfach die Inputgrenze erhöht, dann geht´s...


    Spoiler anzeigen
    [autoit]

    #include <Date.au3>
    #include <File.au3>
    #include <GuiListView.au3>
    #include <String.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    $version = "1.0"

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

    #Region ### START Koda GUI section ### Form=U:\autoit\autoit\zeit\zeit.kxf
    $Form2 = GUICreate("Arbeitszeit Erfassung by fpr " & $version, 697, 468, 210, 122)
    GUISetIcon("D:\005.ico")
    $PageControl1 = GUICtrlCreateTab(8, 8, 676, 424)
    GUICtrlSetResizing(-1, $GUI_DOCKWIDTH+$GUI_DOCKHEIGHT)
    $eintrag = GUICtrlCreateTabItem("Eintrag")
    $btn_save = GUICtrlCreateButton("abspeichern", 56, 216, 107, 25, 0)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $dd_datum = GUICtrlCreateDate("2008/09/27 11:43:30", 176, 56, 90, 24, $WS_TABSTOP)
    $lst_view = GUICtrlCreateListView("Datum|Tag|Start|Pause|Ende|Kommentar|Zeit", 32, 280, 634, 46)
    GUICtrlSendMsg(-1, 0x101E, 0, 150)
    GUICtrlSendMsg(-1, 0x101E, 1, 80)
    GUICtrlSendMsg(-1, 0x101E, 2, 70)
    GUICtrlSendMsg(-1, 0x101E, 3, 60)
    GUICtrlSendMsg(-1, 0x101E, 4, 70)
    GUICtrlSendMsg(-1, 0x101E, 5, 120)
    GUICtrlSendMsg(-1, 0x101E, 6, 50)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $lst_view_0 = GUICtrlCreateListViewItem("||||||", $lst_view)
    $cb_start = GUICtrlCreateInput("", 176, 83, 89, 24, $ES_CENTER)
    GUICtrlSetLimit(-1, 5)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cb_pause = GUICtrlCreateInput("", 176, 109, 89, 24, $ES_CENTER)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cb_end = GUICtrlCreateInput("", 176, 136, 89, 24, $ES_CENTER)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cb_comment = GUICtrlCreateInput("", 176, 163, 481, 24)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label1 = GUICtrlCreateLabel("Datum", 56, 61, 42, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label2 = GUICtrlCreateLabel("Startzeit", 56, 88, 53, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label3 = GUICtrlCreateLabel("Pause in Minuten", 56, 115, 105, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label4 = GUICtrlCreateLabel("Feierabend", 56, 141, 68, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label5 = GUICtrlCreateLabel("Kommentar", 56, 168, 71, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $lbl_ergebnis = GUICtrlCreateLabel("lbl_ergebnis", 32, 368, 146, 33)
    GUICtrlSetFont(-1, 18, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0xFF0000)
    $Label13 = GUICtrlCreateLabel("Arbeitszeit heute: ", 32, 336, 110, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $lbl_zeit_heute = GUICtrlCreateLabel("lbl_zeit_heute", 160, 336, 84, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $btn_today = GUICtrlCreateButton("heute", 280, 56, 75, 25, 0)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Monatsstati = GUICtrlCreateTabItem("Monats Statistik")
    $Label6 = GUICtrlCreateLabel("Gesamt Stunden", 40, 328, 102, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_totalhours = GUICtrlCreateInput("", 184, 328, 65, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label7 = GUICtrlCreateLabel("Gesamt Überstunden", 40, 280, 127, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_overtime = GUICtrlCreateInput("", 184, 280, 65, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_pause = GUICtrlCreateInput("", 184, 232, 65, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label8 = GUICtrlCreateLabel("Gesamt Pause in h", 40, 232, 116, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $btn_anzeigen = GUICtrlCreateButton("Anzeigen", 424, 376, 115, 25, 0)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label9 = GUICtrlCreateLabel("Soll Arbeitszeit in Stunden / Tag", 64, 160, 191, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_sollstunden = GUICtrlCreateInput("8.64", 272, 160, 49, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
    GUICtrlSetLimit(-1, 4)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_wochenzeit = GUICtrlCreateInput("", 456, 160, 57, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label10 = GUICtrlCreateLabel("Stunden / Woche", 344, 160, 105, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_totalsoll = GUICtrlCreateInput("", 456, 328, 57, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label11 = GUICtrlCreateLabel("Gesamt Soll", 320, 328, 76, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_pauseschnitt = GUICtrlCreateInput("", 456, 232, 57, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label12 = GUICtrlCreateLabel("Pause Schnitt / Tag", 304, 232, 119, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_wochentage = GUICtrlCreateInput("5", 272, 128, 49, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL))
    GUICtrlSetLimit(-1, 1)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label14 = GUICtrlCreateLabel("Tage / Woche", 64, 128, 85, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cmb_month2 = GUICtrlCreateCombo("", 304, 48, 113, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cmb_year2 = GUICtrlCreateCombo("", 440, 48, 105, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label16 = GUICtrlCreateLabel("Monat wählen", 200, 48, 84, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $anzeigetab = GUICtrlCreateTabItem("Anzeige")
    $lst_overview = GUICtrlCreateListView("Datum|Tag|Start|Pause|Ende|Kommentar|Zeit", 32, 88, 625, 297, $LVS_REPORT, BitOR($WS_EX_CLIENTEDGE,$LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg(-1, 0x101E, 0, 80)
    GUICtrlSendMsg(-1, 0x101E, 1, 80)
    GUICtrlSendMsg(-1, 0x101E, 2, 70)
    GUICtrlSendMsg(-1, 0x101E, 3, 50)
    GUICtrlSendMsg(-1, 0x101E, 4, 70)
    GUICtrlSendMsg(-1, 0x101E, 5, 150)
    GUICtrlSendMsg(-1, 0x101E, 6, 60)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $btn_load = GUICtrlCreateButton("laden", 472, 48, 75, 25, 0)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $btn_del = GUICtrlCreateButton("eintrag löschen", 32, 392, 115, 25, 0)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cmb_month = GUICtrlCreateCombo("", 208, 48, 89, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label15 = GUICtrlCreateLabel("Monat wählen:", 48, 48, 88, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $cmb_year = GUICtrlCreateCombo("", 336, 48, 113, 25)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label17 = GUICtrlCreateLabel("Stunden Summe", 312, 392, 101, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_sum = GUICtrlCreateInput("", 416, 392, 49, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $inp_over = GUICtrlCreateInput("", 600, 392, 57, 24, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Label18 = GUICtrlCreateLabel("Überstunden", 512, 392, 77, 20)
    GUICtrlSetFont(-1, 10, 400, 0, "Arial")
    $Gesamt = GUICtrlCreateTabItem("Gesamt")
    $inp_hours_overall = GUICtrlCreateInput("", 368, 168, 121, 21, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    $Label19 = GUICtrlCreateLabel("Gesamt Stunden", 200, 176, 83, 17)
    $Label20 = GUICtrlCreateLabel("Gesamt Überstunden", 200, 216, 104, 17)
    $inp_overtime_overall = GUICtrlCreateInput("", 368, 208, 121, 21, BitOR($ES_CENTER,$ES_AUTOHSCROLL,$ES_READONLY))
    $btn_berec = GUICtrlCreateButton("berechnen", 408, 272, 75, 25, 0)
    GUICtrlCreateTabItem("")
    $btn_cancel = GUICtrlCreateButton("Beenden", 606, 440, 75, 25, 0)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    $file_mon = ""
    $mon = ""
    $count = ""
    $pause_summe = ""
    $overtime = ""
    $file = ""
    $total_hours = ""

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

    GUICtrlSetData($lbl_ergebnis, "")
    GUICtrlSetData($dd_datum, _NowCalc())
    GUICtrlSetData($cb_start, "09:00")
    GUICtrlSetData($cb_pause, "60")
    GUICtrlSetData($cb_end, "18:00")
    GUICtrlSetData($lbl_zeit_heute, "")
    GUICtrlSetData($cmb_year, "2007|2008|2009|2010|2011", @YEAR)
    GUICtrlSetData($cmb_year2, "2007|2008|2009|2010|2011", @YEAR)

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

    _identfile()
    $tabid = GUICtrlRead($PageControl1)

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

    ;GUICtrlCreateUpdown($cb_start)
    ;GUICtrlCreateUpdown($cb_pause)
    ;GUICtrlCreateUpdown($cb_end)

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

    While 1
    $nMsg = GUIGetMsg()
    $changed = GUICtrlRead($PageControl1)
    If $tabid <> $changed Then
    Select
    Case $changed = 1
    ControlClick("Arbeitszeit Erfassung by fpr " & $version, "", 29)
    Case $changed = 2
    ControlClick("Arbeitszeit Erfassung by fpr " & $version, "", 45)
    Case $changed = 3
    ControlClick("Arbeitszeit Erfassung by fpr " & $version, "", 59)
    EndSelect
    $tabid = $changed
    EndIf

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

    Switch $nMsg

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

    Case $GUI_EVENT_CLOSE
    Exit

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

    Case $btn_anzeigen

    $file = _file(GUICtrlRead($cmb_month2), GUICtrlRead($cmb_year2))
    _hours_summe($file)

    GUICtrlSetData($inp_wochenzeit, GUICtrlRead($inp_sollstunden) * GUICtrlRead($inp_wochentage))
    GUICtrlSetData($inp_totalsoll, GUICtrlRead($inp_sollstunden) * $count)
    If $pause_summe = 0 Then
    GUICtrlSetData($inp_pauseschnitt, "0")
    Else
    GUICtrlSetData($inp_pauseschnitt, Round($pause_summe / 60 / $count, 2))
    EndIf
    GUICtrlSetData($inp_totalhours, Round($total_hours / 60, 2))
    GUICtrlSetData($inp_overtime, Round($overtime / 60, 2))
    GUICtrlSetData($inp_pause, Round($pause_summe / 60, 2))

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

    Case $btn_save

    $save = "0"
    $start = GUICtrlRead($cb_start) & ":00"
    $pause = GUICtrlRead($cb_pause)
    $end = GUICtrlRead($cb_end) & ":00"
    $datum = GUICtrlRead($dd_datum)
    $comment = GUICtrlRead($cb_comment)
    $currentfile = @ScriptDir & "\data" & "_" & StringMid($datum, 4, 2) & "_" & StringRight($datum, 4) & ".txt"
    $zeit = Round((_DateDiff('n', "2008/01/01 " & $start, "2008/01/01 " & $end) / 60) - ($pause / 60), 2)
    GUICtrlSetData($lst_view_0, $datum & "|" & _DateDayOfWeek(_DateToDayOfWeek(StringRight($datum, 4), StringMid($datum, 4, 2), StringLeft($datum, 2)), 1) & "|" & $start & "|" & $pause & "|" & $end & "|" & $comment & "|" & $zeit)
    $weekday = _DateDayOfWeek(_DateToDayOfWeek(StringRight($datum, 4), StringMid($datum, 4, 2), StringLeft($datum, 2)), 1)
    $data = $datum & "|" & $weekday & "|" & $start & "|" & $pause & "|" & $end & "|" & $comment & "|" & $zeit

    If $weekday = "Sat" Or $weekday = "Sun" Then
    Select
    Case $weekday = "Sat"
    $weekday = "Samstag"
    Case $weekday = "Sun"
    $weekday = "Sonntag"
    EndSelect
    TrayTip("Ohje!", "Tut mir Leid, dass Du am " & $weekday & " tatsächlich arbeiten musst? Mein Beileid!", 2)
    EndIf

    $count = _FileCountLines($currentfile)
    For $i = 0 To $count
    $line = FileReadLine($currentfile, $i)
    $test = _StringSplit($line, "|")
    If $test[0] = $datum Then
    MsgBox(48, "Information", "Ein vorhandenen Eintrag wurde überschrieben.")
    $save = "1"
    $over = $i
    EndIf
    Next
    If $save = "1" Then
    _FileWriteToLine($currentfile, $over, $data, 1)
    Else
    FileWriteLine($currentfile, $data)
    EndIf
    GUICtrlSetData($lbl_zeit_heute, $zeit)
    GUICtrlSetData($lbl_ergebnis, "gespeichert!")
    _identfile()

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

    Case $btn_cancel
    Exit

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

    Case $btn_today
    GUICtrlSetData($dd_datum, _NowCalc())


    Case $btn_load

    $file = _file(GUICtrlRead($cmb_month), GUICtrlRead($cmb_year))
    $i2 = 0
    $count = _FileCountLines($file)

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

    $lvhandle = GUICtrlGetHandle($lst_overview)
    _GUICtrlListView_DeleteAllItems($lvhandle)

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

    For $i = 1 To $count
    $line = FileReadLine($file, $i)
    $line = StringSplit($line, "|")
    _GUICtrlListView_AddItem($lst_overview, $line[1], $i) ; datum
    _GUICtrlListView_AddSubItem($lst_overview, $i2, $line[2], 1) ; Wochentag
    _GUICtrlListView_AddSubItem($lst_overview, $i2, $line[3], 2) ; start
    _GUICtrlListView_AddSubItem($lst_overview, $i2, $line[4], 3) ; pause
    _GUICtrlListView_AddSubItem($lst_overview, $i2, $line[5], 4) ; ende
    _GUICtrlListView_AddSubItem($lst_overview, $i2, $line[6], 5) ; kommentar
    _GUICtrlListView_AddSubItem($lst_overview, $i2, $line[7], 6) ; zeit
    $i2 += 1
    Next

    Dim $B_DESCENDING[_GUICtrlListView_GetColumnCount($lvhandle)] ; Variable ist erforderlich für die Sortierrichtung
    _GUICtrlListView_SimpleSort($lvhandle, $B_DESCENDING, 0)

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

    _hours_summe($file)

    GUICtrlSetData($inp_sum, Round($total_hours / 60, 2))
    GUICtrlSetData($inp_over, Round($overtime / 60, 2))


    Case $btn_del

    $lvhandle = GUICtrlGetHandle($lst_overview)
    $count = _GUICtrlListView_GetItemCount($lvhandle)
    $number = ""
    $tf = False
    For $i = 0 To $count
    $tf = _GUICtrlListView_GetItemSelected($lvhandle, $i)
    ConsoleWrite($tf & " " & $i & @CRLF)
    If $tf = True Then $number = $i
    Next

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

    ;$item = _GUICtrlListView_GetItemText($lvhandle, $number)
    If $number <> "" Or $number = "0" Then
    FileDelete($file)
    _GUICtrlListView_DeleteItemsSelected($lvhandle)
    $count = _GUICtrlListView_GetItemCount($lvhandle)
    For $i = 0 To $count - 1
    $new = _GUICtrlListView_GetItemTextString($lvhandle, $i)
    ;ConsoleWrite($new)
    FileWriteLine($file, $new)
    Next
    EndIf

    Case $btn_berec

    _all()
    GUICtrlSetData($inp_hours_overall, Round($total_hours / 60, 2))
    GUICtrlSetData($inp_overtime_overall, Round($overtime / 60, 2))


    EndSwitch
    WEnd

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

    Func _file($mon, $fyear)
    Select
    Case $mon = ""
    $mon = @MON
    Case $mon = "Januar"
    $mon = "01"
    Case $mon = "Februar"
    $mon = "02"
    Case $mon = "März"
    $mon = "03"
    Case $mon = "April"
    $mon = "04"
    Case $mon = "Mai"
    $mon = "05"
    Case $mon = "Juni"
    $mon = "06"
    Case $mon = "Juli"
    $mon = "07"
    Case $mon = "August"
    $mon = "08"
    Case $mon = "September"
    $mon = "09"
    Case $mon = "Oktober"
    $mon = "10"
    Case $mon = "November"
    $mon = "11"
    Case $mon = "Dezember"
    $mon = "12"
    EndSelect
    $file = @ScriptDir & "\data" & "_" & $mon & "_" & $fyear & ".txt"
    Return $file
    Return $mon

    EndFunc ;==>_file

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

    Func _identfile()

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

    $mon = @MON
    $file_mon = ""
    GUICtrlSetData($cmb_month, "")
    GUICtrlSetData($cmb_month2, "")
    $search = FileFindFirstFile(@ScriptDir & "\*.txt")
    Dim $trans[14]
    $trans[0] = 13
    $trans[1] = 'Januar'
    $trans[2] = 'Februar'
    $trans[3] = 'März'
    $trans[4] = 'April'
    $trans[5] = 'Mai'
    $trans[6] = 'Juni'
    $trans[7] = 'Juli'
    $trans[8] = 'August'
    $trans[9] = 'September'
    $trans[10] = 'Oktober'
    $trans[11] = 'November'
    $trans[12] = 'Dezember'
    $trans[13] = 'Fehler im File Format'

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

    While 1
    $ffn = FileFindNextFile($search)
    If @error Then ExitLoop
    $cmb_line = StringReplace(StringMid($ffn, 5, 3), "_", "")
    If $cmb_line > '12' Or $cmb_line < '0' Then $cmb_line = 13
    $file_mon = $trans[$cmb_line] & "|" & $file_mon
    WEnd
    FileClose($search)

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

    GUICtrlSetData($cmb_month2, $file_mon, $trans[@MON])
    GUICtrlSetData($cmb_month, $file_mon, $trans[@MON])

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

    EndFunc ;==>_identfile

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

    Func _hours_summe($filename)
    $pause_summe = 0
    $total_hours = 0
    $min_daily = 0
    $count = _FileCountLines($filename)
    For $i = 1 To $count
    $line = FileReadLine($file, $i)
    $array = _StringSplit($line, "|")

    $pause_summe = $pause_summe + $array[3]

    $min_daily = _DateDiff('n', "2008/01/01 " & $array[2], "2008/01/01 " & $array[4])
    $total_hours = $total_hours + $min_daily

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

    Next
    $total_hours = $total_hours - $pause_summe

    $sollstunden = GUICtrlRead($inp_sollstunden)
    $overtime = $total_hours - $count * $sollstunden * 60
    Return $total_hours
    Return $overtime
    Return $sollstunden
    Return $pause_summe
    Return $count
    EndFunc ;==>_hours_summe

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

    Func _all()
    $array = _GetFilesFolder_Rekursiv(@ScriptDir, ".txt")
    $total_hours = ""
    $pause_summe = ""
    $zaehler = ""
    For $i = 1 To UBound($array) - 1
    $count = _FileCountLines($array[$i])
    $zaehler = $zaehler + $count
    For $i2 = 1 To $count
    $line = FileReadLine($array[$i])
    $array2 = _StringSplit($line, "|")
    $pause_summe = $pause_summe + $array2[3]
    $min_daily = _DateDiff('n', "2008/01/01 " & $array2[2], "2008/01/01 " & $array2[4])
    $total_hours = $total_hours + $min_daily
    Next
    Next
    $total_hours = $total_hours - $pause_summe

    $sollstunden = GUICtrlRead($inp_sollstunden)
    $overtime = $total_hours - $zaehler * $sollstunden * 60

    Return $total_hours
    Return $overtime
    EndFunc ;==>_all

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

    ;==================================================================================================
    ; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
    ; Description: Rekursive Auflistung von Dateien und/oder Ordnern
    ; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
    ; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
    ; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
    ; optional: $iRetType 0 gibt Array, 1 gibt String zurück
    ; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
    ; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
    ; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
    ; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ;==================================================================================================
    Func _GetFilesFolder_Rekursiv($sPath, $sExt = '*', $iDir = -1, $iRetType = 0, $sDelim = '0')
    Global $oFSO = ObjCreate('Scripting.FileSystemObject')
    Global $strFiles = ''
    Switch $sDelim
    Case '1'
    $sDelim = @CR
    Case '2'
    $sDelim = @LF
    Case '3'
    $sDelim = ';'
    Case '4'
    $sDelim = '|'
    Case Else
    $sDelim = @CRLF
    EndSwitch
    If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
    If $sExt = -1 Then $sExt = '*'
    If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
    _ShowSubFolders($oFSO.GetFolder($sPath), $sExt, $iDir, $sDelim)
    If $iRetType = 0 Then
    Local $aOut
    $aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
    If $aOut[1] = '' Then
    ReDim $aOut[1]
    $aOut[0] = 0
    EndIf
    Return $aOut
    Else
    Return StringTrimRight($strFiles, StringLen($sDelim))
    EndIf
    EndFunc ;==>_GetFilesFolder_Rekursiv

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

    Func _ShowSubFolders($Folder, $Ext = '*', $Dir = -1, $Delim = @CRLF)
    If Not IsDeclared("strFiles") Then Global $strFiles = ''
    If ($Dir = -1) Or ($Dir = 0) Then
    For $file In $Folder.Files
    If $Ext <> '*' Then
    If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
    $strFiles &= $file.Path & $Delim
    Else
    $strFiles &= $file.Path & $Delim
    EndIf
    Next
    EndIf
    For $Subfolder In $Folder.SubFolders
    If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
    _ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
    Next
    EndFunc ;==>_ShowSubFolders

    [/autoit]

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Update vom 08.01.09...

    -Umstellung SQLlite und benutzerabhängige abspeicherung.
    genaueres siehe Post 1

    Probleme mit Sortierung des Listviews. Vielleicht kann mir da jemand auf den Hinterkopf hauen? Ich weiß nicht warums nicht geht. ;(

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Probleme mit Sortierung des Listviews. Vielleicht kann mir da jemand auf den Hinterkopf hauen? Ich weiß nicht warums nicht geht. ;(


    Wo ist denn genau das Problem?
    Es gibt die Funktionen _GUICtrlListView_SortItems und _GUICtrlListView_SimpleSort die ein schon aufgebautes ListView sortieren.

  • Hi,

    das Problem ist, dass er nicht sortiert ;) Spaß beiseite...

    ich habe gedacht es geht so :
    erst das Listview so vorbereiten

    Zeile 151/152

    [autoit]

    $hLVHandle = GUICtrlGetHandle($lst_overview)
    _GUICtrlListView_RegisterSortCallBack($hLVHandle)

    [/autoit]

    und dann in der endlosschleife: Zeile 175/176

    [autoit]


    Case $lst_overview
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($lst_overview))

    [/autoit]

    Dann sollter er die einzelnen Spalten des Listviews sortieren. Die Pfeile erscheinen auch, aber sortiert wird nichts.. :?:

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

    • Offizieller Beitrag

    Sortierung mache ich i.A. per Spaltenklick:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>

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

    $gui = GUICreate('Test LV-Sort')
    $hListView = GUICtrlCreateListView('Spalte 1|Spalte 2', 10, 10, 300, 200)
    For $i = 1 To 15
    GUICtrlCreateListViewItem(Chr(Random(65,90)) & '|' & Chr(Random(65,90)), $hListView)
    Next
    GUISetState()

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

    Global $B_DESCENDING[_GUICtrlListView_GetColumnCount($hListView)]

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

    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam
    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
    $hWndListView = $hListView
    If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)

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

    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
    Case $hWndListView
    Switch $iCode
    Case $LVN_COLUMNCLICK ; A column was clicked
    $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
    _GUICtrlListView_SimpleSort($hWndListView, $B_DESCENDING, DllStructGetData($tInfo, "SubItem"))
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY

    [/autoit]
    • Offizieller Beitrag

    Die Sortierung auf diese Art funktioniert nur, wenn die Items mit GUICtrlCreateListViewItem erstellt wurden:

    BugFix's Beispiel:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstantsEx.au3>
    #include <GuiListView.au3>

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

    $gui = GUICreate('Test LV-Sort')
    $hListView = GUICtrlCreateListView('Spalte 1|Spalte 2', 10, 10, 300, 200)
    For $i = 1 To 15
    ;~ $index = _GUICtrlListView_AddItem($hListView, Chr(Random(65,90)))
    ;~ _GUICtrlListView_AddSubItem($hListView, $index, Chr(Random(65,90)), 1)
    GUICtrlCreateListViewItem(Chr(Random(65,90)) & '|' & Chr(Random(65,90)), $hListView)
    Next
    GUISetState()

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

    $hLVHandle = GUICtrlGetHandle($hListView)
    _GUICtrlListView_RegisterSortCallBack($hLVHandle) ; damit man das Listview (mit Klick auf die Spaltenüberschrift) sortieren kann

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

    While 1
    Switch GUIGetMsg()
    Case $hListView
    _GUICtrlListView_SortItems($hLVHandle, GUICtrlGetState($hListView)) ; Einträge entsprechend sortieren
    Case $GUI_EVENT_CLOSE
    _GUICtrlListView_UnRegisterSortCallBack($hLVHandle) ; Sortierroutine wieder de-registrieren
    Exit
    EndSwitch
    WEnd

    [/autoit]

    Wenn Du die auskommentierten Zeilen aktivierst und die andere auskommentierst siehst Du den Unterschied.

  • Hi Oscar, Hi Bugfix,

    Super danke, jetzt habe ich es umgeschrieben und es sortiert sofort 8o
    Das muss man einfach Wissen, sonst sucht man sich dämlich.

    vielen Dank nochmal !

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Hallo, finde das Prog. gut, aber wenn du als Endzeit 24:00 eingibst rechnet es nicht richtig.

    Interessant wäre auch die Stunden nach 18 Uhr, 20 Uhr ... anders zu bewerten. Glaube ab 18 Uhr ist 1 Stunde 1,5 wert und am Wochenende ist 1:2. Müsste mal den Steuerberater fragen. Auch wäre es vielleicht für kleine Betrieb (2-3 Mitarbeiter) sinnvoll zB Mehrfachzeiten zuzulassen. Beispiel: Arztasistentin beginnt um 8:00 und arbeitet bis 12:00. Kommt am Nachmittag um 16:00 und geht um 17:30. Tja und weil ich gerade dabei bin, der Arzt kann mitten im Betrieb nicht den Benutzer ändern. Es gibt nur den User ORDI. Also Login User wäre da die Lösung.


    Sonst super gmacht, gefällt mir gut :rock:

    LG Peter

  • Hallo,

    danke fürs ausprobieren... Also ich muss gestehen ich habe nie ausprobiert die endzeit auf 24:00 Uhr gestellt. Ohje du armer musst aber ganz schön lang arbeiten :thumbdown: soll ich mal mit Deinem Chef reden ? :D

    Aber werds mir bei gelegenheit mal anschauen. Ja das mit der Wertung der Stunden ist denkbar. Nur ist das vermutlich bei jedem etwas Unterschiedlich. Das müsste wenn dann konfigurierbar sein.

    Ja und einen Benutzerlogin habe ich bewusst nicht gewählt, weil mich dieses ständige User und PWD gefrage nervt. Finde es eleganter über den Windows Login.

    Also dann danke für den Kommentar. Werd mal schaun was man davon umsetzen kann.

    Lg, Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---

  • Glaube ab 18 Uhr ist 1 Stunde 1,5 wert und am Wochenende ist 1:2.


    Oh, das ist wohl von Tarif zu Tarif sehr unterschiedlich, von den Opfern der Christlichen Gewerkschaften ganz zu schweigen. X(

    Gruß Ashpool

    Zitat von mir

    Bin immer wieder erstaunt, wie begrenzt ein Horizont sein kann.