Zeitleiste Grafisch darstellen Vb.net

Spyke

Premium-User
schau dir mal die Methoden des OleDbDataReader an
OleDbDataReader Klasse (System.Data.OleDb)

wenn du in der DB schon den decimal wert hast könntest du zum Beispiel diesen direkt mittels GetDecimal anfragen, dann musst du keine Convert Sachen machen.
OleDbDataReader.GetDecimal(Int32) Methode (System.Data.OleDb)
der Parameter Ordinal ist dabei die Indexnummer deiner SELECT Spalte von der du den Wert haben willst.

könntest du jetzt selbst durchzählen in deinem SELECT (du müsstest nur prüfen unter VB.Net ob es bei 0 oder 1 beginnt, bei C# wäre es 0)
oder den Ordinal/Spaltenindex könntest du auch über GetOrdinal abfragen
OleDbDataReader.GetOrdinal(String) Methode (System.Data.OleDb)
 

werner_sg

Erfahrenes Mitglied
schau dir mal die Methoden des OleDbDataReader an
OleDbDataReader Klasse (System.Data.OleDb)

wenn du in der DB schon den decimal wert hast könntest du zum Beispiel diesen direkt mittels GetDecimal anfragen, dann musst du keine Convert Sachen machen.
OleDbDataReader.GetDecimal(Int32) Methode (System.Data.OleDb)
der Parameter Ordinal ist dabei die Indexnummer deiner SELECT Spalte von der du den Wert haben willst.

könntest du jetzt selbst durchzählen in deinem SELECT (du müsstest nur prüfen unter VB.Net ob es bei 0 oder 1 beginnt, bei C# wäre es 0)
oder den Ordinal/Spaltenindex könntest du auch über GetOrdinal abfragen
OleDbDataReader.GetOrdinal(String) Methode (System.Data.OleDb)
Also wie gehabt und erfahren einen direkten weg von Tabelle scheint es dann nicht zu geben

habs jetzt so:
Code:
                'Der Mietbegin als Zahl 20210518
                Dim JahrStart = Me.DataGridView7.CurrentRow.Cells(4).Value
                Dim JahrStartD = Convert.ToDecimal(JahrStart)
                Dim MonatStart = Me.DataGridView7.CurrentRow.Cells(5).Value
                Dim MonatStartD = Convert.ToDecimal(MonatStart)
                Dim TagStart = Me.DataGridView7.CurrentRow.Cells(6).Value
                Dim TagStartD = Convert.ToDecimal(TagStart)
                Dim StartDatum = ((JahrStartD * 10000) + (MonatStartD * 100) + TagStartD)

Monat, Jahr und Tag filter ich schon in der Abfrage:
Code:
YEAR(Mietbegin) AS JahrStart,  MONTH(Mietbegin) AS MonatStart,  DAY(Mietbegin) AS TagStart,  YEAR(Mietende) AS JahrEnde, MONTH(Mietende) AS MonatEnde, DAY(Mietende) AS TagEnde,
funktioniert ganz gut

------------------------------------------------------------

hier bräuchte ich noch was an Erklärung und Unterstützung:
Code:
                For Each Row As DataRow In dbdt.Rows
                    g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), StartDatum, horizontal, EndDatum, horizontal)
                    g.DrawString("FzgNr: " + Fahrzeug, fnt, Brushes.Black, New Point(2, horizontal))
                    horizontal += 15

                    TotalSales += Val(Row.Item("TOTAL"))
                Next
Eigentlich sollte er ja alle Reihen durchlaufen und Anzeigen, gut schleifen laufen tut er aber nur 9x Zeile 1 wiederholt

1626431211435.png
 

Spyke

Premium-User
hier bräuchte ich noch was an Erklärung und Unterstützung:
Code:
                For Each Row As DataRow In dbdt.Rows
                    g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), StartDatum, horizontal, EndDatum, horizontal)
                    g.DrawString("FzgNr: " + Fahrzeug, fnt, Brushes.Black, New Point(2, horizontal))
                    horizontal += 15

                    TotalSales += Val(Row.Item("TOTAL"))
                Next
Eigentlich sollte er ja alle Reihen durchlaufen und Anzeigen, gut schleifen laufen tut er aber nur 9x Zeile 1 wiederholt

du musst in deiner for each Schleife entsprechend auch die Werte für Fahrzeug, StartDatum, EndeDatum setzen/anpassen.
Aktuell haben diese in deiner Schleife immer den gleichen Wert
 

werner_sg

Erfahrenes Mitglied
Mein Codeschnipsel für die Grafik bis hierhin

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

        ' Variablen für die PictureBox.
        Dim g As Graphics = e.Graphics

        'der erste horizontale Abstand
        Dim horizontal = 20

        '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 Mietbegin ASC"

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

            dbda.SelectCommand = dbcmd
            dbda.Fill(dbdt)
            DataGridView7.DataSource = dbdt
            dbda.Fill(ds, "tblreservierung")           'sollte eigentlich ein Dataset mit dem Inhalt der tabelle füllen

            Dim DbReader As OleDbDataReader
            DbReader = dbcmd.ExecuteReader

            While DbReader.Read

                'Der Mietbegin
                Dim Mietbegin = Me.DataGridView7.CurrentRow.Cells(4).Value                      'Datum komplett

                'Das Jahr zur Auswahl über eine TextBox
                Dim JahrStart = Me.DataGridView7.CurrentRow.Cells(5).Value                      'Jahr
                Dim JahrStartD = Convert.ToDecimal(JahrStart)                                   'Jahr als Decimal

                'Der Mietbegin Monat und Tag als Zahl 0518
                Dim MonatStart = Me.DataGridView7.CurrentRow.Cells(6).Value                     'Monat
                Dim MonatStartD = Convert.ToDecimal(MonatStart)                                 'Monat als Decimal
                Dim TagStart = Me.DataGridView7.CurrentRow.Cells(7).Value                       'Tag
                Dim TagStartD = Convert.ToDecimal(TagStart)                                     'Tag als Decimal

                'Der Startpunkt
                Dim StartDatum = ((((MonatStartD * 100) + TagStartD) + 200))                'zusammengefasst als 0912 + 200 Abstand für die Fahrzeugnummer

                'Die Mietdauer
                Dim Mietdauer = Me.DataGridView7.CurrentRow.Cells(8).Value                      'Mietdauer in Tagen
                Dim MietdauerD = Convert.ToDecimal(Mietdauer)                                   'Mietdauer in Tagen als Decimal

                'Das Mietende
                Dim Mietende = Me.DataGridView7.CurrentRow.Cells(9).Value                      'Datum komplett


                Dim EndZeitpunkt = (StartDatum + (MietdauerD * 75))                             'zusammengefasst als 0912  * 75 um den Balken zu vergrößern

                'Fahrzeugnummer
                Dim Fahrzeug = Me.DataGridView7.CurrentRow.Cells(2).Value

                ' Me.TextBox2.Text = StartDatum
                'Me.Label15.Text = EndZeitpunkt

                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

                Dim TotalMoto = 0
                Dim TotalSales = 0

                For Each Row As DataRow In dbdt.Rows
                    g.DrawString(Mietbegin + " / " + Mietende, fnt2, Brushes.Black, New Point(StartDatum, (horizontal - 20)))
                    g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), StartDatum, horizontal, EndZeitpunkt, horizontal)
                    g.DrawString("FzgNr: " + Fahrzeug, fnt, Brushes.Black, New Point(2, (horizontal - 15)))
                    'horizontal += 15

                    TotalSales += Val(Row.Item("TOTAL"))
                Next
                Label15.Text = TotalSales

            End While



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

    End Sub
1626544169897.png

besteht die Möglichkeit (denke mal ja bin auch schon am suchen) anstelle die daten über das datagrid direkt aus dem Dataset zu holen also nicht mehr : Dim Mietbegin = Me.DataGridView7.CurrentRow.Cells(4).Value

und dann hänge ich immer noch daran die gleichen fahrzeuge in eine reihe zu bekommen und für die weiteren jeweils neue Reihen.

habe eure Hinweise ja teilweise versanden, nur um so mehr man sucht um so verwirrender wird es bei den ganzen Bruchstücken die alle anders ansetzen
 

werner_sg

Erfahrenes Mitglied
wie man die Zeilen der DataTable durchläuft weißt du ja schon,
schau mal hier
DataRow.Item[] Eigenschaft (System.Data)
so kommst du an die Spaltenwerte einer Zeile
Jain So wirklich verstanden habe ich den Part nicht, teilweise weis ich was er tut aber nicht so richtig warum
daher auch das Problen mit der Kombination des Hinweis auf die Data.Row items.

Dem entnehme ich nur gerade unter anderem wie ich Werte aus dem Datagrid verarbeiten und z.B in eine Textbox schreiben kann

habe mir das schon früher angeschaut mir fehlt nur die Verbindung zu each row

:unsure:

ist manchmal nicht einfach mit mir :giggle:
 

Spyke

Premium-User
so ungefähr

durchläuft die Zeilen und gibt den Wert der Spalte "MeineSpalte" aus.
Der Wert selbst wird als Object geliefert.
Deshalb, einmal Beispiel als string (ToString),
und bei den anderen beiden wird der Rückgabetyp geprüft ob dieser Integer oder DateTime ist und entsprechend drauf reagiert.
Visual Basic:
For Each Row As DataRow In dbdt.Rows

    Dim wert As Object = Row("MeineSpalte")

    Dim text As String = wert.ToString()
    ' irgendwas machen mit dem Text

    If TypeOf wert Is Integer Then
        Dim zahl As Integer = CInt(wert)
        ' irgendwas machen mit der Zahl
    End If


    If TypeOf wert Is DateTime Then
        Dim datum As DateTime = CType(wert, DateTime)
        ' irgendwas machen mit dem Datum
    End If

Next

kleiner Randtipp, solltest du mal nur C# Beispiele finden
mit Code Converter C# to VB and VB to C# – Telerik
kannst du C# Code in VB.Net konvertieren
 

werner_sg

Erfahrenes Mitglied
so ungefähr

durchläuft die Zeilen und gibt den Wert der Spalte "MeineSpalte" aus.
Der Wert selbst wird als Object geliefert.
Deshalb, einmal Beispiel als string (ToString),
und bei den anderen beiden wird der Rückgabetyp geprüft ob dieser Integer oder DateTime ist und entsprechend drauf reagiert.
Visual Basic:
For Each Row As DataRow In dbdt.Rows

    Dim wert As Object = Row("MeineSpalte")

    Dim text As String = wert.ToString()
    ' irgendwas machen mit dem Text

    If TypeOf wert Is Integer Then
        Dim zahl As Integer = CInt(wert)
        ' irgendwas machen mit der Zahl
    End If


    If TypeOf wert Is DateTime Then
        Dim datum As DateTime = CType(wert, DateTime)
        ' irgendwas machen mit dem Datum
    End If

Next

kleiner Randtipp, solltest du mal nur C# Beispiele finden
mit Code Converter C# to VB and VB to C# – Telerik
kannst du C# Code in VB.Net konvertieren
Dein Hinweis hat mir sehr geholfen an anderer Stelle einen Fehler zu beheben

aber bei der Anzeige in der PictureBox blicke ich noch nicht durch :(

Hier mal den Code habe ihn soweit wie Möglich Dokumentiert


If String.IsNullOrEmpty(TextBox1.Text) Then

' Variablen für die PictureBox.
Dim g As Graphics = e.Graphics

'der erste horizontale Abstand
Dim horizontal = 20

'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 Mietbegin ASC"

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

dbda.SelectCommand = dbcmd
dbda.Fill(dbdt)
bindingSourceVermietung1.DataSource = dbdt
DataGridView7.DataSource = bindingSourceVermietung1
dbda.Fill(ds, "tblreservierung")

Dim DbReader As OleDbDataReader
DbReader = dbcmd.ExecuteReader

While DbReader.Read

'Der Mietbegin
Dim Mietbegin = Me.DataGridView7.CurrentRow.Cells(4).Value 'Datum komplett

'Das Jahr zur Auswahl über eine TextBox
Dim JahrStart = Me.DataGridView7.CurrentRow.Cells(5).Value 'Jahr
Dim JahrStartD = Convert.ToDecimal(JahrStart) 'Jahr als Decimal

'Der Mietbegin Monat und Tag als Zahl 0518
Dim MonatStart = Me.DataGridView7.CurrentRow.Cells(6).Value 'Monat
Dim MonatStartD = Convert.ToDecimal(MonatStart) 'Monat als Decimal
Dim TagStart = Me.DataGridView7.CurrentRow.Cells(7).Value 'Tag
Dim TagStartD = Convert.ToDecimal(TagStart) 'Tag als Decimal

'Der Startpunkt
Dim StartDatum = ((((MonatStartD * 100) + TagStartD) + 200)) 'zusammengefasst als 0912 + 200 Abstand für die Fahrzeugnummer

'Die Mietdauer
Dim Mietdauer = Me.DataGridView7.CurrentRow.Cells(8).Value 'Mietdauer in Tagen
Dim MietdauerD = Convert.ToDecimal(Mietdauer) 'Mietdauer in Tagen als Decimal

'Das Mietende
Dim Mietende = Me.DataGridView7.CurrentRow.Cells(9).Value 'Datum komplett


Dim EndZeitpunkt = (StartDatum + (MietdauerD * 75)) 'zusammengefasst als 0912 * 75 um den Balken zu vergrößern

'Fahrzeugnummer
Dim Fahrzeug = Me.DataGridView7.CurrentRow.Cells(2).Value


Dim Zeitleiste As New List(Of String) ' Liste für die Zeiten
Dim ZeitIndex = 1 'Index für die Zeiten

'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

' Zeiten pro Fahrzeug

For Each Row As DataRow In dbdt.Rows

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

If Date.Compare(Zeit, Today) < 0 Then
Zeitleiste.Add(Row.Item("Mietbegin"))


End If

ZeitIndex += 1

'Umsatz Anzeige
TotalSales += Val(Row.Item("TOTAL"))
Next
Label15.Text = TotalSales

' Grafik Ausgabe in der PictureBox

If Not Zeitleiste.Count.Equals(0) Then

g.DrawString(Mietbegin + " / " + Mietende, fnt2, Brushes.Black, New Point(StartDatum, (horizontal - 20)))
g.DrawLine(New Pen(System.Drawing.Color.DarkRed, 10), StartDatum, horizontal, EndZeitpunkt, horizontal)
g.DrawString("FzgNr: " + Fahrzeug, fnt, Brushes.Black, New Point(2, (horizontal - 15)))

End If

End While



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