Berechnung Arbeitszeit?

  • VB.NET

Es gibt 51 Antworten in diesem Thema. Der letzte Beitrag () ist von MR_NMS.

    MSDN schrieb:

    TimeSpan can be coerced to and from String and itself only.
    Von daher: wohl eher nicht. Ggf. alternativ im Code-Behind, also in der tDS.VB-Datei als Erweiterung des bestehenden tDS-Codes.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    in Stechuhr verwende ich Doubles als Zeitwerte.
    Dazu habich ein TimeDoubleBehavior Behavior erfunden, sodass Textboxen/DGV-Spalten gebundene Doubles als Zeitwerte im Format "hh:mm" präsentieren.
    Dank dieses Kunstgriffes kann ich Arbeitszeiten in berechneten Spalten Aufsummieren, Überstunden berechnen etc.
    Um neben "hh:mm" noch weitere Formate zu unterstützen müsste man das genannte Behavior erweitern.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Nochmal kurz zu tDS und CodeBehind.
    Arbeitszeiterfassung ist ja normalerweise nicht nur Dauer, sondern (auch) Anfang und Ende, z.B. wenn man einen Dienstplan erstellt o.ä. Diese Zeitpunkte müssen also erfasst werden. Ob man die Arbeitsdauer mit erfasst, bleibt da optional. Angenommen Du hättest also eine Tabelle mit 2 DateTime-Spalten und einer TimeSpan-Spalte:

    Dann machst Du einen Doppelklick auf den Tabellenkopf und VS erstellt eine Partial-Class-Datei für die Tabelle. Da kannst Du dann reinschreiben:

    VB.NET-Quellcode

    1. Partial Public Class TeamMemberShiftsDataTable
    2. Private Sub TeamMemberShiftsDataTable_TeamMemberShiftsRowChanged(sender As Object, e As TeamMemberShiftsRowChangeEvent) Handles Me.TeamMemberShiftsRowChanged
    3. RemoveHandler Me.TeamMemberShiftsRowChanged, AddressOf TeamMemberShiftsDataTable_TeamMemberShiftsRowChanged
    4. e.Row.DurationOfWork = e.Row.EndTime - e.Row.StartTime
    5. AddHandler Me.TeamMemberShiftsRowChanged, AddressOf TeamMemberShiftsDataTable_TeamMemberShiftsRowChanged
    6. End Sub
    7. End Class

    Und so wird automatisch die TimeSpan-Spalte befüllt, wenn sich sonstwas an der entsprechenden Datenzeile ändert. Der RemoveHandler-/AddHandler-Kram ist notwendig, sonst gibt's Mecker mit dem Compiler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Dass der Code scheinbar nicht funktioniert, ist eingabeabhängig. Wenn man ne DataTable-Zeile mit korrekten DateTime-Werten anlegt, kommt auch was Sinnvolles raus:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Tds1.TeamMemberShifts.AddTeamMemberShiftsRow(Date.Today.AddHours(8), Date.Now, Nothing)
    3. End Sub


    Man muss also sicherstellen, dass die DGV-Eingaben auch zu passenden Date-Werten umgewandelt werden. Wenn man also 08:00 eingibt und 08:00 des heutigen Tages da rausbekommen will, muss man schreiben (Umwandlung der Eingabe erfolgt in Zeile#5):

    VB.NET-Quellcode

    1. Private Sub TeamMembersDataGridView_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles TeamMembersDataGridView.CellEndEdit
    2. If e.ColumnIndex < 1 OrElse e.ColumnIndex > 2 Then Exit Sub
    3. Dim CurrentRow = DirectCast(DirectCast(TeamMembersBindingSource.Current, DataRowView).Row, Tds.TeamMemberShiftsRow)
    4. Dim CellTextAsDate = Date.Parse(Date.Today.ToShortDateString & ", " & TeamMembersDataGridView.CurrentCell.Value.ToString)
    5. If e.ColumnIndex = 1 Then
    6. CurrentRow.StartTime = CellTextAsDate
    7. Else
    8. CurrentRow.EndTime = CellTextAsDate
    9. End If
    10. End Sub

    Dann erhält man mit der Eingabe "8:00" in Spalte StartTime und "12:05" und Spalte EndTime eine saubere Zeitdifferenz von 4 Stunden und 5 Minuten.
    Weitere Dateneingabeformate (z.B. 8,5 ergibt 08:30 (so mach ich es) oder 08:05 (so ist es wohl bei EdRs Stechuhr)) kann man auch einbinden, geht dann aber auf anderem Wege, also über weiteren Code.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das geschieht im DGV selbst. Gib der entsprechenden Spalte bei DefaultCellStyle das Format "hh:\mm". Das Standard-Zeitformat "t" funktioniert interessanterweise nicht. Zuerst dachte ich, dass es doch klappt, aber nach Projektbereinigung ging es wieder nicht. Nur "hh\:mm" kann ich bestätigen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    ...ist nur die Frage, ob das sinnvoll ist.
    m.E. gehört sowas dann schon wieder in den Business-Logic-Teil des Programms. Denn dann kommt noch diese Regelung dazu und jene ... Dann besser die TimeSpan-Spalte nicht automatisch in der Tds.vb berechnen lassen, sondern im Hauptprogramm nach Abschluss der DGV-Bearbeitung. Dann kann der Berechnungsteil problemlos auch auf weitere Faktoren zugreifen. Wenn ich mir vorstelle, dass das tDS plötzlich alles mögliche über die Mitarbeiter, Betriebsstruktur, Arbeitszeitberechnung und ihre Feinheiten kennen müsste 8|
    Aber das ist Deine Entscheidung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    OK!
    Also doch die Berechnung im DGV durchführen.
    Dann sollte ich doch besser auf Post 6 zurückgreifen!
    Da dort alle Berechnungen in der Expression durchgeführt werden können!
    Mal schauen ob ich das hinbekomme :)

    Schon kommen die ersten Großen ????????

    Wo und wie muss ich die Zuweisung setzen?
    Bilder
    • Meldung.JPG

      106,11 kB, 1.391×453, 92 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „MR_NMS“ ()