Chart Control x-Achse Beschriftung und DataTable Spalte hochzählen von 01.01.2010 bis 31.12.2010 = DateTime

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von shelby89.

    Chart Control x-Achse Beschriftung und DataTable Spalte hochzählen von 01.01.2010 bis 31.12.2010 = DateTime

    Servus,

    erst einmal einen schönen Abend zusammen.
    Bitte nicht gleich vom Text erschlagen, das Fettgedruckte beschreibt meine Probleme auch gleich :)
    Ich habe zwei dicke, für manche warscheinlich eher kleine, Probleme mit meiner DataTable und meinem Liniendiagramm.

    Ich habe durch ein Select Befehl eine DataTable mit folgenden 3 Spalten.
    Tag(vom Typ String) | maxUsers (vom Typ Zahl) | maxLogins (vom Typ Zahl).

    Bsp:
    01.01.2010 | 45 | 90
    02.02.2010 | 30 | 35

    Mein Vorhaben: Ich möchte eine DataTable, die mir "jeden Tag" zurück gibt mit der maximalen Anzahl von Usern und Logins
    Also von 01.01.20xx bis 31.12.20xx

    Ich beziehe meine Daten aus einer Datenbank. Wenn die Datenbank beispielsweise keinen Eintrag für den 03.05.2010 enthält, so soll meine DataTable einfach der Tag mit den Werten "0" in maxUsers und maxLogins enthalten also
    03.05.2010 | 0 | 0

    Da ich so ziemlich ein Anfänger in vb und Programmieren bin, hab ich einfach zwei for schleifen benutzt (für 31 Tage und 12 Monate). Da beispielsweise der Februar keine 31 Tage hat und alle 4 Jahre ein Schaltjahr ist, ist diese Lösung natürlich richtig daneben.
    Zudem habe ich die Spalte "Tag" zu meiner DataTable hinzugefügt und nicht den Typ geändert.
    Das wäre mein erstes Problem. Wie kann ich die Tage hochzählen lassen vom 01.01.2010 bis 31.12.2010, sodass er im Januar bis 31. hochzählt, im Februar bis 28./29., im März bis 30. usw. (er soll das automatisch erkennen. Ich vermute ich beziehe diese Daten aus DateTime, wie ich das jedoch anstelle weiss ich nicht)

    mein zweites Problem ist, dass ich aus der Datatable dann ein Liniendiagramm von ChartControl erstellen lasse.
    meine Schnittpunkte sind die MaxUsers und MaxLogins Werte (x2 Series).
    Das ChartTable soll dann in 12 Intervalle aufgeteillt werden, sodass meine x-Achsen Beschriftung von Januar bis Dezember ist.
    Dabei soll immer am 01. die Beschiftung kommen, also bsp. "Januar" statt 01.01.2010 (wie in diesem Beispiel: http://lh4.ggpht.com/_92rQgh_pj0c/S6NFS9MJs2I/AAAAAAAAADk/ez6Sq4l4ouk/image_thumb16.png)
    Januar soll bei y = 0, x = 0 beginnen.

    Hier mein ganzer Quellcode. Habs ein bissl versucht übersichtlich zu machen.
    Ich weiss meine Programmierstil ist nicht sauber. ich bin in dem Bereich ein Anfänger. Ich möchte auch keine klassenobjektorientierte Lösung haben.

    Ich freue mich auf Lösungsvorschläge und evntl sogar neuen QuellCode.

    Anbei mein QuellCode:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms.DataVisualization.Charting
    2. Imports System.Data
    3. Imports System.Data.OleDb
    4. Imports System.Data.DataTable
    5. Public Class Form1
    6. Dim con As New OleDb.OleDbConnection
    7. Dim cmd As New OleDb.OleDbCommand
    8. Dim adapter As New OleDb.OleDbDataAdapter
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\Users\Shelby\Desktop\BAQ2.mdb"""
    11. Try
    12. con.Open()
    13. Catch ex As Exception
    14. MessageBox.Show(ex.Message)
    15. End Try
    16. cmd.Connection = con
    17. Dim dt As DataTable = New DataTable
    18. Dim i As Integer
    19. Dim j As Integer
    20. 'meine Arrays für Monate und Tage. Sehr unsaubere Lösung. Ich hab schon gelsen dass ich die Tage einfach aus DateTime beziehe, somit weiss das System auch, dass der Februar 2010 beispielsweise nur 28 Tage hat, oder der April, Juni, September, November nur 30 Tage
    21. Dim Month(11) As String
    22. Month(0) = "01"
    23. Month(1) = "02"
    24. Month(2) = "03"
    25. Month(3) = "04"
    26. Month(4) = "05"
    27. Month(5) = "06"
    28. Month(6) = "07"
    29. Month(7) = "08"
    30. Month(8) = "09"
    31. Month(9) = "10"
    32. Month(10) = "11"
    33. Month(11) = "12"
    34. Dim Day(30) As String
    35. Day(0) = "01"
    36. Day(1) = "02"
    37. Day(2) = "03"
    38. Day(3) = "04"
    39. Day(4) = "05"
    40. Day(5) = "06"
    41. Day(6) = "07"
    42. Day(7) = "08"
    43. Day(8) = "09"
    44. Day(9) = "10"
    45. Day(10) = "11"
    46. Day(11) = "12"
    47. Day(12) = "13"
    48. Day(13) = "14"
    49. Day(14) = "15"
    50. Day(15) = "16"
    51. Day(16) = "17"
    52. Day(17) = "18"
    53. Day(18) = "19"
    54. Day(19) = "20"
    55. Day(20) = "21"
    56. Day(21) = "22"
    57. Day(22) = "23"
    58. Day(23) = "24"
    59. Day(24) = "25"
    60. Day(25) = "26"
    61. Day(26) = "27"
    62. Day(27) = "28"
    63. Day(28) = "29"
    64. Day(29) = "30"
    65. Day(30) = "31"
    66. Dim Year As String
    67. Year = ComboBox1.Text
    68. 'neue Spalte (3te Spalte) hinzufügen, für Tage von 01.01. bis 31.12.
    69. Dim Column As New DataColumn
    70. Column.ColumnName = "Tag"
    71. dt.Columns.Add(Column)
    72. 'dieser kommentar ist eine Vermutung, dass ich auch zu meiner Lösung einfach den DatenTyp der hinzugefügten Spalte auf DateTime ändere
    73. 'dt.Columns("Tag").DataType = System.Type.GetType("System.DateTime")
    74. Dim zahl As Integer = 0
    75. 'For-Schleifen, die einmal bis 12 hochzählt für die Monate, und einmal bis 31 hochzählt für die Tage. DIese Variante ist totaller Müll, aber mir fällt nichts
    76. 'besseres ein
    77. For i = 0 To 11 Step 1
    78. For j = 0 To 30 Step 1
    79. '#####mein Select-Befehl, zählt die Logins und User an einem Tag.########
    80. 'musste ich auskommentieren, weils sonst alle weiteren kommentare zerhaut.
    81. 'cmd.CommandText = "SELECT SUM(t1) AS maxUsers, SUM(t2) As maxLogins FROM (SELECT COUNT([user]) As t1, SUM(0) As t2 FROM Test WHERE [von] LIKE '" & Day(j).ToString & "." & Month(i).ToString & "." & Year & "' UNION SELECT SUM(0) As t1, COUNT([von]) As t2 FROM Test WHERE [von] LIKE '" & Day(j).ToString & "." & Month(i).ToString & "." & Year & "')"
    82. 'Das is auch eine Vermutung, wie ich das auch machen kann, aber das funktioniert nicht. ICh habe in meiner Datenbank auch nicht für jeden Tag ein eintrag. Zudem ist das momentan eine Access, wird später aber in eine Oracle immigriert. Lösungsvorschlag sollte möglichst Plattform unabhängig sein
    83. 'cmd.CommandText = "SELECT SUM(t1) AS maxUsers, SUM(t2) As maxLogins FROM (SELECT Count([user]) As t1, SUM(0) As t2 FROM Test WHERE [von] Between #01.01.2010# And #31.12.2010# UNION SELECT SUM(0) As t1, COUNT([von]) As t2 FROM Test WHERE [von] Between #01.01.2010# AND #31.12.2010#)"
    84. 'befüllen der DataTable
    85. adapter.SelectCommand = cmd
    86. adapter.Fill(dt)
    87. 'hier soll meine erstellte Spalte hinterher mit den Tagen befüllt werden von 01.01.2010 bis 31.12.2010, passend zu den maxUsers/maxxLogins-Werten
    88. dt.Rows(zahl).BeginEdit()
    89. dt.Rows(zahl)(0) = CStr(Day(j) & "." & Month(i) & "." & Year).ToString
    90. 'dt.Rows(zahl)(0) = CDate(Day(j) & "." & Month(i) & "." & Year).Date
    91. dt.Rows(zahl).EndEdit()
    92. 'nächste Reihe
    93. zahl = zahl + 1
    94. Next j
    95. Next i
    96. 'Ausgabe in einer DataGrid, ist notwendig, habe ich nur für mich gemacht
    97. DataGridView1.DataSource = dt
    98. Dim zahl_chart As Integer = 0
    99. Dim yValueU As Double = 0
    100. Dim yValueL As Double = 0
    101. Chart1.Series.Clear()
    102. Chart1.Series.Add(0)
    103. Chart1.Series.Add(1)
    104. Dim row As DataRow
    105. For Each row In dt.Rows
    106. yValueU = dt.Rows(zahl_chart)(1)
    107. yValueL = dt.Rows(zahl_chart)(2)
    108. Dim x As String = dt.Rows(zahl_chart)(0)
    109. Chart1.Series(0).Points.AddXY(x.ToString(), yValueU)
    110. Chart1.Series(1).Points.AddXY(x.ToString(), yValueL)
    111. 'nächste Spalte
    112. zahl_chart = zahl_chart + 1
    113. Next
    114. 'vom 01.01.2010 bis 31.12.2010 sind es nach dem Code 272 Tage, somit musste ich den Interval auf 31 setzen, dass er mir 12 Bereiche ausgibt
    115. 'Problem bei mir: die Bereiche teilen sich immer am 31., also 31.01, 31.02, 31.03 (so ist auch die Beschiftung der x-Achse, ich will Sie aber in
    116. 'Monaten also bei vom 01.01 bis 31.01 soll in der x-Achse "Januar" stehen, vom 01.02 - 28/29.02 soll "februar" stehen usw.
    117. Chart1.ChartAreas(0).AxisX.Interval = 31
    118. 'folgende zwei auskommentierte zeilen beziehen sich auf meine vermutung, dass das die Lösung für die beschriftung der x-Achse ist
    119. 'Chart1.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Months
    120. 'Chart1.Chart1.ChartAreas("Area1").AxisX.Minimum = CDate("").ToOADate
    121. Chart1.Series(0).Name = "Anzahl der Users"
    122. Chart1.Series(0).ChartType = SeriesChartType.FastLine
    123. Chart1.Series(1).Name = "Anzahl der Logins"
    124. Chart1.Series(1).ChartType = SeriesChartType.FastLine
    125. con.Close()
    126. End Sub
    127. End Class

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

    ah super danke, hat einwandfrei funktioniert...jetzt zählt er mir korrekt die tage hoch vom 01.01. bis 31.12.

    Jedoch komm ich mit meiner ChartControl nicht weiter.
    Wenn ich den IntervalTyp auf MOnth stell wird nur jeder 2te MOnat Als Datum wieder gegeben und dann auch nur immer der 02.

    also 02.01., 02.03.,02.05.,

    das sieht nicht gut aus. Ich möchte dass da für den 01.01.- 31.01. "January" steht, für den 01.02. - 28.02. "February", etc....

    gibt es auch hier eine möglichkeit?

    danke
    Gib Deinem Projekt doch bitte
    Option Strict On.
    Kannst Du mal bitte eine kleine Test-DB hochladen, um Dein Problem nachvollziehen zu können?
    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!
    Guten Abend,

    erstmal Danke.
    hm, Option Strict On sagt mir nichts, ich werde gleich mal dannach googlen und es meinem Projekt geben ;-).

    Hab eine Access 2003 Datenbank hochgeladen. Beinhaltet die Spalten "domain", "project", "user", "von" und "bis" ...passen also mit dem Quellcode überein.
    Hoffe das reicht als Beispiel.

    Wäre echt cool wenn man das so hinbekommt wie auf diesem Bild. Und der Januar eben auch ganz unten am Schnittpunkt (0|0) anfängt. In der Zwischenzeit werde ich mich auch mal im Netz dazu auseinander setzen. Muss ja irgendwo in irgendeinem Forum darüber stehen -.-.
    lh4.ggpht.com/_92rQgh_pj0c/S6N…q4l4ouk/image_thumb16.png


    Edit: mein neuer Quellcode lade ich auch nochmal als Text hoch. man muss nur den ConnectionString anpassen.

    WIndows-Form, Button1, DataGridView1, ComboBox1 und Chart1 sind ausreichend.

    Vielen Dank und einen schönen Sonntag
    Dateien
    • BAQ2.mdb

      (241,66 kB, 169 mal heruntergeladen, zuletzt: )
    • Quellcode.txt

      (3,03 kB, 257 mal heruntergeladen, zuletzt: )
    auweia.

    Kein Datenmodell, keine Typisierung, kein Databinding.

    Meine wesentliche Änderung besteht darin, dassich der X-Achse richtige Datumse andrehe, keine .ToString-Dinger.
    Und im Chart habe ich im Designer im chartArea - X-Achsis-LabelStyle-Format "MMM" eingestellt, sodaß vonne Datumse nur der Monat angezeigt wird, aber voll ausgeschrieben.

    Aber mehr machichda nich dran.
    Dateien
    • hoch00.zip

      (25,7 kB, 305 mal heruntergeladen, zuletzt: )

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