Berechnung Arbeitszeit?

  • VB.NET

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

    @VB1963: Oh, das sollte kein Konter sein, sondern nur eine Fortsetzung, da ich damit aufzeigen wollte, dass der TE da noch einiges beachten muss, wenn er diesen Weg gehen will. Aber wie geschrieben - seine Entscheidung.

    @MR_NMS: Wenn das mal nicht Extensions aus @ErfinderDesRades helper projects sind, dann weiß ich auch nicht auf Anhieb weiter. Da müssten wir wohl die betroffenen Zeilen selber sehen. Oder Du versuchst den Sinn der angemarkerten Zeilen zu verstehen und schreibst sie um. Null und NotNull klingt z.B. nach einem kurzen Ersatz für Is Nothing bzw. IsNot Nothing.
    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.

    MR_NMS schrieb:

    das ist eine Nummer zu schwer für mich
    Was genau? EdRs Code? Oder TimeSpan? Oder die Thematik an sich?
    m.E. ist es insofern einfach: Du hast nen Arbeitsbeginn, Du hast ein Arbeitsende. Beides als Date, da dort Datum+Zeit drin gespeichert werden. Dann würde ich ohne Expressions weiterarbeiten. In ne Extratabellenspalte kommt die effektive Arbeitszeit. Die rechnest Du Dir in ner Extraprozedur aus. Diese Prozedur kennt die ganzen Sonderregeln. Vielleicht sind diese Sonderregeln auch mitarbeiterabhängig. Vielleicht muss ein normaler Angestellter gewisse Pausen einhalten und leitende Angestellte können durchmachen. Vielleicht haben Schwangere Sonderregeln. Vielleicht gelten Extraregeln für den Chef. Aber zusammengefasst: effektive Arbeitszeit = Ende - Anfang - andere Abzüge. Mehr isses nicht.

    btw: Ich arbeite (auch) gerade beruflich an einem Dienstplaner. Daher steck ich mitten drin. Zwar (noch?) nicht bei den rechtlichen Regelungen. Aber zumindest in der Codierung des Ganzen.
    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.
    EdRs Code!
    Das mit dem Arbeitsbeginn und Ende geht alles soweit!
    Aber wie du schon erwähnt hast, sollte man die Berechnung nicht mehr im Dt durchführen!

    Bei mir sieht es zur Zeit so aus:
    Das ich ein Anfang der Arbeitszeit habe.
    von - bis
    Daraus wird zur Zeit im Dt die Arbeitszeit berechnet!

    Nun ist es natürlich noch so, das der Mitarbeiter wenn er länger als 4 Stunden arbeitet eine Pause abgezogen bekommt!
    Arbeitet er länger als 6 Stunden bekommt er dann erneut eine Pause abgezogen!
    Tja, wie ich es machen würde, schrieb ich bereits. Ich werde mich jetzt allerdings nicht mit EdRs Code beschäftigen, um herauszufinden, ob weitergehende rechtliche Regelungen wie einbaubar sind oder ob das überhaupt bei ihm vorgesehen ist. Da wird sich der Autor bestimmt selber dazu äußern.
    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.

    MR_NMS schrieb:

    Also doch die Berechnung im DGV durchführen.
    HimmelWillen - Nein!!!
    Wenn du meinst, jemand hätte das behauptet, dann ists vmtl. ein Missverständnis.
    Die Daten sind im Dataset, das DGV präsentiert die nur (also Anzeige, und Änderung durch den User).
    vlt. dachtest du, Vaporized hätte das gesagt, als er mit Busineslogik anfing.
    Was immer er damit gemeint hat, bestimmt nicht, dass du im DGV Berechnungen durchführen sollst (was immer das auch bedeuten mag, weil in einem DGV kann man keine Berechnungen durchführen).

    Ich bin auch nicht seiner Ansicht - ich siedele sehr gerne Businesslogik im Codebehind von typisierten Datasets an - warum auch nicht?
    In meine Stechuhr-App habich zB eine TagRow.CalculateTimeDauers()-Methode, mit der eine TagRow die Dauer der Arbeitsabschnitte des Tages in geeigneter Weise berechnet.
    Wo soll ich das denn sonst hinschreiben - auf jeden Fall nicht in den Form-Code!
    OK!

    Die tägliche Arbeitszeit habe ich schon mal.

    VB.NET-Quellcode

    1. Private Sub SchichtenDTDataTable_SchichtenDTRowChanged(sender As Object, e As SchichtenDTRowChangeEvent) Handles Me.SchichtenDTRowChanged
    2. RemoveHandler Me.SchichtenDTRowChanged, AddressOf SchichtenDTDataTable_SchichtenDTRowChanged
    3. e.Row.MonSum = e.Row.MonBIS - e.Row.MonVON
    4. AddHandler Me.SchichtenDTRowChanged, AddressOf SchichtenDTDataTable_SchichtenDTRowChanged
    5. End Sub


    Nun möchte ich gerne, das eine Pause von 01:00 Stunde abgezogen wird!
    Kann ich es dort auch berechnen?

    MR_NMS schrieb:

    Kann ich es dort auch berechnen?
    Gut. Damit hast Du also eine Entscheidung getroffen, nämlich für EdRs Weg*, alles im tDS-Code zu machen. Das ist doch mal ein Anfang.

    Klar kannst Du. Jetzt geht's eben los, dass Du nach Zeile#3 Deine ganzen Regelungen reinschreibst. Stichwort If. Also z.B.: Wenn e.Row.MonSum (sicher, dass Du es bei derartigen Namen belassen willst?) > 6, dann ziehe von e.Row.MonSum zwei Stunden ab. Wenn es jedoch nur > 4 sind, dann nur eine. Und so weiter.

    *Übrigens: Was mein Weg ist: Ich packe die ganzen Regelungen, die dann für die Arbeitszeitberechnung eingebracht werden, in eine Extraklasse, die sich um die Datenmanipulation kümmert. Das tDS an sich hat bei mir immer nur die Aufgabe, sich um die Datenhaltung zu kümmern. Weitergehende Logik im tDS-CodeBehind gibt es bei mir nicht. Es ist eine Entscheidung, die man treffen muss und auch konsequent einhalten sollte. Wenn man alles in die tDS-Klasse packen will, kann man das. Man sollte nur den Weg konsequent fortsetzen, für den man sich entschieden hat und nicht wild durchmischen, bis man gar keinen Durchblick mehr hat, wo welche Datenänderungen geschehen. Was besser oder schlechter ist, muss man für sich selbst rausfinden. Und ja, da gebe ich EdR absolu recht: Der Datenmanipulationscode gehört nicht in den Form-Klassen-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.

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

    Danke für die Ausführliche Antwort!
    Das mit den Klassen ist mir glaube ich zur Zeit noch eine Nummer zu weit!
    Bei mir kommen auch nur noch die Pausen zum tragen und sonst nichts mehr.

    Ein Schritt weiter bin ich jetzt schon mal.
    Zumindest bekomme ich jetzt schon mal eine Pause abgezogen :)

    VB.NET-Quellcode

    1. Dim Arbeitszeit As TimeSpan
    2. Dim Pause As TimeSpan = TimeSpan.FromMinutes(30)
    3. Dim Pause1 As TimeSpan = TimeSpan.FromHours(4)
    4. Dim Pause2 As TimeSpan = TimeSpan.FromHours(6)
    5. Arbeitszeit = e.Row.MonBIS - e.Row.MonVON
    6. If Arbeitszeit > Pause2 Then
    7. e.Row.MonSum = Arbeitszeit - Pause - Pause
    8. ElseIf Arbeitszeit > Pause1 Then
    9. e.Row.MonSum = Arbeitszeit - Pause
    10. ElseIf Arbeitszeit < Pause1 Then
    11. e.Row.MonSum = Arbeitszeit
    12. End If

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

    Bitte sei nicht zu schockiert.

    VB.NET-Quellcode

    1. e.Row.WochenSUM = MontagSumme + DienstagSumme + Mittwochsumme

    Aber hey, Deine Variante geht auch:

    VB.NET-Quellcode

    1. MontagSumme.Add(DienstagSumme.Add(MittwochSumme))

    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.
    Es kommt nicht 3 Stunden raus, sondern 9h + 9h + 9h = 27h = 24h + 3h = 1 Tag und 3 Stunden.
    @MR_NMS: Wenn Du keine Zeitpanne haben willst, sondern eine Stundenzahl, dann:

    VB.NET-Quellcode

    1. e.Row.WochenSUM = (MontagSumme + DienstagSumme + Mittwochsumme).TotalHours
    Das ist dann aber kein TimeSpan-Wert mehr, sondern ein Double-Wert.
    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.
    Derzeit erstelle ich mithilfe von VB eine entsprechende Exceltabelle. Ob die dann ausgedruckt wird oder versendet, kann der User dann selber aussuchen. Aber ich gestalte gerade das Programm um und werde dem User so ermöglichen auch Excel-unabhängige Varianten zu erzeugen, z.B. mithilfe des PrintDocument-CEs dann eine PDF erstellen. Ggf. auch mit ITextSharp, aber das kommt drauf an, was mein Kunde will. Bei ihm ist es ein Kleinbetrieb, sodass sein Schichtplan noch auf eine A4-Seite passt ;)
    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.
    Wo gibt's du die einzelnen Schichten ein!
    Bin gerade noch ein wenig am grübeln, wie es am Besten ist!
    Ich habe den Mitarbeiter und je 7 Tage an dem die Tagesschichten eingegeben werden müssen!
    Ich habe es zum Testen erste einmal wie in den Bildern gemacht!
    Ich denke, das diese Ansicht nur dafür sein sollte, um sich einen Überblick der Schichten der Mitarbeiter zu holen!
    Für die Schichtplanung sollten nur die verfügten Mittarbeiter links stehen und rechts die Tagesschichten der jeweiligen Woche!
    Das linke MitarbeiterDgv soll dann die Mitarbeiter anzeigen und das rechte die jeweilige Schicht der zu planenden Woche!
    Wie stelle ich es an, das dass SchichtenDgv die MitarbeiterID vom MitarbeiterDgv pro Zeile mit übernimmt?

    Also

    ID Name ID MitarbeiterID Datum von Datum bis
    1 Peter 1 1 15.04.2019 21.04.2019
    2 Max1 2 2 15.04.2019 21.04.2019
    Bilder
    • Max.JPG

      93,32 kB, 2.187×523, 37 mal angesehen
    • Peter.JPG

      108,72 kB, 2.147×499, 33 mal angesehen