| |
VB.NET - FortgeschritteneStatistik in Chart Diagramm | | | Autor: ERBRU | Datum: 17.04.17 17:36 |
| Hallo zusammen,
möchte eine Statistik auf eine Form ausgeben in Label oder DGV und als Diagramm in einem Chart anzeigen
der Code dafür ist Verbesserungsfähig ich denke da wahrscheinlich zu kompliziert.
Frage: wie bekomme ich das dann in ein Chart-Balkendiagramm angezeigt.
hoffe das jemand eine Idee hat, und das hier verstanden hat.
es gibt erledigte und offene Meldungen in der Tabelle TPMMeldung
'--- Variabeln setzen
Dim Statusabgearbeitet As Double
Dim Statusnichtabgearbeitet As Double
Dim Wert1 As System.Data.EnumerableRowCollection(Of TPMMeldungRow)
Dim Wert2 As System.Data.EnumerableRowCollection(Of TPMMeldungRow)
'Wert1 ermitteln
Wert1 = From Reihe In Me.TPMDB.TPMMeldung
Where Reihe.RowState <> DataRowState.Deleted AndAlso _
Reihe.erledigt = True
Select Reihe
Dim anzahlWert1 As Integer = Wert1.Count
'Wert2 ermitteln
Wert2 = From Reihe In Me.TPMDB.TPMMeldung
Where Reihe.RowState <> DataRowState.Deleted AndAlso _
Reihe.erledigt = False
Select Reihe
Dim anzahlWert2 As Integer = Wert2.Count
Dim Gesamtwert As Integer = anzahlWert1 + anzahlWert2
'------ Prozent ausrechnen
Statusabgearbeitet = anzahlWert1 / Gesamtwert * 100
Statusnichtabgearbeitet = anzahlWert2 / Gesamtwert * 100
'------- Anzeigen in Label auf der Form
''Label215.Text = String.Format("{0:0.00} %", Statusabgearbeitet) & "" & _
"erl."
''Label216.Text = String.Format("{0:0.00} %", Statusnichtabgearbeitet) _
& " i.B."
''Label217.Text = Gesamtwert.ToString & " Meld." | |
Re: Statistik in Chart Diagramm | | | Autor: Manfred X | Datum: 17.04.17 18:59 |
| Hallo!
Du spaltest anscheinend die (nicht als gelöscht markierten) Zeilen
einer typisierten Datatable in zwei Enumerables auf - anhand der
boolschen Kriterium-Spalte "erledigt".
Du berechnest dann die relativen prozentualen Anteile
"erledigt : nicht erledigt".
Eine bessere Alternative wäre die Aggregierungsfunktion "Count".
Kleines Beispiel:
Dim x() As Double = {1.5, 2.3, 6.7, 8.4, 9.1}
Dim c As Integer = Aggregate vl In x Where vl > 6.7 Into Count() Und jetzt die Fragen:
Was für ein Chart-Typ? X-Achse? Y-Achse? Werte?
Was spricht gegen diese Anzeigen-Formatierung?
label215.Text = _
String.Format("{0:0.00} % erl.", statusabgearbeitet) | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 17.04.17 19:21 |
| Charttyp = StackedColumn
mir schwebt vor das pro Monat anzuzeigen Typ Stapel Diagramm (SeriesChartType.StackedColumn) ist wohl die Bezeichnung. Werte Anzahl erledigt und nicht erledigt pro Monat. Also Y-Achse monatlich | |
Re: Statistik in Chart Diagramm | | | Autor: Manfred X | Datum: 17.04.17 22:39 |
| Hallo!
Irgend so etwas .....
Aus Demodaten wird eine Häufigkeitstabelle (Monate) erstellt.
Die Spalten der Tabelle (done, todo) werden als Datenserien
für den Chart verwendet (Datenbindung).
Imports System.Windows.Forms.DataVisualization.Charting
Public Class frmMonthChart
Dim dt As New DataTable
Dim cht As New Chart With _
{.Parent = Me, .Size = New Size(500, 500)}
Private Sub frmMonthChart_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
Me.Size = New Size(520, 560)
'Demo-Datensätze erzeugen
With dt.Columns
.Add("Date", GetType(Date))
.Add("done", GetType(Boolean))
End With
Dim dx As Date, erl As Boolean
Dim rndm As New Random(4321)
For i As Integer = 1 To 1000
With rndm
dx = _
New Date(.Next(2015, 2018), .Next(1, 13), .Next(1, 29))
End With
erl = (i Mod 2 = 0)
dt.Rows.Add({dx, erl})
Next i
'Häufigkeitstabelle aus Demo-Datensätzen erstellen
Dim dc As New DataTable
With dc.Columns
.Add("Month", GetType(String))
.Add("Freq. done", GetType(Integer))
.Add("Freq. todo", GetType(Integer))
End With
dc.PrimaryKey = {dc.Columns("Month")}
For i As Integer = 0 To dt.Rows.Count - 1
Dim dr As DataRow = dt.Rows(i)
'sortierbarer Jahr-Monat-String
Dim ym As String = _
dr.Field(Of Date)("Date").Year.ToString & "-" & _
dr.Field(Of Date)("Date").Month.ToString("00")
Dim el As Boolean = dr.Field(Of Boolean)("done")
'Datensatzsuche nach Monat in Häufigkeitstabelle
'gemäß Primärschlüssel
Dim dcr As DataRow = dc.Rows.Find({ym})
If dcr Is Nothing Then
dcr = dc.Rows.Add({ym, 0, 0})
End If
Dim fcol As String
If el Then
fcol = dc.Columns(1).ColumnName
Else
fcol = dc.Columns(2).ColumnName
End If
'Häufigkeit bestimmen
dcr(fcol) = CInt(dcr(fcol)) + 1
Next i
Dim bs As New BindingSource With {.DataSource = dc}
bs.Sort = "Month ASC"
'Chart für Häufigkeiten erstellen
With cht
.DataSource = bs
.ChartAreas.Add("Base")
With .ChartAreas("Base").AxisX
.LabelStyle.Angle = 45
.MajorTickMark.Interval = 1
.LabelStyle.Interval = 3
End With
.Series.Add("Month-done")
With .Series("Month-done")
.XValueMember = "Month"
.YValueMembers = dc.Columns(1).ColumnName
.ChartType = SeriesChartType.StackedColumn
.ChartArea = "Base"
End With
.Series.Add("Month-todo")
With .Series("Month-todo")
.XValueMember = "Month"
.ChartType = SeriesChartType.StackedColumn
.YValueMembers = dc.Columns(2).ColumnName
.ChartArea = "Base"
End With
End With
End Sub
End Class
Beitrag wurde zuletzt am 17.04.17 um 22:54:36 editiert. | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 18.04.17 06:28 |
| Manfred X,
das sieht ja schon mal Gut aus werde ich mal in meinem projekt versuchen umzusetzen.
melde mich noch mal.
Danke! | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 18.04.17 11:15 |
| OK Manfred X,
habe das mit den Pseudo Daten nachbauen können, aber in meinem Projekt konnte ich es nicht nachbauen.
haste noch eine Idee für mich? | |
Re: Statistik in Chart Diagramm | | | Autor: Manfred X | Datum: 18.04.17 12:16 |
| 1. Der Beispiel-Code kann in ein leeres Win.Forms.Formular kopiert und
auf Basis der Demo-Daten direkt übersetzt und ausgeführt werden.
Das Projekt muß den Verweis auf Datavisualization.Charting besitzen.
2. Um den Code in Dein Projekt einzubauen muß vermutlich beim Erstellen der
Häufigkeitstabelle nur der Zugriff auf die untypisierte Datatable "dt" durch
Deine typisierte DataTable ersetzt werden.
Des weiteren sind die Namen der Date- und Bool-Spalte (Date, Done) durch
die entsprechenden Spaltennamen bzw. Zeilen-Properties Deiner Table auszutauschen.
Deine Angaben sind allerdings absolut unzureichend (Objekt-Deklarationen, Spalten-Typen,
SQL-Abfragen, Gibt es Nullwerte in den Feldern? usw.)
3. Dieses Forum dient nicht der Lieferung von "Ideen", sondern dem Austausch
zu konkreten Themen bzw. Fragen.
4. Dieses Fortgeschrittenen-Forum ist gedacht für Nutzer, die bereits programmieren
können (Spezialthemen). | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 18.04.17 13:39 |
| Du hast natürlich Recht, weiß derzeit auch nicht voran es scheitert
meine Datentabelle heißt:
TPMMeldung mit den Feldern:
- ID = Typ: Autowert
- Erstelldatum = Typ: Date (Nullwerte nicht möglich)
- Auftragstyp = Typ: String
- Meldung = Typ: String (MEMO)
- TPMKarte = Typ: String
- Anlage = Typ: String
- Arbeitsfolge = Typ: String
- Standort = Typ: String
- gemeldetvon = Typ: String
- abgestellt = Typ: Date/Time
- erledigt = Typ: boolspalte (Done)
hilft mir das weiter?
meine Bindingsource typisiert heißt BS_TPMMeldung | |
Re: Statistik in Chart Diagramm | | | Autor: Manfred X | Datum: 18.04.17 14:04 |
| Falls es sich bei TPMMeldung um eine typisierte Datatable handelt:
Dim dt as Datatable = TPMMeldung 'sollte eine Tabellen-Referenz übergeben
Und nun noch im Code (Füllen der Häufigkeitstabelle) an die Stelle des
Columnbezeichners "Date" "Erstelldatum" und an die Stelle von
"Done" "erledigt" schreiben.
Der Code für die Erzeugung der Demodaten ist natürlich zu entfernen. | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 18.04.17 15:44 |
| Super Danke Manfred X,
jetzt habe ich es schon besser verstanden:
nun wäre es schön das nur für das aktuelle Jahr zu machen bzw. aus einer ComboBox ein Jahr auszuwählen sonst wird es mit der Zeit unübersichtlich auf dem Schirm bzw. in der Form.
aber sonst sieht es Gut aus es funzt
Dim dt As DataTable = TPMDB.TPMMeldung
'Häufigkeitstabelle aus Datensätzen erstellen
Dim dc As New DataTable
With dc.Columns
.Add("Month", GetType(String))
.Add("Freq. done", GetType(Integer))
.Add("Freq. todo", GetType(Integer))
End With
dc.PrimaryKey = {dc.Columns("Month")}
For i As Integer = 0 To dt.Rows.Count - 1
Dim dr As DataRow = dt.Rows(i)
'sortierbarer Jahr-Monat-String
Dim ym As String = _
dr.Field(Of Date)("Erstelldatum").Year.ToString & "-" & _
dr.Field(Of Date)("Erstelldatum").Month.ToString("00")
Dim el As Boolean = dr.Field(Of Boolean)("erledigt")
'Datensatzsuche nach Monat in Häufigkeitstabelle
'gemäß Primärschlüssel
Dim dcr As DataRow = dc.Rows.Find({ym})
If dcr Is Nothing Then
dcr = dc.Rows.Add({ym, 0, 0})
End If
Dim fcol As String
If el Then
fcol = dc.Columns(1).ColumnName
Else
fcol = dc.Columns(2).ColumnName
End If
'Häufigkeit bestimmen
dcr(fcol) = CInt(dcr(fcol)) + 1
Next i
Dim bs As New BindingSource With {.DataSource = dc}
bs.Sort = "Month ASC"
'Chart für Häufigkeiten erstellen
With Chart
.DataSource = bs
.ChartAreas.Add("Base")
With .ChartAreas("Base").AxisX
.LabelStyle.Angle = 45
.MajorTickMark.Interval = 1
.LabelStyle.Interval = 1
End With
.Series.Add("Month-done")
With .Series("Month-done")
.XValueMember = "Month"
.YValueMembers = dc.Columns(1).ColumnName
.ChartType = SeriesChartType.StackedColumn
.ChartArea = "Base"
End With
.Series.Add("Month-todo")
With .Series("Month-todo")
.XValueMember = "Month"
.ChartType = SeriesChartType.StackedColumn
.YValueMembers = dc.Columns(2).ColumnName
.ChartArea = "Base"
End With
End With | |
Re: Statistik in Chart Diagramm | | | Autor: Manfred X | Datum: 18.04.17 16:07 |
| Das ist durch den Einbau einer IF-Bedingung beim Aufbau der
Häufigkeitstabelle zu realisieren.
Sei "cboYear" die Combobox mit den in der Tabelle verfügbaren Jahren:
Dim year_selected As Integer = CInt(cboyear.SelectedItem)
Und in der dtr.Rows-Schleife hinter dieser Codezeile
Dim dr As DataRow = dt.Rows(i)
für den gesamten Schleifenblock die Auswahl-Bedingung der Datensätze:
If DirectCast(dr(ColumnIndex_Date), Date).Year = Year_Selected Then
'.....
End IF
Das Casten des Wertes ist erforderlich, weil die Datatable "dt" nicht typisiert ist.
Im weiteren könnte man aus dem Code eine Routine entwickeln, die für beliebige
Datatables mit Date und Bool-Spalte funktioniert.
Zu beachten wäre noch die Behandlung von fehlenden Werten (DBNull.Values)
und die Darstellung von Monaten im Chart, in denen keine Datensätze erstellt worden
sind.
Beitrag wurde zuletzt am 18.04.17 um 16:19:20 editiert. | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 18.04.17 18:34 |
| was soll ich sagen, bin begeistert es funktioniert.
Danke dir! | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 20.04.17 18:36 |
| Nun da das so schön geklappt hat, und ich etwas "Abfrageprobleme" habe. Brauche ich euch noch mal
ich habe diese typisierte Datatable / 'Stoerungen'
Feldnamen Typ
ID = Autowert
Eintrag = Datum/Date 'Dateneintrag am
gemeldetvon = String
Schichtart = String
Schichttyp = String
OrtderStörung = String
Station = String
ArtderStörung = String
Stoerdauer = Integer (Minuten)
Beschreibung = String
IHanwesend = Boolean /Ja-Nein
BeginnderStörung = Datum/Uhrzeit/DateTime
EndederBehebung = Datum / Uhrzeit
StoerungsartID = Fremdschlüssel > Tabelle Stoerungsart
BenutzerID = Fremdschlüssel > Tabelle Benutzer
MaschinenID = Fremdschlüssel > Tabelle Maschinen
TaktID = Fremdschlüssel > Tabelle Takte
da möchte ich eine Auswertung fahren:
1. Wochen-/Monatsauswertung ArtderStörung gruppiert nach Maschinen (Häufigkeit,Stördauer als Pareto)
ArtderStörung = typisierte Datatable Stoerungsart
Logistik
Mechanik
Elektrik
Qualität
EDV
SPS
EC-Schrauber
Roboter
Pneumatik-Hydraulik
nicht zugeordnet
die Stoerungsart kann in der Stoerungs Angabe 0 - mehrmals vorkommen pro Maschine
hoffe ihr versteht was ich meine, stelle auch meinen bisherigen Code ein nur ist er ziemlich unübersichtlich | |
Re: Statistik in Chart Diagramm | | | Autor: Manfred X | Datum: 20.04.17 19:35 |
| Hallo!
Erstelle ein neues Thema und stelle konkrete Fragen.
Welche Probleme? Umgang mit DataRelation? Zeichnen eines Pareto-Charts? | |
Re: Statistik in Chart Diagramm | | | Autor: ERBRU | Datum: 21.04.17 06:03 |
| OK mache ich Manfred X | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere InfosTipp des Monats März 2024 Dieter OtterUTF-8 Konvertierung von Dateien und StringsVB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|