| |
VB.NET - FortgeschritteneMonatsdiagramm | | | Autor: ERBRU | Datum: 25.02.18 13:06 |
| sorry war in der falschen Rubrik
mit dieser Funktion werte ich Daten pro Woche aus, nun soll auch der Monat möglich sein?
die Funktion stammt ursprünglich von Manfred X
beim Monat habe ich fehlendes Wissen den richtig zu erwischen.
es wird zum Schluss auch ein Chart gezeichnet
Private Function GetFreq1(ByVal week As Integer, _
year As Integer) As DataTable
'Dim year As Integer = cbx_Jahr.SelectedValue
Dim dt As DataTable = ABLAGEPUAM.Vorgang
Dim cal As Globalization.Calendar = _
Globalization.CultureInfo.CurrentCulture.Calendar
Dim q = From row As DataRow In dt
Let wk As Integer = _
cal.GetWeekOfYear(row.Field(Of Date)("angelegtam"), _
Globalization.CalendarWeekRule.FirstFourDayWeek, _
DayOfWeek.Monday)
Where year = row.Field(Of Date)("angelegtam").Year _
AndAlso wk = week _
AndAlso row.Field(Of Integer)("IDAblage") = row.Field(Of _
Integer)("IDAblage")
Group By art = row.Field(Of String)("Ablagename") Into Count()
Dim df As New DataTable
df.Columns.Add("Ablagename") : df.Columns.Add("Count", GetType( _
Integer)) : df.Columns.Add("Cum", GetType(Double)) _
: df.Columns.Add("CumPerc", GetType( _
Double))
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
sm += CInt(row("Count"))
row("cum") = sm
Next i
'Kumulierte Werte in Prozentanteile umrechnen
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
row("CumPerc") = Math.Round(CInt(row("Cum")) / sm * 100, 2)
Next i
'Daten in der DGV anzeigen
DGV1.DataSource = bs
With DGV1
.Columns(0).AutoSizeMode = DataGridViewAutoSizeColumnsMode.Fill
.Columns(1).Width = 60
End With
With DGV1
.EnableHeadersVisualStyles = False
.ColumnHeadersDefaultCellStyle.Alignment = _
DataGridViewContentAlignment.MiddleCenter
.ColumnHeadersDefaultCellStyle.BackColor = Color.DimGray
.ColumnHeadersDefaultCellStyle.ForeColor = Color.FloralWhite
.BackgroundColor = Color.LightGray
.Font = New Font("Consolas;", 9.5, FontStyle.Regular)
.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
.ColumnHeadersHeight = 38
.ColumnHeadersHeightSizeMode = _
DataGridViewColumnHeadersHeightSizeMode.DisableResizing
.RowHeadersVisible = False
.GridColor = System.Drawing.Color.DarkGray
.SelectionMode = DataGridViewSelectionMode.FullRowSelect
.DefaultCellStyle.WrapMode = DataGridViewTriState.True
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
End With
With DGV1.DefaultCellStyle
.SelectionForeColor = Color.OldLace
.SelectionBackColor = Color.Olive
.BackColor = Color.LightGray
.ForeColor = Color.Black
.Font = New Font("Consolas;", 8.0, FontStyle.Regular)
End With
With DGV1.AlternatingRowsDefaultCellStyle
.SelectionForeColor = Color.OldLace
.SelectionBackColor = Color.Olive
.BackColor = Color.WhiteSmoke
.ForeColor = Color.Black
.Font = New Font("Consolas;", 8.0, FontStyle.Regular)
End With
'Ende Auswertung
'Chart anzeigen
End Function | |
Re: Monatsdiagramm | | | Autor: Manfred X | Datum: 25.02.18 17:40 |
| Du kannst eine neue Routine schreiben, der statt der
Woche der Monat als Parameter "monat" gegeben wird.
Es ist in dieser Routine vermutlich nur
Let wk as integer = .....
zu ersetzen durch
Let mn As Integer = row.Field(Of Date)("angelegtam").Month
und im folgenden Code wk durch mn und week durch monat.
(So wie die die bereits im Code enthaltene Bedingung zu "year").
Was die Where-Bedingung zur "IDAblage" bewirken soll,
verstehe ich nicht. Die ist immer erfüllt.
Oder Du sparst die zweite Routine und ergänzt statt dessen
einen dritten Parameter "IntervalType", aus dem hervorgeht,
wie das Intervall gebildet werden soll (Woche oder Monat).
Eine entsprechende If-Bedingung in Linq-Where entscheidet
anhand dieses Parameters, ob die Woche oder der Monat
aus "angelegtam" ermittelt und als Auswahl-Bedingung verwendet
wird. | |
Re: Monatsdiagramm | | | Autor: ERBRU | Datum: 25.02.18 18:27 |
| Hallo Manfred X,
Danke für den Hinweis
so ?
einen dritten Parameter "IntervalType", aus dem hervorgeht,
wie das Intervall gebildet werden soll (Woche oder Monat).
Eine entsprechende If-Bedingung in Linq-Where entscheidet
anhand dieses Parameters, ob die Woche oder der Monat
aus "angelegtam" ermittelt und als Auswahl-Bedingung verwendet das wäre evtl. für Benutzer besser
zeig mir den dritten Parameter Bitte.
möchte aus einer Liste Monat auswählen?
Private Sub Monatsliste()
Dim lst_Monate As New List(Of String) From {"", "Januar", "Februar", _
"März", "April", "Mai", "Juni", "Juli", "August", "September", _
"Oktober", "November", "Dezember"}
cbx_Monat.Items.AddRange(lst_Monate.ToArray)
cbx_Monat.SelectedIndex = 0
lst_Monate.Clear()
End Sub Dim dt As DataTable = ABLAGEPUAM.Vorgang
Dim cal As Globalization.Calendar = _
Globalization.CultureInfo.CurrentCulture.Calendar
Dim q = From row As DataRow In dt
Let mn As Integer = row.Field(Of Date)("angelegtam").Month
Where year = row.Field(Of Date)("angelegtam").Year _
AndAlso mn = Month(row.Field(Of Date)("angelegtam")) _
Group By art = row.Field(Of String)("Ablagename") Into Count()
Dim df As New DataTable
df.Columns.Add("Ablagename") : df.Columns.Add("Count", GetType( _
Integer)) : df.Columns.Add("Cum", GetType(Double)) _
: df.Columns.Add("CumPerc", GetType( _
Double))
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
sm += CInt(row("Count"))
row("cum") = sm
Next i
'Kumulierte Werte in Prozentanteile umrechnen
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
row("CumPerc") = Math.Round(CInt(row("Cum")) / sm * 100, 2)
Next i
'Daten in der DGV anzeigen
DGV1.DataSource = bs | |
Re: Monatsdiagramm | | | Autor: Manfred X | Datum: 25.02.18 18:33 |
| Seien "year" und "mnth" die Parameter einer Routine ....
(Lass das Let im Where weg.)
Where year = row.Field(Of Date)("angelegtam").Year _
AndAlso mnth = row.Field(Of Date)("angelegtam").Month _ | |
Re: Monatsdiagramm | | | Autor: ERBRU | Datum: 25.02.18 18:44 |
| OK, da tut sich jetzt garnichts mehr
Dim mnth As Integer
Dim dt As DataTable = ABLAGEPUAM.Vorgang
Dim cal As Globalization.Calendar = _
Globalization.CultureInfo.CurrentCulture.Calendar
Dim q = From row As DataRow In dt
Where year = row.Field(Of Date)("angelegtam").Year _
AndAlso mnth = Month(row.Field(Of Date)("angelegtam")) _
Group By art = row.Field(Of String)("Ablagename") Into Count()
Dim df As New DataTable
df.Columns.Add("Ablagename") : df.Columns.Add("Count", GetType( _
Integer)) : df.Columns.Add("Cum", GetType(Double)) _
: df.Columns.Add("CumPerc", GetType( _
Double))
For Each el In q
df.Rows.Add(el.art, el.Count)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim sm As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
sm += CInt(row("Count"))
row("cum") = sm
Next i | |
Re: Monatsdiagramm | | | Autor: Manfred X | Datum: 25.02.18 19:16 |
| mnth als Parameter übergeben !!!!!!!!!!!!!!!!!!!!!!
'Auf dem Formular eine Listbox für Monatsauswahl erstellen
Dim WithEvents Months As New ListBox With {.Parent = Me}
'Im Load-Event der Form diese Listbox füllen
'(Geht auch direkt per Rückgriff auf die entsprechende Enumeration)
For i As Integer = 1 To 12
months.Items.Add(DateAndTime.MonthName(i))
Next i
'Im Listbox-Event die Graphik anfordern
Private Sub Months_SelectedIndexChanged(sender As Object, _
e As EventArgs) Handles Months.SelectedIndexChanged
Dim lbo As ListBox = DirectCast(sender, ListBox)
if lbo.selectedindex >= 0 then _
Getfrequencies(2017, lbo.SelectedIndex + 1)
End Sub
'So muß die gerufene Methode deklariert sein
Private Sub getfrequencies(ByVal year As Integer, mnth As Integer)
'Linq-Code etc.
End Sub | |
Re: Monatsdiagramm | | | Autor: ERBRU | Datum: 28.02.18 11:32 |
| Danke Manfred X, statt der Listbox habe ich eine Combobox gewählt
funktioniert jetzt für Woche / Monat --> Danke | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|