Tage Berechnung bis heute

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Vulferin.

    Tage Berechnung bis heute

    Hallo Zusammen,

    ich habe ein Dataset
    Spalte 4 wird ein Datum eingetragen, ich möchte gerne das er in Spalte 6 die Differenz in Tagen vom Datum Spalte 4 bis heute Automatsch beim öffnen der Form berechnet.

    Mein Bislang Versuch war im Load Bereich der Form

    VB.NET-Quellcode

    1. Dim Date1 As Date = Today
    2. For Each Row In DataGridView1.Rows.Cast(Of DataGridViewRow)
    3. If Row.Index = DataGridView1.RowCount - 0 Then Exit For
    4. Dim Date2 = Row.Cells(4).Value.ToString
    5. Dim days As Long = DateDiff(CStr(days), Date1, Date2)
    6. Row.Cells(6).Value = days.ToString


    Leider Ohne Erfolg.
    Könntet ihr mir helfen ?

    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed

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

    Timespan ist möglich aber auch "Totaldays"

    versuche es mal so

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim dStartDate As Date = TextBox1.Text
    3. Dim dEndDate As Date = TextBox2.Text
    4. Dim numdays As Integer = (dEndDate - dStartDate).TotalDays
    5. Me.TextBox3.Text = numdays
    6. End Sub

    Kasi schrieb:

    Dim dStartDate As Date = TextBox1.Text
    Das ist genauso wenig typsicher wie

    Vulferin schrieb:

    Dim Date2 = Row.Cells(4).Value.ToString
    Für beide gilt: Option Strict On!

    VB.NET-Quellcode

    1. ​Dim Date1 As Date = Today
    2. Dim Date2 As Date
    3. For Each Row In DataGridView1.Rows.Cast(Of DataGridViewRow)
    4. If Row.Index = DataGridView1.RowCount - 0 Then Exit For
    5. If Date.TryParse(Row.Cells(4).Value.ToString, Date2) Then
    6. Dim days = Math.Floor((Date2 - Date1).TotalDays)
    7. Row.Cells(6).Value = days.ToString
    8. End If
    9. Next
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Ich wage zu bezweifeln, dass es um WPF geht und schon 3x nicht um MVVM. Daher verschiebe ich das Thema.
    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.
    Was komisch ist,
    wenn ich die zeile richtig verstehe
    If Date.TryParse(Row.Cells(4).Value.ToString, Date2) Then

    If Date,TryParse sagt mir nicht, daber Wor.Cells(4) also Aktive Zeile Celle 4
    den Inhalt soll er als Date2 Varibale setzen oder ?

    Wenn ich den Fehler habe, sehe ich das Datum was in der Celle steht und auch das Aktuelle Datum von Date1

    Für mich liest er den Wert richtig aus.
    Moinsen,

    bevor Du weitermachst: Setz in den Projekteinstellungen "OPTION EXPLICIT ON" und "OPTION STRICT ON". Danach korrigierst Du die dann auftretenden Fehler erstmal.

    Eine saubere Berechnung der Tagesdifferenz in VB geht so:

    VB.NET-Quellcode

    1. Dim Start As Datetime = IrgendeinWert
    2. Dim DiffTage As Int32 = Ctype(DateTime.Nuw.Subtract(Start).TotalDays,Int32)
    3. 'Könnte man auch so schreiben:
    4. Dim DiffTage2 As Int32 = CInt(DateTime.Nuw.Subtract(Start).TotalDays)


    Für das Auslesen aus den Zellen ist jetzt eigentlich die Frage, welchen Datentyp die Value-Eigenschaft hat (wenn Du alles richtig gemacht hast, steht da nämlich bereits ein Datum drin und keine Zeichenfolge!)

    Wenn der Datentyp von Value DateTime ist, dann geht´s so:

    VB.NET-Quellcode

    1. Row.Cells(6).Value =CInt(DateTime.Nuw.Subtract(Row.Cells(4).Value).TotalDays)


    Wenn da aber nur Zeichenketten stehen, mußt Du vorher konvertieren.

    Übrigens: Wie der Wert aus Value für die Anzeige im Datagridview formatiert wird, legst Du über die Spalteneigenschaften fest, da mußt Du keine Zeichenfolgen reinschreiben.

    Viele Grüße

    Gerrit
    @petaod

    Habs, habe deinen Hinweis verstandn
    If Row.Cells(4).Value Is Nothing Then Continue For
    war die Lösung

    VB.NET-Quellcode

    1. Dim Date1 As Date = Today
    2. Dim Date2 As Date
    3. For Each Row In DataGridView1.Rows.Cast(Of DataGridViewRow)
    4. If Row.Index = DataGridView1.RowCount - 0 Then Exit For
    5. If Row.Cells(3).Value Is Nothing Then Continue For
    6. If Date.TryParse(Row.Cells(3).Value, Date2) Then
    7. Dim days = Math.Floor((Date1 - Date2).TotalDays)
    8. Row.Cells(5).Value = days.ToString
    9. End If
    10. Next


    So klappt es bei mir :)

    CodeTags korrigiert; bitte zukünftig darauf achten, das richtige CodeHighlighting zu verwenden ~VaporiZed

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

    Hallo,
    was die anderen Leute hier mit „Option Strict“ auf On schalten meinen:
    Du klickst auf Projekt → Eigenschaften → Kompilieren. Hier schaltest du Option Strict auf On und am besten (aber das ist nur meine Meinung) Option Infer auf Off.

    Option Strict On bewirkt, dass du auf vorzunehmende Datentypumwandlungen aufmerksam gemacht wirst. Wie in jeder Programmiersprache kannst du nicht zu einem Integer einen String addieren. Logisch! Leider ist diese Option ist VB.NET-Projekten ausgeschaltet. Man muss diese Option wieder aktivieren.

    Option Infer sorgt dafür, dass der Compiler die Datentypen selbst erkennt. Zum Beispiel:
    Dim Test = 3, dann muss Test ein Integer sein. Schalte diese Option gerne auf Off, damit du dich selbst zwingst, den Datentyp hinzuschreiben. Dim Test As Integer = 3. Das ist nur gut für dich.

    Und wo wir schon dabei sind: Klick auf Verweise und entferne den VB6-Namespace aus deinem Projekt. Einfach die Checkbox unchecken. Somit werden dir beim Tippen keine alten VB6-Befehle vorgeschlagen, sondern nur noch moderne VB.NET-Befehle. Falls du bereits VB6-Code verwendet hattest, wirst du nun natürlich Fehlermeldungen bekommen. Ersetz die alten durch die neuen Befehle.

    Bilder
    • Vollbildaufzeichnung 05.06.2022 163003.jpg

      102,2 kB, 901×614, 37 mal angesehen
    • Vollbildaufzeichnung 05.06.2022 163018.jpg

      93,33 kB, 1.618×409, 36 mal angesehen
    • Vollbildaufzeichnung 05.06.2022 163022.jpg

      135,19 kB, 565×1.017, 39 mal angesehen
    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!