vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Statistik 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."
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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)
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Statistik in Chart Diagramm 
Autor: ERBRU
Datum: 18.04.17 18:34

was soll ich sagen, bin begeistert es funktioniert.

Danke dir!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Statistik in Chart Diagramm 
Autor: ERBRU
Datum: 21.04.17 06:03

OK mache ich Manfred X
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel