Progressbar mit Datum nützen

  • VB.NET
  • .NET 5–6

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Typhoon.

    Progressbar mit Datum nützen

    Hallo Liebes Forum

    Ich würde gerne eine Frist ( von bis ) Grafisch darstellen.
    Meine Idee ist, ein Progressbar als Optischer darsteller zu nutzen, in dem sollte angezeigt werden, wenn ein gewisser Zeitraum ( Monate / in Wochen oder Tagesschritten ) abgelaufen ist.

    Ich habe schon Beispiele gemacht die Funktionieren mit Timer usw. aber halt in Minuten schritten und wenn ich mein Programm schließe und wieder öffne beginnt alles von vorne.

    Ich komme nur nicht dahinter, wie ich es realisieren kann, das z.B. von einem Datum zum anderen Datum in Wochen schritten der Progressbar Balken weniger wird.

    Ich könnte mir vorstellen das es so in etwa funktionierten könnte.

    Anfangstdatum = 100
    Enddatum = 0

    und jetzt sollte nach jeder verstrichenen Woche der Wert um 10 veringert werden.

    Wenn 0 erreicht, dann eine Meldung.

    So etwas habe ich schon realisiert aber halt nur mit Timer im Minuten takt und alles beginnt wieder von vorn wenn ich das Programm neu starte.

    VB.NET-Quellcode

    1. Public Class FrmLoad
    2. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    3. LblReportProgress.Text = PBLoading1.Value & "%"
    4. PBLoading1.Value += 1
    5. If PBLoading1.Value > 25 Then
    6. LblStatusText.Text = "25"
    7. End If
    8. If PBLoading1.Value > 45 Then
    9. LblStatusText.Text = "45"
    10. End If
    11. If PBLoading1.Value > 65 Then
    12. LblStatusText.Text = "65"
    13. End If
    14. If PBLoading1.Value > 90 Then
    15. LblStatusText.Text = "90"
    16. End If
    17. If PBLoading1.Value = 100 Then
    18. LblStatusText.Text = "100"
    19. MsgBox("Enddatum erreicht")
    20. Timer1.Dispose()
    21. End If
    22. End Sub
    23. End Class


    Besten Dank

    Gebhard
    @Typhoon Arbeite mit DateTime und TimeSpan.
    learn.microsoft.com/de-de/dotn…imespan.days?view=net-7.0
    Aus Start- und Enddatum machst Du eine TimeSpan-Instanz, deren .Days-Property Du verwenden kannst.
    Das Ende-Datum packst Du in die Settings, das Start-Datum holst Du Dir vom System.
    Den Timer musst Du nicht disposen, das macht das Framework. Es genügt, ihn anzuhalten.
    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 seh das etwas komplizierter: du brauchst ein Datenmodell, was du abspeichern kannst.
    Es muss enthalten Start-Datum und End-Datum.
    Du kannst tatsächlich die Settings nehmen, aber wie gesagt: sowohl Start- als auch EndDatum müssen gespeichert werden.
    Von EndDatum kannste StartDatum subtrahieren und erhälst die Zeitspanne (Timespan) der gesamten Frist (nenne sie: fristDuration).
    Vom System erhälst du das aktuelleDatum, etwa mit Date.Today
    Nun kannste vom EndDatum auch das aktuelleDatum subtrahieren und erhälst die Zeitspanne von heute bis Frist-Ende (nenne sie: remainingDuration).
    Diese beiden Zeitspannen musste ins Verhältnis setzen und auf die PB übertragen:
    ist remainingDuration 75% von fristDuration - dann muss die PB folglich 75% anzeigen.



    jedenfalls nochmal ganz grundsätzlich - das hier ist der Abzweig in den Holzweg, auf dem du dich befindest:

    VB.NET-Quellcode

    1. PBLoading1.Value += 1
    Hier wird die PB einfach erhöht, das heisst, ihr vorheriger Wert ist Eingabe ihres neuen Wertes.
    Diese Idee ist komplett irrig.
    Die Eingabe des neuen PB-Wertes muss komplett von aussen kommen - wie ausgeführt: berechnet aus dem Datenmodell und dem heutigen Tag.
    Guten Abend

    @ErfinderDesRades & @RodFromGermany

    Danke für diese Tipps.

    Ich habe mir daraufhin etwas zusammen gebastellt. Bitte schüttelt nicht den Kopf, es kommt von einem NICHT PROFI!! aber es funktioniert bis auf Zeile 23.

    Wenn ich Zeile 23 Auskommentiere errechnet es mir genau die Tage aus bis zur nächsten Reinigung.

    [/URL][/img]

    Aber wenn ich Zeile 23. wieder Aktiviere habe irgendwo einen Knopf im Kopf.

    Zeile 23. Meldet: Der Wert vom Typ "Date" kann nicht in "TimeSpan" konvertiert werden.

    Ich möchte ja wie @ErfinderDesRades schreibt
    Nun kannste vom EndDatum auch das aktuelleDatum subtrahieren und erhälst die Zeitspanne von heute bis Frist-Ende (nenne sie: remainingDuration


    Wo ist der Knopf?

    Hier mein Code:

    Visual Basic-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class FormWartungDruckerei
    3. Private Sub BtnEintragen_Click(sender As Object, e As EventArgs) Handles BtnEintragen.Click
    4. Dim Conn As MySqlConnection
    5. Dim cmd As MySqlCommand
    6. Dim READER As MySqlDataReader
    7. Dim StartDatum As Date
    8. Dim EndDatum As Date
    9. Dim fristDuration As TimeSpan
    10. Dim remainingDuration As TimeSpan()
    11. Conn = New MySqlConnection With {
    12. .ConnectionString = "server=localhost; userid=root; password=; database=dwp"
    13. }
    14. StartDatum = Convert.ToDateTime(DateTimePickerStart.Value)
    15. EndDatum = Convert.ToDateTime(DateTimePickerEnd.Value)
    16. fristDuration = EndDatum.Subtract(StartDatum)
    17. remainingDuration = fristDuration.Subtract(Date.Today)
    18. TxtTage.Text = FormatNumber(fristDuration.TotalDays, 0)
    19. Try
    20. Conn.Open()
    21. Dim Query As String
    22. Query = "INSERT INTO tbl_wartung_wasserkasten (start, end, faellig) VALUES ( '" & DateTimePickerStart.Text & "', '" & DateTimePickerEnd.Text & "', '" & fristDuration.TotalDays & "')"
    23. cmd = New MySqlCommand(Query, Conn)
    24. READER = cmd.ExecuteReader
    25. MessageBox.Show("Data Saved")
    26. Conn.Close()
    27. Catch ex As Exception
    28. MessageBox.Show(ex.Message)
    29. Finally
    30. Conn.Dispose()
    31. End Try
    32. Close()
    33. End Sub
    34. End Class


    Gruß Gebhard
    Ein Beispiel: Du hast eine Zeitspanne von 12 Stunden. Was käme raus, wenn Du davon den 11.12.2022 abziehst? Du siehst, dass die Berechnung zurecht keinen Sinn ergibt.
    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.
    Genau.

    Typhoon schrieb:

    aber es funktioniert bis auf Zeile 23.
    Was ist der Unterschied zwischen 12 Stunden und 12 Uhr?
    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!
    Guten Abend

    @RodFromGermany und @VaporiZed

    Ein Beispiel: Du hast eine Zeitspanne von 12 Stunden. Was käme raus, wenn Du davon den 11.12.2022 abziehst? Du siehst, dass die Berechnung zurecht keinen Sinn ergibt.


    Was ist der Unterschied zwischen 12 Stunden und 12 Uhr?


    Da kommt nur "Quatsch raus" ;) Ihr habt ja recht. Ich habe zu schnell und zu wenig nachgedacht. ABER!!!

    Ich habe die Lösung!!:

    mit diesem Code-Teil wird bis zum erreichen des EndDatums jeweils 1 Tag Abgezogen.

    VB.NET-Quellcode

    1. ' Waschbalken Reinigung frist berechnen
    2. Dim sql5 As String = "Select WB13bis FROM `DWP`.`tbl_Druckeinheit` WHERE druckeinheit = 'DE1'"
    3. Dim StartDatum As Date
    4. Dim EndDatum As Date
    5. Dim fristDuration As TimeSpan
    6. Try
    7. If ConnectDatabas() Then
    8. cmd = New MySqlCommand With {
    9. .Connection = Conn,
    10. .CommandText = sql5
    11. }
    12. MyReader = cmd.ExecuteReader
    13. With MyReader
    14. While .Read
    15. Dim sName = MyReader("WB13bis")
    16. StartDatum = Convert.ToDateTime(sName)
    17. EndDatum = Convert.ToDateTime(Date.Today)
    18. fristDuration = EndDatum.Subtract(StartDatum)
    19. TxtDW13faellig.Text = FormatNumber(fristDuration.TotalDays, 0)
    20. End While
    21. End With
    22. End If
    23. Catch ex As Exception
    24. MsgBox(ex.Message, MsgBoxStyle.Critical, "Error [" & ex.GetType.Name & ", Akt. Feld: """ & AktFldNme & """]")
    25. Finally
    26. If MyReader IsNot Nothing Then
    27. MyReader.Close()
    28. MyReader = Nothing
    29. End If
    30. If cmd IsNot Nothing Then
    31. cmd.Dispose()
    32. cmd = Nothing
    33. End If
    34. End Try



    Nächste Aufgabe das ganze in einem Progressbar Grafisch darstellen.

    Besten dank für die Tipps.

    Gruß Gebhard
    Hallo @ErfinderDesRades

    Ich habe eine Form in der ich Start und End Datum in die DB schreibe.



    In der Form wo alle Informationen stehen wird dann angezeigt in wievielen Tagen die nächste Reinigung gemacht werden sollte.



    Ändere ich jetzt das System Datum auf 13.01.2023 wird dies in der Form Informationen aktualisiert und angezeigt. Nur noch 31 Tage bis zur Reinigung.





    Ist das End Datum erreicht ist die Reinigung fällig. ( 0 Tage )



    Ich denke mal dass das Funktioniert. Jetzt noch das ganze Grafisch darstellen.

    Gruß Gebhard
    Hallo zusammen

    Kurze Info.

    Mein Versuch eine Frist grafisch darzustellen ist geglückt.

    In diesem Beispiel sind bei allen 4 Waschbalken das Start Datum (letzte Reinigung) 05.12.2022 und das End Datum (nächste Reinigung fallig am) 05.01.2023 eingetragen und wird in den Progressbars dargestellt.



    Ist das End Datum erreicht (frist ist abgelaufen) ändert sich der Text in reinigen und der Progressbar ist (leer)



    Ich hab es so gelöst:

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class FormDruckerei
    3. Private Sub FormDruckerei_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ' ### DE1 Nächste Waschbalken WB13 Reinigung berechnen ### '
    5. Dim MyReader13 As MySqlDataReader = Nothing
    6. Dim cmd13 As New MySqlCommand
    7. Dim StartDatum13 As Date
    8. Dim EndDatum13 As Date
    9. Dim fristDuration13 As TimeSpan
    10. Dim sql As String = "Select WB13bis FROM `DWP`.`tbl_Druckeinheit` WHERE druckeinheit = 'DE1'"
    11. Try
    12. If ConnectDatabas() Then
    13. cmd13 = New MySqlCommand With {
    14. .Connection = Conn,
    15. .CommandText = sql
    16. }
    17. MyReader13 = cmd13.ExecuteReader
    18. With MyReader13
    19. While .Read
    20. Dim fEnd13 = MyReader13("WB13bis")
    21. StartDatum13 = Convert.ToDateTime(fEnd13)
    22. EndDatum13 = Convert.ToDateTime(Date.Today)
    23. fristDuration13 = EndDatum13.Subtract(StartDatum13)
    24. ProgressBarDW13faellig.Text = FormatNumber(fristDuration13.TotalDays, 0)
    25. End While
    26. End With
    27. End If
    28. Catch ex As Exception
    29. MsgBox(ex.Message)
    30. Finally
    31. If MyReader13 IsNot Nothing Then
    32. MyReader13.Close()
    33. MyReader13 = Nothing
    34. End If
    35. If cmd13 IsNot Nothing Then
    36. cmd13.Dispose()
    37. cmd13 = Nothing
    38. End If
    39. End Try
    40. ' ### ProgressBar für WB13 Darstellung ### '
    41. Dim sql1 As String = "Select gesamtfristWB13 FROM `DWP`.`tbl_Druckeinheit` WHERE druckeinheit = 'DE1'"
    42. Dim comp_percent13 As Double
    43. Try
    44. If ConnectDatabas() Then
    45. cmd13 = New MySqlCommand With {
    46. .Connection = Conn,
    47. .CommandText = sql1
    48. }
    49. MyReader13 = cmd13.ExecuteReader
    50. With MyReader13
    51. While .Read
    52. Dim gfrist13 = MyReader13("gesamtfristWB13")
    53. If Val(ProgressBarDW13faellig.Text) = 0 Then
    54. LblWB13DE1.Text = "reinigen"
    55. Else
    56. LblWB13DE1.Text = "Waschbalken"
    57. comp_percent13 = Val(ProgressBarDW13faellig.Text) / Val(gfrist13) * 100
    58. ProgressBarDW13faellig.Value = Val(Math.Abs(comp_percent13))
    59. End If
    60. End While
    61. End With
    62. End If
    63. Catch ex As Exception
    64. MsgBox(ex.Message)
    65. Finally
    66. If MyReader13 IsNot Nothing Then
    67. MyReader13.Close()
    68. MyReader13 = Nothing
    69. End If
    70. If cmd13 IsNot Nothing Then
    71. cmd13.Dispose()
    72. cmd13 = Nothing
    73. End If
    74. End Try


    Es ist noch nicht Perfekt, aber es Funktioniert soweit.

    Ein schönes Wochenende euch allen

    Gruß Gebhard
    @Typhoon
    dein Insert is nicht notwendig...

    VB.NET-Quellcode

    1. Dim Query As String
    2. Query = "INSERT INTO tbl_wartung_wasserkasten (start, end, faellig) VALUES ( '" & DateTimePickerStart.Text & "', '" & DateTimePickerEnd.Text & "', '" & fristDuration.TotalDays & "')"


    hier ein Bsp. direkt mit SQL die Berechnung auszuführen.

    VB.NET-Quellcode

    1. SELECT tbl_Wartung.WartungObjekt, tbl_Wartung.Naechstewartung, DateDiff("d",[Naechstewartung],Now()) AS inTagen, ([inTagen] Mod 365)\7 AS nWoche, ([inTagen] Mod 365) Mod 7 AS nTage
    2. FROM tbl_Wartung
    3. ORDER BY tbl_Wartung.WartungObjekt;


    berechnet werden die Anzahl Tage bzw. Wochen und Tage
    hier noch ein Bild