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:
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
- Imports System.Windows.Forms.DataVisualization.Charting
- Imports System.Data
- Imports System.Data.OleDb
- Imports System.Data.DataTable
- Public Class Form1
- Dim con As New OleDb.OleDbConnection
- Dim cmd As New OleDb.OleDbCommand
- Dim adapter As New OleDb.OleDbDataAdapter
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""C:\Users\Shelby\Desktop\BAQ2.mdb"""
- Try
- con.Open()
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- cmd.Connection = con
- Dim dt As DataTable = New DataTable
- Dim i As Integer
- Dim j As Integer
- '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
- Dim Month(11) As String
- Month(0) = "01"
- Month(1) = "02"
- Month(2) = "03"
- Month(3) = "04"
- Month(4) = "05"
- Month(5) = "06"
- Month(6) = "07"
- Month(7) = "08"
- Month(8) = "09"
- Month(9) = "10"
- Month(10) = "11"
- Month(11) = "12"
- Dim Day(30) As String
- Day(0) = "01"
- Day(1) = "02"
- Day(2) = "03"
- Day(3) = "04"
- Day(4) = "05"
- Day(5) = "06"
- Day(6) = "07"
- Day(7) = "08"
- Day(8) = "09"
- Day(9) = "10"
- Day(10) = "11"
- Day(11) = "12"
- Day(12) = "13"
- Day(13) = "14"
- Day(14) = "15"
- Day(15) = "16"
- Day(16) = "17"
- Day(17) = "18"
- Day(18) = "19"
- Day(19) = "20"
- Day(20) = "21"
- Day(21) = "22"
- Day(22) = "23"
- Day(23) = "24"
- Day(24) = "25"
- Day(25) = "26"
- Day(26) = "27"
- Day(27) = "28"
- Day(28) = "29"
- Day(29) = "30"
- Day(30) = "31"
- Dim Year As String
- Year = ComboBox1.Text
- 'neue Spalte (3te Spalte) hinzufügen, für Tage von 01.01. bis 31.12.
- Dim Column As New DataColumn
- Column.ColumnName = "Tag"
- dt.Columns.Add(Column)
- 'dieser kommentar ist eine Vermutung, dass ich auch zu meiner Lösung einfach den DatenTyp der hinzugefügten Spalte auf DateTime ändere
- 'dt.Columns("Tag").DataType = System.Type.GetType("System.DateTime")
- Dim zahl As Integer = 0
- '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
- 'besseres ein
- For i = 0 To 11 Step 1
- For j = 0 To 30 Step 1
- '#####mein Select-Befehl, zählt die Logins und User an einem Tag.########
- 'musste ich auskommentieren, weils sonst alle weiteren kommentare zerhaut.
- '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 & "')"
- '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
- '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#)"
- 'befüllen der DataTable
- adapter.SelectCommand = cmd
- adapter.Fill(dt)
- '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
- dt.Rows(zahl).BeginEdit()
- dt.Rows(zahl)(0) = CStr(Day(j) & "." & Month(i) & "." & Year).ToString
- 'dt.Rows(zahl)(0) = CDate(Day(j) & "." & Month(i) & "." & Year).Date
- dt.Rows(zahl).EndEdit()
- 'nächste Reihe
- zahl = zahl + 1
- Next j
- Next i
- 'Ausgabe in einer DataGrid, ist notwendig, habe ich nur für mich gemacht
- DataGridView1.DataSource = dt
- Dim zahl_chart As Integer = 0
- Dim yValueU As Double = 0
- Dim yValueL As Double = 0
- Chart1.Series.Clear()
- Chart1.Series.Add(0)
- Chart1.Series.Add(1)
- Dim row As DataRow
- For Each row In dt.Rows
- yValueU = dt.Rows(zahl_chart)(1)
- yValueL = dt.Rows(zahl_chart)(2)
- Dim x As String = dt.Rows(zahl_chart)(0)
- Chart1.Series(0).Points.AddXY(x.ToString(), yValueU)
- Chart1.Series(1).Points.AddXY(x.ToString(), yValueL)
- 'nächste Spalte
- zahl_chart = zahl_chart + 1
- Next
- '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
- '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
- '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.
- Chart1.ChartAreas(0).AxisX.Interval = 31
- 'folgende zwei auskommentierte zeilen beziehen sich auf meine vermutung, dass das die Lösung für die beschriftung der x-Achse ist
- 'Chart1.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Months
- 'Chart1.Chart1.ChartAreas("Area1").AxisX.Minimum = CDate("").ToOADate
- Chart1.Series(0).Name = "Anzahl der Users"
- Chart1.Series(0).ChartType = SeriesChartType.FastLine
- Chart1.Series(1).Name = "Anzahl der Logins"
- Chart1.Series(1).ChartType = SeriesChartType.FastLine
- con.Close()
- End Sub
- End Class
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „shelby89“ ()