Automatische Pausenzuweisung

  • VB.NET
  • .NET (FX) 4.0

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von Schamash.

    Automatische Pausenzuweisung

    Hallo zusammen,

    ich bin mir sicher, ich stelle mir selbst ein Bein.
    Im Folgenden Code wird eine DataTable erstellt und die Mitarbeiternamen anhand der Pausenzeiten verteilt.
    Die Pausen werden anhand der Arbeitszeiten vergeben und sollen nun auf den Tagesplan verteilt werden.

    Leider scheint der Counter der die Anzahl der Pausen für die ausgewählte Zeit ermitteln soll nie hochgezählt (Zeile 44)
    Allerdings wird die Zeile erreicht und die Zeile 43 wird auch korrekt ausgeführt.
    Am ende kommt somit eine Verteilung raus wo anstelle von ca. 150 Mitarbeitern nur ca 10 Mitarbeiter auf die Pausenzeiten verteilt sind da immer nur der letzte Eintrag angezeigt wird.

    So sieht es aus:
    So soll es aussehen:

    Hier ist der Verwendete Code:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function PausenVerteilen2() As DataTable
    2. Dim MoeglicherPausenSlot As Integer = 0
    3. GlobSchichtplan = ClearSchichtplan() 'Variable vom Typ DataTable
    4. GlobMAListe = MAListeErmitteln() 'Variable vom Typ List(of String)
    5. For Each _Mitarbeiter As Mitarbeiter In GlobMAListe 'Mitarbeiterklasse
    6. Dim VorherigePausenzeit As New Date
    7. For Each _Pause As Pause In _Mitarbeiter.Pausen 'Pause ist eine Klasse
    8. GlobSchichtplan.AcceptChanges()
    9. Dim _Counter As Integer = -1
    10. Dim _RowNumber As Integer = 0
    11. Dim _PausenZeit As New DateTime
    12. Dim Treffer As Boolean = False
    13. _Pause.FruehstePausenZeit = GlobFruestePause
    14. _Pause.SpaetestePausenZeit = GlobSpaetestePause
    15. _Pause.Startzeit = If(_Pause.Nummer = 1, _Mitarbeiter.AzVon, VorherigePausenzeit)
    16. While Not Treffer
    17. _Counter += 1
    18. For Each _row As DataRow In GlobSchichtplan.Rows
    19. If Convert.ToDateTime(_row.Item("Uhrzeit")) >= _Pause.Pausenzeit AndAlso
    20. Convert.ToDateTime(_row.Item("Uhrzeit")) <= _Pause.Pausenzeit.AddMinutes(180) Then
    21. If Convert.ToInt16(_row.Item("Counter")) < _Counter OrElse
    22. (Convert.ToInt16(_row.Item("Counter")) = _Counter AndAlso
    23. Treffer = False) Then
    24. Debug.Print(Convert.ToInt16(_row.Item("Counter")).ToString)
    25. _Counter = Convert.ToInt16(_row.Item("Counter")) '<---------------------- Hier ist das Problem: Der Wert ist immer 0
    26. _RowNumber = Convert.ToInt16(_row.Item("RowNr"))
    27. _PausenZeit = Convert.ToDateTime(_row.Item("Uhrzeit"))
    28. Treffer = True
    29. End If
    30. End If
    31. Next
    32. End While
    33. If GlobSchichtplan.Columns.Count < _Counter + 5 Then
    34. GlobSchichtplan.Columns.Add("Pause_" & _Counter.ToString("00"), GetType(String))
    35. End If
    36. While _Pause.Pausenzeit < _PausenZeit
    37. Pauseverschieben(_Pause, _Mitarbeiter.AzBis.AddMinutes(-90))
    38. End While
    39. GlobSchichtplan.Rows(_RowNumber).Item("Pause_" & _Counter.ToString("00")) = _Mitarbeiter.Name '<-------------Der Name wird merkwürdigerweise korrekt gespeichert
    40. GlobSchichtplan.Rows(_RowNumber).Item("Counter") = _Counter + 1 '<---------------------- Dieser Teil funktioniert scheinbar nicht.
    41. Next
    42. Next
    43. PausenVerteilen2 = GlobSchichtplan
    44. End Function

    Function ClearSchichtplan:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function ClearSchichtplan() As DataTable
    2. Dim Uhrzeit As Date = GlobFruestePause
    3. ClearSchichtplan = New DataTable
    4. Dim RowNr As Integer = 1
    5. With ClearSchichtplan
    6. .Columns.Add("RowNr", GetType(Integer))
    7. .Columns.Add("Counter", GetType(Integer))
    8. .Columns.Add("Datum", GetType(Date))
    9. .Columns.Add("Uhrzeit", GetType(Date))
    10. While Uhrzeit <= GlobSpaetestePause
    11. .Rows.Add(RowNr, 0, Uhrzeit, Uhrzeit)
    12. RowNr += 1
    13. Uhrzeit = Uhrzeit.AddMinutes(15)
    14. End While
    15. End With
    16. End Function



    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Schamash schrieb:

    nie hochgezählt
    Sieh Dir mal ganz genau die Verwendung der lokalen Variable _Counter an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab es gelöst.
    Allerdings war der _RowNumber das Problem und nicht _Counter.

    Index = 0-Basiert ... :thumbsup:
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."