Balken Diagramm erstellen aus SQL DB

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

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

    Balken Diagramm erstellen aus SQL DB

    Hallo liebes Forum

    Ich bin gerade am erstellen einer FORM - Diagramm und versuche ein Balken Diagramm darin zu erstellen.

    Da ich kein Profi bin hänge ich an einem Punkt wo ich nicht mehr weiter komme und hoffe das mir jemand von den Profis hier Tipps geben können.

    Was ich bisher habe:

    Eine FORM in der ein CHART erstellt wird. Leider gib es hier nicht das aus, was ich mir vorstelle.

    Ich bekommen es leider nicht her, dass das Diagramm so dargestellt wird wie ich es von Hand gezeichnet habe. (siehe Anhang)

    Programmtechnisch das darzustellen wird die nächste Herausvorderung sein.

    Kann mir dabei jemand weiter helfen?

    Besten Dank

    Gruß Gebhard

    *Topic verschoben*
    Bilder
    • Tanken 2020.jpg

      412,58 kB, 3.506×2.479, 119 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo ErfinderDesRades

    Danke für den Tipp!

    Lt. Tutorial bin ich weiter gekommen was das erstellen des CHARTS betrifft.

    Leider hänge ich jetzt beim Programmieren der Anzeige. Es wird der Fehler angezeit, das die ´column´ datum nicht gefunden wird obwohl diese in der tbl Existiert.

    Habe ich mich vertan?

    Gruß Gebhard
    Bilder
    • datum-1.jpg

      303,96 kB, 1.866×1.374, 109 mal angesehen
    • datum-2.jpg

      161,89 kB, 2.076×1.134, 113 mal angesehen
    Tja, das ist ja genau nicht, wie ich im Tutorial vormache, aber musst du wissen.
    Dein Prob hat auch nix mit Chart zu tun, sondern ist ein Problem deines Datenabrufs.

    Ich würde ja unbedingt mit einem MySqlDataAdapter mir eine DataTable befüllen - der kümmert sich darum, dass die Spalten die richtigen Namen haben.
    Wenn du dir gar ein typisiertes Dataset gönnst, könntest du sogar mit einem datengebundenem ChartControl arbeiten - halt wie im Tut gezeigt..
    Guten Morgen ErfinderDesRades

    Hmm.... leider kann ich hier nicht mithalten.

    Ist für mich als Hobby VN.NETer zu unverständlich/kompliziert was der genaue unterschied zwischen MySqlDataReader und MySqlDataAdapter ist,
    und wie hier die vorgehensweise wäre um ein CHART als Balkendiagramm aus den Daten (phpMyAdmin) richtig anzeigen zu lassen.

    Nur so als Beispiel: Mit diesem Code wird ein Balkendiagramm erstellt sieht aber nicht so aus wie gewünscht. :(

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class FormDiagramRefuel
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles LOAD_CHART.Click
    4. Dim READER As MySqlDataReader
    5. Dim Query As String
    6. Query = "SELECT liter, gefahren FROM carmanager.tbl_tanken ORDER BY `carmanager`.`tbl_tanken`.`datum`;"
    7. Dim Command = New MySqlCommand(Query, con)
    8. READER = Command.ExecuteReader
    9. While READER.Read
    10. Chart1.Series("Liter pro Monat").Points.AddXY(READER.GetDecimal("liter"), READER.GetDecimal("gefahren"))
    11. End While
    12. End Sub


    Aber Danke für Deinen Tipp und die schnelle Antwort.

    Gruß Gebhard
    Bilder
    • Chart.jpg

      248,24 kB, 1.817×1.050, 104 mal angesehen
    Hallo ErfinderDesRades

    Ah, ich verstehe. Hier sollte anstatt Query = "SELECT liter, gefahren Query = "SELECT liter, datum stehen.

    Ist das richtig?

    Das ändere ich gleich nach dem ich wieder zuhause bin.

    Da habe ich gleich noch eine Frage:

    Ist es möglich aus einer Reihe von Datumseinträgen das so gestallten, dass das Programm erkennt wieviele Einträge z.b. der Jänner, Februar, usw. hat und das zusammenfast?

    Also z.b.:

    01.01.2020 wurden 51,34 Liter getankt
    18.01.2020 wurden 48,52 Liter getankt
    30.01.2020 wurden 49,21 Liter getankt
    13.02.2020 wurden 47,33 Liter getankt
    28.02.2020 wurden 50,44 Liter getankt usw.

    Und jetzt kann ich für den Jänner gesamt 149,07 Liter ausgeben.

    Hoffe ich habe das richtig erklärt. Ich möchte aus einem ganzen Jahr die einzelenen Monate sepparieren. ORDER BY DATE? Funktioniert das so einfach? ;)

    Danke für den Hinweis.

    Gruß Gebhard
    Guten Morgen ErfinderDesRades

    Ich glaub ich hab den Fehler gefunden in post#3:
    Im Select-Abschnitt der Query ist 'datum' nicht aufgeführt - daher gibts diese Spalte im Reader nicht.


    Danke für deine Hilfe. Durch das ändern wird das "richtige" angezeigt. Richtig im Sinne von Liter VS Datum.

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class FormDiagramRefuel
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles LOAD_CHART.Click
    4. Dim READER As MySqlDataReader
    5. Dim Query As String
    6. Query = "SELECT liter, datum FROM carmanager.tbl_tanken ORDER BY `carmanager`.`tbl_tanken`.`datum`;"
    7. Dim Command = New MySqlCommand(Query, con)
    8. READER = Command.ExecuteReader
    9. While READER.Read
    10. Chart1.Series("Liter pro Monat").Points.AddXY(READER.GetDecimal("liter"), READER.GetDateTime("datum"))
    11. End While
    12. End Sub


    Jetzt gilt es noch das mit "GROUP BY" einzubauen. Habe auch schon Beispiele im Netz gefunden.
    Leider viele in C#.

    Ich bin da nicht so der Froind von, dieselben Daten mehrmals aus der DB zu holen.


    Was meinst Du damit?

    Gruß Gebhard
    wenn du mit Sql-GroupBy arbeiten willst, wird das eine weitere Abfrage an die Datenbank werden.
    Wenn du dich in Richtung post#4 entwickelst ist das nicht nötig.
    Die Daten wären da nach dem ersten Abruf in einer typisierten DataTable gespeichert, und eine solche kann man mit vb.net-Mitteln gruppieren, ohne irgendwas erneut abrufen zu müssen.
    Und an die typDataTable würde man auch das Chart binden - son Point-Geklöppel wäre nicht nötig.
    Und an die typDataTable würde man auch Datagridviews binden, Comboboxen, DetailViews...
    Und man kann filtern, sortieren und auch Änderungen vornehmen und rückspeichern etc.

    Also eine Datenverarbeitung kann Daten eigentlich erst richtig verarbeiten, wenn sie die Daten in typDataTables lädt und vorhält.
    Aber das ist dir zu unverständlich/kompliziert, da wirst du wohl was anderes zusammenzufrickeln versuchen.
    Wenn deine Anforderungen an die Anwendung ohne eigentliche Datenverarbeitung auskommen mag das hingehen.

    Wenn du aber auch nur bischen mehr willst, machst du dir sehr viel unnütze Arbeit, indem du letztendlich selbstgebastelt nachprogrammierst, was es bereits in viel besserer Form schon lange gibt.
    Also krass formuliert: viel mehr Arbeit, schlechteres Ergebnis und nix dabei gelernt.
    Ach - und kaum jemand wird helfen (können), weil nur du wirst dich mit dem selbstgebastelten Kram auskennen. Stattdessen wirst du immer Empfehlungen bekommen, doch einfach den Stand der Technik zu benutzen.

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

    Hallo ErfinderDesRades

    Danke nochmals für Deinen Beitrag und auch für die Empfehlung.
    Aber nochmals von vorne anzufangen geht nicht. ;-). Nicht weil ich keine Lust habe, sondern weil wahrscheinlich wieder das gleiche herauskommen würde ;)
    Nichts für ungut.....

    Nur so zur Info an alle "Bastler" ;)

    Mit diesem sql-Code kann man die gesamt Summme (Liter) aus einem Jahr (2020) von mehreren Monaten bilden. Siehe Anhang falls nichtverständlich erklärt ;)

    SQL-Abfrage

    1. SELECT SUM(`carmanager`.`tbl_tanken`.`liter`) AS litergesamt FROM `carmanager`.`tbl_tanken` WHERE DATE_FORMAT(`carmanager`.`tbl_tanken`.`datum`, '%Y') = 2020 GROUP BY DATE_FORMAT(`carmanager`.`tbl_tanken`.`datum`, '%m')


    Jetzt noch das ganze in einem Balkendiagram darstellen.

    Gruß und Danke Gebhard
    Bilder
    • Bild1.jpg

      229,53 kB, 2.376×750, 77 mal angesehen
    • Bild2.jpg

      222,31 kB, 2.568×672, 83 mal angesehen
    es fehlt eine 'Where' in deiner SQL-Anweisung um je Monat anzuzeigen

    hab's mal probiert in Access

    VB.NET-Quellcode

    1. Imports System.Data.OleDb
    2. Imports System.Windows.Forms.DataVisualization.Charting
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Dim ds As New DataSet
    6. Dim da As OleDb.OleDbDataAdapter
    7. Dim Path As String = "E:\Adressen.mdb"
    8. Dim dbProvider As String = "PROVIDER=Microsoft.Jet.OLEDB.4.0;"
    9. Dim dbSource As String = " Data Source = " & Path
    10. Dim table As String = "ChartTanken"
    11. Dim sSql As String = "SELECT Format([TankDatum],'yyyy') AS [in Jahr], "
    12. sSql += "Sum(tbl_Tanken.GetankteLiter) AS Total, "
    13. sSql += "Format([TankDatum],'mmm') AS [in Monat] "
    14. sSql += "FROM(tbl_Tanken) "
    15. sSql += "WHERE (((Format([TankDatum],'mmm')) In ('Jan','Feb','Mrz','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez')))"
    16. sSql += "GROUP BY Format([TankDatum],'yyyy'), Format([TankDatum],'mmm'),Month([TankDatum])"
    17. sSql += "HAVING (((Format([TankDatum],'yyyy'))=" & TextBox1.Text & "))"
    18. sSql += " ORDER BY Month([TankDatum]);"
    19. Dim con As OleDb.OleDbConnection = New OleDb.OleDbConnection
    20. con.ConnectionString = dbProvider & dbSource
    21. da = New OleDb.OleDbDataAdapter(sSql, con)
    22. ds.Clear()
    23. con.Open()
    24. da.Fill(ds, table)
    25. con.Close()
    26. Chart1.Series.Add("Getankt")
    27. Chart1.DataSource = ds.Tables(table)
    28. Chart1.Series("Getankt").XValueMember = "in Monat"
    29. Chart1.Series("Getankt").YValueMembers = "Total"
    30. Chart1.Series("Getankt").Color = Color.Indigo
    31. Chart1.Series(1).IsValueShownAsLabel = True
    32. With Chart1.ChartAreas(0)
    33. Chart1.Series("Getankt").ChartType = DataVisualization.Charting.SeriesChartType.Column
    34. Chart1.Series("Getankt").Font = New System.Drawing.Font("Tahoma", 11.25F, System.Drawing.FontStyle.Bold)
    35. Chart1.Series(1).SmartLabelStyle.Enabled = False
    36. Chart1.Series(1).LabelAngle = -48
    37. .AxisY.Interval = 10
    38. .AxisX.LabelStyle.Angle = -90
    39. .AxisX.Title = "Monat"
    40. .AxisY.Title = "Liter"
    41. .BackColor = Color.FloralWhite
    42. .BackSecondaryColor = Color.Wheat
    43. .BackGradientStyle = GradientStyle.HorizontalCenter
    44. End With
    45. End Sub
    46. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    47. TextBox1.Text = 2020
    48. End Sub
    49. End Class


    die Access Tabelle besteht aus nur 3 Felder



    Chart sieht dann so aus




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