vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 06.10.23 10:51

Hallo ich möchte die aktuelle bzw. eingegebene Zeit 07:00 Uhr 1 h in schleife hinzufügen die letzte Zeit wäre dann bspw. 18:00 wie stellt man das an

h soll eine Variable sein, also auch 1,5 h zum Beispiel

ich glaube mit AddHours(1) oder so, nur mein Problem ist die Schleife dafür und doppelte Einträge sollen es ja auch nicht sein dürfen


in einer Spalte einer DGV soll dann das stehen

07:00
08:00
09:00
10:00
11:00
.
.
.
18:00

Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 06.10.23 12:41

hab da was gefunden, aber gefällt mir noch nicht ganz

evtl. hat jemand was schöneres möchte ja auch 1,5 h oder 2,5 h

        Dim currentDate As DateTime = Me.timepicker.Value
        Dim endDate As DateTime = currentDate.AddHours(9)
        Dim hCount As Integer = CInt(DateDiff(DateInterval.Hour, currentDate, _
          endDate))
        For i = 0 To hCount
            DataGridView1.Rows.Add(hCount, currentDate.AddHours(i).ToString( _
              "dd.MM.yyyy HH:mm"))
        Next
aussehen tut es dann so



für eine schönere (bessere) Lösung Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: SoEinVBler
Datum: 08.10.23 13:07

Hallo,

die einfachste Lösung wäre vermutlich einfach die Schrittgröße (Steps) in deiner Schleife anzugeben.
Du solltest die Variable i dann auch als Double deklarieren um auch Dezimalzahlen verwenden zu können
Mein Beispiel ist mit Messagebox, da ich das Grid nicht einrichten wollte.

        Dim currentDate As DateTime = DateTime.Now
        Dim i As Double
        Dim delta As Double = 1.5
        Dim hCount As Integer = 5 'CInt(DateDiff(DateInterval.Hour, 
        ' currentDate, endDate))
 
        For i = 0 To hCount Step delta
            MessageBox.Show(currentDate.AddHours(i).ToString("dd.MM.yyyy" & _
              "HH:mm"))
        Next
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 08.10.23 15:18

Danke sieht soweit gut aus

wie kann man nun prüfen das er nicht über 24:00 rausgeht

also immer nur von Bspweise Heute 07:00 bis 22:00

if Now = ??



hier noch der Code:

        Dim dt As DataTable = DataSet1.Details
        '##########
        Dim currentDate As DateTime = timepicker.Value        'DateTime.Now
        Dim i As Double
        Dim delta As Double = 1.5
        Dim hCount As Integer = 10 'CInt(DateDiff(DateInterval.Hour, 
        ' currentDate, endDate))
 
        For i = 0 To hCount Step delta
            Dim NewRow As DataRow = dt.NewRow
 
            NewRow("Tagesdatum") = currentDate.AddHours(i).ToString("dd.MM.yyyy" & _
              "HH:mm")
            NewRow("Kommentar") = "das funzt-------"
            dt.Rows.Add(NewRow)
        Next
 
 
 
        DetailsDataGridView.Refresh()
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: SoEinVBler
Datum: 09.10.23 09:06

Hallo,

das Ende der Schleife oder die Dauer der Schleife legst du ja mit hCount fest.
Das hast du ja in deinem 1. Beispiel auch schon berechnet.

Um mit Zeiten zu arbeiten gibt es 2 Datentypen DateTime & TimeSpan.

In DateTime wird ein Datum und Uhzeit gespeichert, TimeSpan ist eine Zeitspanne, also eine "Differenz".

Beide Typen bieten einige Funktionen und Eigenschaften, schau sie dir mal an.


So was geht z.B. auch.
        Dim d As DateTime = DateTime.Now
        Dim td As TimeSpan = TimeSpan.FromHours(1.5)
        MessageBox.Show(d.ToShortTimeString)
        d = d.Add(td)
        MessageBox.Show(d.ToShortTimeString)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 09.10.23 12:50

Danke für deine Mühe doch ich möchte das Datum Uhrzeit nicht doppelt haben




wie kann ich das in der Schleife prüfen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: SoEinVBler
Datum: 09.10.23 20:54

Hallo,

naja du must dann halt die Inhalte des Datagrid durchgehen und prüfen ob es schon vorhandne ist.

Oder du packst die Werte in eine List und prüfst ob die Werte enthalten sind.

in der 2. Schleife wird nur der letze Wert eingetragen, die anderen existieren ja schon.

        Dim currentDate As DateTime = DateTime.Now
        Dim lDate As New List(Of DateTime)
        Dim i As Double
        Dim delta As Double = 1.5
        Dim hCount As Integer = 5
 
 
        For i = 0 To hCount Step delta
            If lDate.Exists(Function(x) x = currentDate.AddHours(i)) = False _
              Then
                lDate.Add(currentDate.AddHours(i))
                MessageBox.Show(lDate.Item(lDate.Count - 1).ToString( _
                  "dd.MM.yyyy HH:mm"))
            End If
        Next
        For i = 0 To hCount + 2 Step delta
            If lDate.Exists(Function(x) x = currentDate.AddHours(i)) = False _
              Then
                lDate.Add(currentDate.AddHours(i))
                MessageBox.Show(lDate.Item(lDate.Count - 1).ToString( _
                  "dd.MM.yyyy HH:mm"))
            End If
        Next
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 10.10.23 14:36

leider bekomme ich das nicht in die Datenbank bzw. Datarow, arbeite dran
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 12.10.23 18:02

also weiß jetzt nicht ob das die Lösung ist, scheint aber zu funktionieren. Möchte aber sicher sein

darum was meint das Forum dazu?





   Dim dt As DataTable = DataSet1.Details1
        '##########
 
        Dim currentDate As DateTime = StartDate
        Dim currentEnde As DateTime = EndDate
 
        Dim delta As Double = nuddelta.Value
        Dim hCount As Integer = nudhcount.Value
 
        For i = 0 To hCount Step delta
            'prüfen
            'Pruefe Vorhandensein der Uhrzeit:
            Dim strPruefstring = currentDate.AddHours(i).ToString("HH:mm")
            If pruefe_Uhrzeit(strPruefstring) = False Then
 
                Fehler_Uhrzeit(strPruefstring)
            Else
                Dim NewRow As DataRow = dt.NewRow
                NewRow("Tagesdatum") = currentDate.ToString("dd.MM.yyyy HH:mm")
                NewRow("Uhrzeit") = currentDate.AddHours(i).ToString("HH:mm")
                NewRow("Kommentar") = ">"
 
                dt.Rows.Add(NewRow)
            End If
        Next
'Prüfung
Private Function pruefe_Uhrzeit(ByVal strPruefstring As String) As Boolean
        Dim Anz = (From Eintrag In DataSet1.Details1
                   Where Eintrag.RowState <> DataRowState.Deleted AndAlso _
                     Eintrag.Uhrzeit.ToShortTimeString = strPruefstring.ToString
                   Select Eintrag).Count
 
        If Anz > 0 Then Return False
 
        Return True
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Manfred X
Datum: 13.10.23 10:49

Hallo!

Einige Hinweise:
In einer Datatable sollte man grundätzlich Datum/Uhrzeit als Date-Spalten verwenden.
Auch für interne Abfragen und Überprüfungen immer auf die entsprechenden Methoden
der entsprechenden Klassen zurückgreifen.
String-Umwandlungen sind nur für die Anzeige oder Benutzer-Auswahl in einem Control
vorgesehen.
Beim Vergleich von Zeiten ist die benötigte Genauigkeit zu beachten.
Man bildet z.B. die Zeit-Differenz in einem Timespan-Objekt und vergleicht sie
mit einem Referenz-Timespan, das die maximal zulässige Abweichung vorgibt.

Auch in einer Schleife sollte Delta nicht als Double-Variable gesetzt werden.
Die Laufschleife könnte die Addseconds-Methode nutzen.
Statt 1,5 Minuten könnte man 90 Sekunden addieren.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 13.10.23 11:38

Hallo ManfredX

Danke für die Hinweise,
Die Laufschleife könnte die Addseconds-Methode nutzen.

kannst du uns ein besseres Beispiel basteln als meine Variante?
das wäre Top ich habe mit solchen Schleifen schon öfters Probleme in der Umsetzung gehabt (nicht verstanden).

ich möchte mir solche "Listen" erstellen können um die dann für verschiedenes zu verwenden.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Manfred X
Datum: 13.10.23 13:39

Hallo!

Ich habe zwar nicht so ganz verstanden, was Du erreichen möchstest,
aber die Bearbeitung von Zeitangaben wird verständlicher, wenn man
davon ausgeht, dass es sich bei der Zeitachse um eine Tick-Skala handelt.

 ''' <summary>Ganze Stunde vor einem Zeitpunkt</summary>
    ''' <param name="dt">Zeitpunkt</param>
    Private Function FullHourBefore(ByVal dt As Date) As Date
        Return dt.Date.AddHours(dt.Hour)
    End Function
 
    ''' <summary>Liegen zwei Zeitpunkte innerhalb eines 
    ' Vergleichs-Intervalls</summary>
    ''' <param name="dt1">Erster Zeitpunkt</param>
    ''' <param name="dt2">Zweiter Zeitpunkt</param>
    ''' <param name="maxdiff">Intervall</param>
    Private Function AreDateTimesEqual(ByVal dt1 As Date, ByVal dt2 As Date, _
      maxdiff As TimeSpan) As Boolean
 
        If maxdiff < TimeSpan.Zero Then
            Throw New ArgumentException("Negative Schranke bei Zeitvergleich")
        End If
 
        Return New TimeSpan(Math.Abs(dt1.Ticks - dt2.Ticks)) <= maxdiff
    End Function
 
    ''' <summary>Erstellung einer Serie von gleichabständigen Zeitpunkten</summary>
    ''' <param name="dtStart">Startzeitpunkt</param>
    ''' <param name="dtEnd">Endzeitpunkt</param>
    ''' <param name="diff">Zeitintervall</param>
    Private Function GetTimeSeries(ByVal dtStart As Date, ByVal dtEnd As Date, _
      diff As TimeSpan) As List(Of Date)
 
        If diff <= TimeSpan.Zero Or
            dtStart >= dtEnd Then
            Throw New ArgumentException("Keine geeignete Parameterliste bei" & _
              "Zeitreihen-Erstellung")
        End If
 
        If Math.Abs(dtStart.Ticks - dtEnd.Ticks) \ Math.Abs(diff.Ticks) > _
          100 Then
            Throw New ArgumentException("Parameter definieren zu viele" & _
            "Zeitpunkte")
        End If
 
        Dim dt As Date = dtStart
        Dim dtList As New List(Of Date)
        dtList.Add(dtStart)
 
        Do Until dtEnd.Ticks < dt.Ticks + diff.Ticks
            dt = dt.Add(diff)
            dtList.Add(dt)
        Loop
 
        Return dtList
 
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 14.10.23 16:11

Hallo Manfred X,

da komm ich nicht mit klar, also ich möchte soetwas wie im Outlook Kalender eine Agenda, Zeitleiste oder wie man es nennt.

7:00
8:00
9:00
etc.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 17.10.23 18:22

Hallo Manfred X,

ist mir wichtig!

würdest du das auch so machen ? oder hast du eine andere Idee ?

    Dim NL As String = Environment.NewLine
        '--------------------------------------------------------------------
        Dim FirstDate As Date = CDate(dtp_start_Datetime.Value)
        Dim delta As Integer = CLng(nud_Sekunden.Value)
        Dim mCount As Integer = CInt(nud_mCount.Value)
 
        Dim Msg As String = Nothing
        Dim Daten As DataTable = DataSet1.Details
 
        For i = 1 To mCount
            FirstDate = DateAdd(DateInterval.Second, delta, FirstDate)
            If Daten.Select("Tagesuhrzeit = '" & FirstDate.ToString("dd.MM.yyyy" & _
              "HH:mm") & "'").Count = 0 Then
                ' Neue DRV
                Dim DR As DataRow = Daten.NewRow
                DR.Item("day") = FirstDate.ToString("ddd")
                DR.Item("Tagesdatum") = FirstDate.ToString("dd.MM.yyyy")
                DR.Item("Tagesuhrzeit") = FirstDate.ToString("HH:mm")
                DR.Item("Kommentar") = ">"
                'Neue Zeile
                Daten.Rows.Add(DR)
                'Me.Validate()
                'DetailsBindingSource.EndEdit()
                'In Dataset speichern 
 
            Else
                'abbrechen
                DetailsBindingSource.CancelEdit()
 
            End If
        Next
 
        Me.DetailsBindingSource.Sort = "Tagesuhrzeit Asc"
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Manfred X
Datum: 17.10.23 22:51

Hallo!

Die Stringdarstellung von Zeitangaben ist z.B. von Culture-Einstellungen abhängig
und deshalb nur geeignet für die Benutzer-Interaktion, aber nicht für
interne Programmzwecke.

    'Einige Benutzereingaben in Controls
    Dim dtp As New DateTimePicker
    dtp.Value = New DateTime(2023, 5, 10, 13, 12, 45)
 
    Dim nudMinutes As New NumericUpDown
    nudMinutes.Value = 90
 
    Dim nudCount As New NumericUpDown
    nudCount.Value = 15
 
    'Umwandlung der Eingaben in die erforderlichen DateTime-Werte
    Dim startdatetime As DateTime = FullHourBefore(dtp.Value) 'siehe oben
    Dim interval As New TimeSpan(0, CInt(nudMinutes.Value), 0)
    Dim enddatetime As DateTime =
        startdatetime.AddMinutes(CInt(nudCount.Value) * interval.TotalMinutes)
 
    'Erstellung der Zeitpunktliste (siehe oben)
    Dim datetimelist As List(Of DateTime) =
            GetTimeSeries(startdatetime, enddatetime, interval)
 
    'Datentabelle
    Dim dt As New DataTable
    Dim dtColumnname As String = "Zeitpunkt"
    dt.Columns.Add(dtColumnname, GetType(DateTime))
 
    'Zwei Zeilen mit Zeitpunkten eintragen
    Dim dr As DataRow, fs As String
    dr = dt.NewRow
    dr(dtColumnname) = datetimelist(5).AddSeconds(15)
    dt.Rows.Add(dr)
 
    dr = dt.NewRow
    dr(dtColumnname) = datetimelist(10).AddSeconds(-25)
    dt.Rows.Add(dr)
 
    'Datenliste in Datatable übertragen unter Beachtung der 
    'bereits vorhandenen Zeitpunkte und
    'einer Genauigkeit von +/- 30 Sekunden
    For i As Integer = 0 To datetimelist.Count - 1
        dr = dt.NewRow()
 
        'Filterstring für Vergleich / Zeitangaben in Hochkommas
        fs = dtColumnname & ">'" & datetimelist(i).AddSeconds(-30) &
        "' And " & dtColumnname & "<'" & datetimelist(i).AddSeconds(+30) & "'"
 
        If dt.Select(fs).Count = 0 Then
           dr(dtColumnname) = datetimelist(i)
           dt.Rows.Add(dr)
        End If
    Next i
 
    'Für die getrennte Anzeige von Datum und Uhrzeit 
    'wird eine zweite Spalte (Expression) erstellt
    dt.Columns.Add("Uhrzeit", GetType(DateTime), dtColumnname)
 
    bs.DataSource = dt  'Bindingsource für Datenbindung
Um die getrennte Anzeige von Datum und Uhrzeit im Datagrid zu ermöglichen,
verwendet man z.B. die Expressionspalte "Uhrzeit" im CellFormatting-Event
des Datagridview-Control.
 Private Sub dgv_CellFormatting(sender As Object, 
     e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
 
     If e.ColumnIndex = 0 Then
        If Not IsDBNull(e.Value) Then
           e.Value = CDate(e.Value).ToString("dd.MM.yyyy")
           e.FormattingApplied = True
        End If
     ElseIf e.columnindex = 1 Then
        If Not IsDBNull(e.Value) Then
           e.Value = CDate(e.Value).ToString("hh:mm")
           e.FormattingApplied = True
        End If
     End If
End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Erichbru
Datum: 18.10.23 10:49

Hallo Manfred X,

Danke für deine Variante, und den Kommentaren dazu.
Habe es mal versucht in eine Form zu packen muss aber gestehen ganz verstanden habe ich deine Variante noch nicht.

hier das Resultat vom Code verstehe es noch nicht ganz was hätte sein sollen?

hätte es nicht bei 13:12 los gehen müssen ?
und die Liste geht über den 10.05 raus ? soll es so sein ?

oder muss noch sortiert werden



was bedeuten die Parameter? 1 mal (5) und (15) 1 mal (10) und (-25)

'Zwei Zeilen mit Zeitpunkten eintragen
        Dim dr As DataRow, fs As String
        dr = dt.NewRow
        dr(dtColumnname) = datetimelist(5).AddSeconds(15)
        dt.Rows.Add(dr)
 
        dr = dt.NewRow
        dr(dtColumnname) = datetimelist(10).AddSeconds(-25)
        dt.Rows.Add(dr)


Beitrag wurde zuletzt am 18.10.23 um 11:03:12 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Heute dd.MM.yyyy HH:ss + 1 Hours 
Autor: Manfred X
Datum: 18.10.23 14:23

Hallo!

Ich kenne Dein Programm nicht und liefere Demo-Beispiele.
Wenn Du nicht möchtest, dass der Startzeitpunkt eine ganze Stunde ist,
lasse einfach den Aufruf der Methode GetfullHourBefore weg.
Diese Funktion schneidet nämlich bei der Benutzereingabe Minuten und
Sekunden weg.

Der Endzeitpunkt ist berechnet aus der Startzeit, dem Interval (90 Minuten)
und der Anzahl der Intervalle ("GetTimeSeries").
Wenn Du einen anderen Endzeitpunkt möchtest, der also innerhalb des letzten
Intervalls liegt (!), dann gib diesen Zeitpunkt als Parameter der Routine an.
Die Routine hört dann ein Intervall früher auf.
In der zurückgegebenen Liste, kannst Du Deinen Zeitpunkt dann noch anhängen
(Add-Methode). Das letzte Zeitintervall ist dann eben kürzer.

datetimelist(10).addseconds(-25) bedeutet,
dass ich den zehnten Eintrag in der DateTimelist abfrage und von diesem Zeitpunkt
25 Sekunden abziehe.
Dieser Wert wird vorab in die Liste eingetragen und dient zur Demonstration
des später verwendeten Select-Kommandos.

Da der Wert datetimelist(10) sich um weniger als 30 Sekunden von diesem bereits
eingetragenen Wert unterscheidet, wird datetimelist(10) in der Schleife nicht in
die Datentabelle übertragen (Select liefert Count =1).

Um auf die übliche 24-stündige Zeitanzeige zu kommen, kann man die
Formatierungsroutine mit Standardformat t und Cultureinfo nutzen:
    Private Sub dgv_CellFormatting(sender As Object, 
        e As DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
 
        If e.ColumnIndex = 0 Then
            If Not IsDBNull(e.Value) Then
                e.Value = CDate(e.Value).ToString("dd.MM.yyyy")
                e.FormattingApplied = True
            End If
        ElseIf e.columnindex = 1 Then
            If Not IsDBNull(e.Value) Then
                e.Value = CDate(e.Value).ToString("t",
                System.Globalization.CultureInfo.GetCultureInfo("DE-de"))
                e.FormattingApplied = True
            End If
        End If
    End Sub
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel