Zeitleiste Grafisch darstellen Vb.net

werner_sg

Erfahrenes Mitglied
Bitte Quellcode formatiert angeben
(den entsprechenden CODE Tag)

und was genau das problem ist
Sorry hatte es ausversehen so reingesetzt.
Mein Problem ist das er immer noch nur die erste Zeile angezeigt hat, habe aber glaube ich meinen Fehler erkannt und werde das heute Abend mal nachbessern und dann nochmal eine Status meldung geben
 

werner_sg

Erfahrenes Mitglied
Bitte Quellcode formatiert angeben
(den entsprechenden CODE Tag)

und was genau das problem ist

Ok schaue bei each Row soweit durch, hatte vorher alles auérhalb von eachrow ausgeführt und auch keine Liste angelegt, nachdem ich einiges in den Block gelegt habe und eine Liste erstelle bekomme ich jetzt alle Werte richtig in extra dafür angelegten Messages angezeigt

Code:
    Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)

        If String.IsNullOrEmpty(TextBox1.Text) Then                                 ' Bedingung das die Textbox1 keinen Wert bzw keine Eingabe hat

            Dim Stringliste As New List(Of String)                                  ' String Liste

            Dim Startpunkt As String = ""                                           ' Grafikpunkt Mietbegin
            Dim Endpunkt As String = ""                                             ' Grafikpunkt Mietende
            Dim Fahrzeugnummer As String = ""                                       ' Fahrzeugnummer



            Dim MietzeitIndex = 1                                                   ' Mietbegin Counter zum durchlaufen der Zeilen

            Dim horizontal = 20                                                     ' der erste horizontale Abstand für die Zeitleiste
            Dim g As Graphics = e.Graphics                                          ' Variable für die PictureBox.

            'Daten holen und Verarbeiten
            dbdt = New DataTable

            Try

                Sql = "SELECT BuchungsNr, Kunde, Fahrzeugnummer, Modell, Mietbegin, Year(Mietbegin) AS JahrStart, MONTH(Mietbegin) AS MonatStart,  DAY(Mietbegin) AS TagStart, Mietdauer, Mietende, TOTAL FROM tblreservierung  where KFZ_ABGEGEBEN='nein' ORDER BY Fahrzeugnummer, Mietbegin"

                conn.Open()
                With dbcmd
                    .CommandText = Sql
                    .Connection = conn
                End With

                dbda.SelectCommand = dbcmd
                dbda.Fill(dbdt)
                DataGridView7.DataSource = dbdt

                'Zeilen Trennung
                Dim x As Integer
                For x = 40 To 2000 Step 50

                    g.DrawLine(New Pen(System.Drawing.Color.Black, 1), PictureBox1.Left, x, PictureBox1.Right, x)

                Next

                'Umsatz Anzeige
                Dim TotalMoto = 0
                Dim TotalSales = 0

                For Each Row As DataRow In dbdt.Rows

                    Dim Mietende As Date = CDate(Row.Item("Mietende").ToString)

                    If Date.Compare(Mietende, Today) > 0 Then
                        Stringliste.Add(Row.Item("Mietbegin"))
                        Startpunkt &= vbNewLine & ((Row.Item("JahrStart") * 10000) + (Row.Item("MonatStart") * 100)) + Row.Item("TagStart")
                        Endpunkt &= vbNewLine & Row.Item("Mietdauer")
                        Fahrzeugnummer &= vbNewLine & Row.Item("Fahrzeugnummer")

                    End If
                    MietzeitIndex += 1


                    TotalSales += Val(Row.Item("TOTAL"))            'Umsatz Berchnung

                Next
                If Not Stringliste.Count.Equals(0) Then

                    MessageBox.Show(Startpunkt)
                    MessageBox.Show(Endpunkt)
                    MessageBox.Show(Fahrzeugnummer)
                    ' g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), FahrzeugnummerMessage, horizontal, FahrzeugnummerMessage, horizontal)   'Eingabezeichen haben das falsche Format

                End If

                Label15.Text = TotalSales                           'Umsatz Anzeige


            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                conn.Close()
            End Try



        End If

    End Sub

Habe jetzt allerdings das Problem die Werte welche ich als String habe in Decimal zu Convertieren

bei meiner jetztigen Versuchen erhalte ich die Fehlermeldung das die Eingabezeichen das falsche Format haben

habs auch schon mal hiermit versucht
Code:
            Dim Stringliste As New List(Of String)                                  ' Mietbegin Liste

            Dim Decimalliste As List(Of Decimal) = Stringliste.ConvertAll(Function(item) Decimal.Parse(item))

            ' Dim MietzeitstartMessage As String = ""                                 ' Test Message Mietbegin
            'Dim MietdauerendeMessage As String = ""                                 ' Test Message Mietende
            ' Dim FahrzeugnummerMessage As String = ""                                ' Test Message Fahrzeugnummer

            Dim Startpunkt As Decimal = ""                                 ' Grafikpunkt Mietbegin
            Dim Endpunkt As Decimal = ""                                 ' Grafikpunkt Mietende
            Dim Fahrzeugnummer As Decimal = ""                                 ' Grafikpunkt Mietende
erhalte dann aber

System.InvalidCastException: "Ungültige Konvertierung von der Zeichenfolge in Typ Decimal."
 
Zuletzt bearbeitet:

Spyke

Premium-User
Ich würde vermuten das Mietbegin vom Typ DateTime ist, du versuchst es aber nach decimal zu parsen.
Müssteste doch eigentlich wenn dann eher nach DateTime parsen.
 

werner_sg

Erfahrenes Mitglied
Ich würde vermuten das Mietbegin vom Typ DateTime ist, du versuchst es aber nach decimal zu parsen.
Müssteste doch eigentlich wenn dann eher nach DateTime parsen.
Ja Mietbegin und Mietende sind in der Access vom Typ DateTime muss auch sein da ich das an anderer Stelle so brauche.
In der DrawLine werden Sie ja aber als Zahl benötigt, sonst wird da gemeckert.
In der Liste sind die Werte ja als String und werden auch als String in der MessageBox so ausgegeben wie ich sie als Zahl bräuchte.
Es muss doch enen Weg geben diese als Zahl zu konvertieren
 

Spyke

Premium-User
ausgehend das du normal mit dem DateTime Objekt arbeitest, erstellen wir uns selbst eine eigene Zahl
(wie ich weiter vorne in einem Post mal erwähnte)

Visual Basic:
    Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
    Dim beginnNum As Integer = (((beginn.Year * 10000) + beginn.Month) * 100) + beginn.Day

sprich in der Liste hälst du dir die original Objekte, die DateTime Objekte/Daten.

Nachtrag:
Oder ist der Mietbeginn in der Row schon durch SQL als Zahl quasi gewandelt?
Dann prüf mal den Inhalt deiner Liste, sind da wirklich nur Zahlen als string drin oder ev. auch ein Leer string z.B.?
Kannst dir auch mal
Decimal.TryParse Methode (System)
anschauen, da kriegst du dann nicht gleich eine Exception um die Ohren geschmissen wenn die konvertierung fehlschlägt.
Aber wie gesagt, prüf mal was in der Liste ist, ein Element scheint dann fehelrhaft zu sein.

Nachtrag 2:
Falls aus SQL schon die Zahl kommt dann ev. beim auslesen schon direkt nach Zahl casten und nicht den umweg über die stringliste gehen.

Visual Basic:
    Dim wert As Decimal = CDec(Row.Item("Mietbegin"))
    decimalListe.Add(wert)
oder um sicher zu gehen das aus der SQL wirklich Zahlwert kommt (könnte theoretisch auch DBNull kommen, je nach SQL)
Visual Basic:
    If TypeOf Row.Item("Mietbegin") Is Decimal Then
        Dim wert As Decimal = CDec(Row.Item("Mietbegin"))
        decimalListe.Add(wert)
    End If
 
Zuletzt bearbeitet:

werner_sg

Erfahrenes Mitglied
ausgehend das du normal mit dem DateTime Objekt arbeitest, erstellen wir uns selbst eine eigene Zahl
(wie ich weiter vorne in einem Post mal erwähnte)

Visual Basic:
    Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
    Dim beginnNum As Integer = (((beginn.Year * 10000) + beginn.Month) * 100) + beginn.Day

sprich in der Liste hälst du dir die original Objekte, die DateTime Objekte/Daten.
Nicht ganz verstanden, also den Block schon

Code:
Dim Mietende As Date = CDate(Row.Item("Mietende").ToString)

Damit hole ich mir ja bereits das Datum als String

Und mit
Code:
If Date.Compare(Mietende, Today) > 0 Then
                        Stringliste.Add(Row.Item("Mietbegin"))
                        Startpunkt &= vbNewLine & ((Row.Item("JahrStart") * 10000) + (Row.Item("MonatStart") * 100)) + Row.Item("TagStart")
                        Endpunkt &= vbNewLine & Row.Item("Mietdauer")
                        Fahrzeugnummer &= vbNewLine & Row.Item("Fahrzeugnummer")

                    End If

prüfe ich ob das Mietende nach dem heutigen Tag liegt, da ich nur diese noch benötige, der rest ist ja erledigt. in der Mesage Box zum Testen werden dementsprechend untereinander auch nur noch Daten angezeigt welche dem entsprechen.

Endpunkt (Mietdauer) und Fahrzeugnummer liegen in der Access als Zahl vor und sollten auch dementsprechend als Zahl verarbeitet werden

Hole ich mir das Datum des Mietbegins in eine MessageBox erhalte ich das Datum mit Uhrzeit

Setze ich das Startdatum aus der SQL Abfrage Year, Month und Day zusammen mit dem jeweiligen Multiplikator erhalte ich wie geplant 20210612 für den 12.06.2021

in der Stringliste habe ich den Wert "31.07.2021 00:47:54"

Zusammengefasst was mir klar ist:

Dim Mietendeliste As New List(Of String) erzeugt mir meine Liste mit den Endzeitpunkten (Datum) als String um im eachRow Block bei If Not Mietendeliste.Count.Equals(0) verarbeitet zu werden und Ansonsten keine weitere Verwendung

Dim Mietende As Date = CDate(Row.Item("Mietende").ToString) holt mir die Notwendigen Daten für die if Prüfung als String
Mietendeliste.Add(Row.Item("Mietende")) füllt die Stringliste für die If Not Prüfung sonst keine Verwendung

Code:
Startpunkt &= vbNewLine & ((Row.Item("JahrStart") * 10000) + (Row.Item("MonatStart") * 100)) + Row.Item("TagStart")
Endpunkt &= vbNewLine & Row.Item("Mietdauer")
Fahrzeugnummer &= vbNewLine & Row.Item("Fahrzeugnummer")

holt die Daten für die MessageBoxen aus der Datenbank, eigentlich überflüssig war nur zum schnelleren Überblick zum Inhalt da ich Anfangs eine Verbindung zur Stringliste gesehen habe welche ja gar nicht besteht

Ohne vbNewLine & werden die Ergebnisse in der MessageBox als ein durchgehender String angezeigt

Die Daten Aus der SQL Abfrage kommen bei Mietbegin, Mietende, JahrStart, MonatStart und TagStart als Datum sowie Fahrzeugnummer und Mietdauer als Text

hier verstehe ich nicht welchen bezug beginn.Year haben soll, habs auch mal mit JahrStart versucht klappt aber nicht

Code:
Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
Dim beginnNum As Integer = (((beginn.Year * 10000) + beginn.Month) * 100) + beginn.Day

am Ende bin ich immer noch auf der Suche einer Erklärung wie ich meine Decimal Werte erhalte, CAST oder CONVERT in der SQL Abfrage bekomme ich auch nicht hin, laut MS sollte es eigentlich mit Convert zu varchar und dann weiter zu int gehen also nach dem Motto CONVERT(int, (CONVERT(var, Fahrzeugnummer))

Das Hauptproblem ist mit jedem Suchen werde ich konfuser, auf 100 Seiten finden sich unterschiedliche Infos die meisten hauen dann eine ähnliche Lösungen hin ohne Erklärung oder haben die Lösung und zeigen diese dann nicht mehr auf.
 

werner_sg

Erfahrenes Mitglied
Hier nochmal mein Code für den Teil mit Kommentar für alle einzelnen Anweisungen, vieleicht hilft das meinen Denkfehler zu verstehen

Code:
    Private Sub pictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs)

        If String.IsNullOrEmpty(TextBox1.Text) Then                                 ' Bedingung das die Textbox1 keinen Wert bzw keine Eingabe hat

            Dim Mietendeliste As New List(Of String)                                ' String Liste Mietende

            Dim Startpunkt As String = ""                                           ' Grafikpunkt Mietbegin
            Dim Endpunkt As String = ""                                             ' Grafikpunkt Mietende
            Dim Fahrzeugnummer As String = ""                                       ' Fahrzeugnummer

            Dim MietzeitIndex = 1                                                   ' Counter zum durchlaufen der Zeilen

            Dim horizontal = 20                                                     ' der erste horizontale Abstand für die Zeitleiste
            Dim g As Graphics = e.Graphics                                          ' Variable für die PictureBox.

            'Daten holen und Verarbeiten
            dbdt = New DataTable

            Try
                'SQL Zugriff für alle Fahrzeuge welche noch nicht zurückgegeben sind
                Sql = "SELECT BuchungsNr, Kunde, Fahrzeugnummer, Modell, Mietbegin, Year(Mietbegin) AS JahrStart, MONTH(Mietbegin) AS MonatStart,  DAY(Mietbegin) AS TagStart, Mietdauer, Mietende, TOTAL FROM tblreservierung  where KFZ_ABGEGEBEN='nein' ORDER BY Fahrzeugnummer, Mietbegin"

                conn.Open()
                With dbcmd
                    .CommandText = Sql
                    .Connection = conn
                End With

                dbda.SelectCommand = dbcmd
                dbda.Fill(dbdt)
                DataGridView7.DataSource = dbdt

                'Zeilen Trennung Linien
                Dim x As Integer                    'definiert x als Integer Zahl
                For x = 40 To 2000 Step 50          'setzt x auf Anfang 40 und erhöht jeweils um 50 bis 2000 erreicht

                    g.DrawLine(New Pen(System.Drawing.Color.Black, 1), PictureBox1.Left, x, PictureBox1.Right, x) ' zeichnet die Linien in die PictureBox

                Next

                'Umsatz Anzeige
                Dim TotalMoto = 0
                Dim TotalSales = 0

                For Each Row As DataRow In dbdt.Rows

                    Dim Mietende As Date = CDate(Row.Item("Mietende").ToString)         'stellt das Mietende als String bereit

                    If Date.Compare(Mietende, Today) > 0 Then
                        Mietendeliste.Add(Row.Item("Mietende"))                         'fügt die Zeilen der Tabellen Spalte Mietende zur Stringliste

                        'Daten für MessageBox
                        Startpunkt &= vbNewLine & ((Row.Item("JahrStart") * 10000) + (Row.Item("MonatStart") * 100)) + Row.Item("TagStart")
                        Endpunkt &= vbNewLine & Row.Item("Mietdauer")
                        Fahrzeugnummer &= vbNewLine & Row.Item("Fahrzeugnummer")

                    End If
                    MietzeitIndex += 1          'Zähler für die reihen


                    TotalSales += Val(Row.Item("TOTAL"))            'Umsatz Berchnung

                Next
                If Not Mietendeliste.Count.Equals(0) Then           'prüft ob Daten in der Stringliste vorhanden oder nicht

                    MessageBox.Show(Startpunkt)
                    MessageBox.Show(Endpunkt)
                    MessageBox.Show(Fahrzeugnummer)
                    '     MessageBox.Show(beginnNum)

                    '  g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), Endpunkt, horizontal, Fahrzeugnummer, horizontal)   'Eingabezeichen haben das falsche Format

                End If

                Label15.Text = TotalSales                           'Umsatz Anzeige


            Catch ex As Exception
                MsgBox(ex.Message)
            Finally
                conn.Close()
            End Try



        End If

    End Sub
 

Spyke

Premium-User
sry hier hatte sich ein kleiner Fehlerteufel eingeschlichen
Code:
Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
Dim beginnNum As Integer = (((beginn.Year * 10000) + beginn.Month) * 100) + beginn.Day
beginn sollte beginnDate sein
Code:
Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
Dim beginnNum As Integer = (((beginnDate.Year * 10000) + beginnDate.Month) * 100) + beginnDate.Day


Und Problem ist das du alles mit string versuchst zu händeln, dabei bekommst du eigentlich aus der SQL auch schon die richtigen Datentypen

aber wenn wir jetzt mal von deinem StartPunkt ausgehen, den du als String hälst und der ja vom Aufbau so sein müsst 20210612
könntest du hier das decimal Parse anwenden
Code:
Dim startNummer As Decimal = Decimal.Parse(StartPunkt)
und dann mit startNummer weiter arbeiten
 

werner_sg

Erfahrenes Mitglied
aber wenn wir jetzt mal von deinem StartPunkt ausgehen, den du als String hälst und der ja vom Aufbau so sein müsst 20210612
könntest du hier das decimal Parse anwenden
Code:
Dim startNummer As Decimal = Decimal.Parse(StartPunkt)
und dann mit startNummer weiter arbeiten
Hatte ich irgendwann auch schon mal versucht erhalte dann aber falsches Eingabeformat

Und Problem ist das du alles mit string versuchst zu händeln, dabei bekommst du eigentlich aus der SQL auch schon die richtigen Datentypen
Weil alles und jeder einen in diese Richtung gesendet hat, dann lass uns doch nicht mit dem Parse weitermachen weil es halt mal schon so ist, sondern einfach wie den richtig verarbeiten.

Das hilft viel mehr sonst stehe ich vieleicht irgendwann mal wieder vor einem ähnlichen Problem und komm auch nicht sauber weiter weil ich mich diesmal darum geschlängelt habe.

Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
Dim beginnNum As Integer = (((beginnDate.Year * 10000) + beginnDate.Month) * 100) + beginnDate.Day
hier habe ich das Problem das ich alles im if Date.Compare Block verarbeiten muss auch das drawline

trenne ich beide oder packe das draw nicht in den gleichen Block erhalte ich eine Fehlermeldung das beginnDate nicht deklariert wurde

mache ich es so
Code:
                For Each Row As DataRow In dbdt.Rows

                    Dim Mietende As Date = CDate(Row.Item("Mietende").ToString)         'stellt das Mietende als String bereit
                    Dim beginnDate As DateTime = CType(Row.Item("Mietbegin"), DateTime)
                    Dim beginnNum As Decimal = (((beginnDate.Year * 10000) + beginnDate.Month) * 100) + beginnDate.Day

                    If Date.Compare(Mietende, Today) > 0 Then
                        Mietendeliste.Add(Row.Item("Mietende"))                         'fügt die Zeilen der Tabellen Spalte Mietende zur Stringliste
                        'Daten für MessageBox
                        'Startpunkt &= vbNewLine & ((Row.Item("JahrStart") * 10000) + (Row.Item("MonatStart") * 100)) + Row.Item("TagStart")
                        Endpunkt &= vbNewLine & Row.Item("Mietdauer")
                        Fahrzeugnummer &= vbNewLine & Row.Item("Fahrzeugnummer")
                        g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), 200, horizontal, 250, horizontal)   'Eingabezeichen haben das falsche Format
erhalte ich einen überlauf fehler
 

Neue Beiträge