| |
VB.NET - FortgeschritteneStoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 10:09 |
| Hallo Forum,
Frohe Ostern wünsche ich, habe ein kleinen Denkfehler mit meinem Code.
möchte doch in der Auswertung die Stördauer ermitteln, kriege es nicht wirklich hin, bzw. verstehe das irgendwie noch nicht. Im Code Fett markiert, da komme ich nicht weiter zu den Einträgen auch die Stördauer zu erhalten.
https://picload.org/view/daparaaw/02-04-_2018_09-36-49.png.html
wäre schön von euch zu hören
Private Function GetFreq1(ByVal week As Integer, _
year As Integer, masch As Integer) As DataTable
Dim Text As String = "Kein Stör-Ereignis"
Dim dt As DataTable = Schichtbuch
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)("Eintrag"), _
Globalization.CalendarWeekRule.FirstFourDayWeek, _
DayOfWeek.Monday)
Where year = row.Field(Of Date)("Eintrag").Year _
AndAlso wk = week _
AndAlso row.Field(Of Integer)("MaschID") = masch _
AndAlso row.Field(Of String)("Eintrag-Instandhaltung") <> Text, _
Minuten as String = row.Field(Of Integer)("Stoerdauer") _
Group By art = row.Field(Of String)("Eintrag-Instandhaltung") _
Into Count()
Dim df As New DataTable
With df.Columns
.Add("Eintrag-Instandhaltung", GetType(String))
.Add("Stoerdauer", GetType(Integer))
.Add("Count", GetType(Integer))
.Add("Cum", GetType(Double))
.Add("CumPerc", GetType(Double))
End With
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 Summe As Integer
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Häufigkeiten kumulieren
Summe += CInt(row("Stoerdauer"))
row("Stoerdauer") = Summe
Next i
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
If bs.Count <> 1 Then
FirefoxH28.Text = String.Concat(bs.Count.ToString & " Eintraege" & _
"ausgewertet")
Else
FirefoxH28.Text = String.Concat(bs.Count.ToString & " Eintrag" & _
"ausgewertet")
End If | |
Re: Stoerdauer ermitteln | | | Autor: stefan220273 | Datum: 02.04.18 10:26 |
| Du mußt beim aufaddieren einfach eine Abfrage machen ob das Count Feld ein dbnull ist.
Falls Ja nicht addieren. Falls nein addieren.
Oder beim Füllen des Datatables dbull durch 0 ersetzen und dann aufaddieren
Gruss Stefan
Egal wie oft etwas gelöscht wird, das Internet vergisst nie und Menschen lassen sich nicht dauerhaft täuschen!
| |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 10:47 |
| OK Stefan,
zeig mal bitte wo in der Abfrage was zu ändern ist?
da habe ich doch einen Klemmer.
Danke | |
Re: Stoerdauer ermitteln | | | Autor: Manfred X | Datum: 02.04.18 11:26 |
| Was Du erreichen willst, ist mir nicht klar.
Vielleicht so ...
Dim q = From row As DataRow In dt
Let wk As Integer =
cal.GetWeekOfYear(row.Field(Of Date)("Eintrag"),
Globalization.CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday)
Let Minuten = row.Field(Of Integer)("Stoerdauer")
Let Instandhaltung = row.Field(Of String)("Eintrag-Instandhaltung")
Where year = row.Field(Of Date)("Eintrag").Year _
AndAlso wk = week _
AndAlso row.Field(Of Integer)("MaschID") = masch _
AndAlso row.Field(Of String)("Eintrag-Instandhaltung") <> Text
Group By art = Instandhaltung, Minuten Into Count() In "art" stehen danach die Spalten: Instandhaltung, Stoerdauer, Count.
Die Zeilen sind nach Instandhaltung * Stoerdauer gruppiert.
Wenn Stoerdauer/Minuten gefiltert werden sollen, ist in der Where-Zeile
natürlich zunächst ein "AndAlso" und eine Vergleichsbedingung erforderlich. | |
Re: Stoerdauer ermitteln | | | Autor: sv00010 | Datum: 02.04.18 11:28 |
| Ich vermute mal so.
If System.Convert.IsDBNull( row("Count") ) = False Then
sm += CInt(row("Count"))
End If | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 11:58 |
| Hallo Manfred X,
schön das du dich hier einschaltest.
Danke
erreichen möchte ich eben, das ich in der Auswertung "Labels" befülle die zum einen
Anzahl wiedergeben, und die Stoerdauer in Summe macht ja Sinn zu wissen wieviele Ereignisse und die Stoerdauer Summe zu bilden?
bei mir jetzt Spalte 'Stoerdauer' gehört nicht zur Tabelle
die Anzahl stimmt auch nicht? in diesem Bild sind z Zeilen richtig, aber Ereignisse hätten 8 gezählt werden müssen, da es ja das eine oder andere öfters vorkommt.
https://picload.org/view/dapaaacw/02-04-_2018_11-53-17.png.html
Dim Text As String = "Kein Stör-Ereignis"
Dim dt As DataTable = Schichtbuch
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)("Eintrag"),
Globalization.CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday)
Let Minuten = row.Field(Of Integer)("Stoerdauer")
Let Instandhaltung = row.Field(Of String)("Eintrag-Instandhaltung")
Where year = row.Field(Of Date)("Eintrag").Year _
AndAlso wk = week _
AndAlso row.Field(Of Integer)("MaschID") = masch _
AndAlso row.Field(Of String)("Eintrag-Instandhaltung") <> Text
Group By art = Instandhaltung, Minuten Into Count()
'Dim q = From row As DataRow In dt
' Let wk As Integer = _
' cal.GetWeekOfYear(row.Field(Of Date)("Eintrag"), _
' Globalization.CalendarWeekRule.FirstFourDayWeek,
' DayOfWeek.Monday)
' Where year = row.Field(Of Date)("Eintrag").Year _
' AndAlso wk = week _
' AndAlso row.Field(Of Integer)("MaschID") = masch _
' AndAlso row.Field(Of String)("Eintrag-Instandhaltung") <> Text _
' Group By art = row.Field(Of String)("Eintrag-Instandhaltung")
' Into Count()
Dim df As New DataTable
With df.Columns
.Add("Eintrag-Instandhaltung", GetType(String))
.Add("Count", GetType(Integer))
.Add("Cum", GetType(Double))
.Add("CumPerc", GetType(Double))
End With
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
Dim sum As Integer = 0
For i As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(i), DataRowView).Row
'Stoerdauer
sum += CInt(row("Stoerdauer"))
Next i
If bs.Count <> 1 Then
FirefoxH28.Text = String.Concat(bs.Count.ToString & " Eintraege" & _
"ausgewertet")
FirefoxH29.Text = String.Concat(sum.ToString & " Minuten")
Else
FirefoxH28.Text = String.Concat(bs.Count.ToString & " Eintrag" & _
"ausgewertet")
FirefoxH29.Text = String.Concat(sum.ToString & " Minute")
End If | |
Re: Stoerdauer ermitteln | | | Autor: Manfred X | Datum: 02.04.18 12:13 |
| Die Dauer der Störung nennt sich im anonymen Typ "Minuten".
Auf welche Weise Typ der Störung und Dauer der Störung kombiniert
werden sollen, kann ich nicht beurteilen:
- mittlere Störungsdauer je Stör-Typ
- Summe der Störungsdauern je Stör-Typ
- Klassifikation der Störungsdauern je Störungstyp (kurz/mittel/lang)
Solche Kombinationen sind in der Praxis äußerst komplex.
Bei manchen Störungstypen kommen z.B. keine kurzen Dauern zustande,
weil zur Behebung Teile herangeschafft und gewechselt werden müssen.
Bei manchen Störungstypen dürfen z.B. nur kurze Dauern eintreten,
weil sonst die gesamte Produktion stillsteht.
usw.
Soll heißen: Die kurze Störung bei einem Typ kann schwerwiegender sein
als eine längere Störung bei einem anderen Typ.
Und wie diese Kombinationen in einem Pareto-Chart dargestellt werden
soll, verstehe ich nicht. | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 12:25 |
| Hallo Manfred X,
dein Kommentar ist ja berechtigt, sicherlich kann man das komplexer machen. Das Chart reicht mir im Prinzip so, nur möchte ich für die ausgewertete Woche oder Monat die angelegenen Minuten angezeigt bekommen, was mir nicht gelingen will. Also nicht ins Pareto oder man setzt eine zusätzliche Series ein die nur die Minuten wiedergibt?
aber ich möchte nur die Stoerdauer in Minuten anzeigen die in der Woche, Monat angefallen sind.
dein Ansatz wäre ja etwas für die Statistik oder? die man unter dem Pareto schreiben könnte? | |
Re: Stoerdauer ermitteln | | | Autor: Manfred X | Datum: 02.04.18 13:13 |
| Dann gehört die Dauer der Störung nicht in die Linq-Abfrage für den
Pareto-Chart, sondern sie ist davon unabhängig durchzuführen, etwa so:
Dim q = From row As DataRow In dt
Let wk As Integer =
cal.GetWeekOfYear(row.Field(Of Date)("Eintrag"),
Globalization.CalendarWeekRule.FirstFourDayWeek,
DayOfWeek.Monday)
Let Minuten = row.Field(Of Integer)("Stoerdauer")
Let Instandhaltung = row.Field(Of String)("Eintrag-Instandhaltung")
Where year = row.Field(Of Date)("Eintrag").Year _
AndAlso wk = week _
AndAlso row.Field(Of Integer)("MaschID") = masch _
AndAlso row.Field(Of String)("Eintrag-Instandhaltung") <> Text
Group By art = Instandhaltung Into Sum(Minuten), Count Im anonymen Typ stehen die Spalten "art" (Störungstyp) und "sum" (Minutensumme pro Typ).
Als Chart-Typ würde man z.B. einen Punkte-Chart erstellen:
x-Achse: Störungstyp, Y-Achse: Gesamtdauer aller Störungen (Minuten) je Störungstyp
Beitrag wurde zuletzt am 02.04.18 um 13:31:24 editiert. | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 13:42 |
| also habe ich es Richtig verstanden?
das was ich jetzt gemacht habe ist für das Pareto OK, für die Summe müsste das ganze noch mal aufgerufen werden in einer seperate Funktion?
zum Beispiel: Private Function Stoerdauer(ByVal week As Integer, year As Integer, masch As _
Integer) As DataTable | |
Re: Stoerdauer ermitteln | | | Autor: Manfred X | Datum: 02.04.18 13:43 |
| Wenn man dem folgt, was Du bisher gepostet hast, würde ich vermuten: Ja. | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 13:46 |
| ich würde mich später mal melden, versuche es mal umzusetzen.
Danke, bei Fragen hake ich nach | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 02.04.18 17:50 |
| OK Manfred X,
wie erwähnt melde ich mich hier noch mal mit dem Ergebnis
in der Wochenauswertung scheint es mir plausibel und sieht erst mal OK aus.
der Chart entspricht einem Pareto, hat noch nichts mit den Minuten zu tun
https://picload.org/view/dapogwwi/02-04-_2018_17-32-29.png.html
in der Monatsauswertung wieder nicht? evtl. verstehe ich den Code auch noch nicht
was macht das Let eingentlich?
https://picload.org/view/daporggw/02-04-_2018_17-35-32.png.html
Private Function Stoerdauer2(ByVal mnth As Integer, year As Integer, masch As _
Integer) As DataTable
Dim Text As String = "Kein Stör-Ereignis"
Dim dt As DataTable = Schichtbuch
Dim cal As Globalization.Calendar = _
Globalization.CultureInfo.CurrentCulture.Calendar
Me.Cursor = Cursors.WaitCursor
Dim q = From row As DataRow In dt
Let Minuten = row.Field(Of Integer)("Stoerdauer")
Let Instandhaltung = row.Field(Of String)("Eintrag-Instandhaltung")
Where year = row.Field(Of Date)("Eintrag").Year _
AndAlso mnth = Month(row.Field(Of Date)("Eintrag")) _
AndAlso row.Field(Of Integer)("MaschID") = masch _
AndAlso row.Field(Of String)("Eintrag-Instandhaltung") <> Text
Group By art = Instandhaltung Into Sum(Minuten), Count()
Dim df As New DataTable
With df.Columns
.Add("Instandhaltung", GetType(String))
.Add("Count", GetType(Integer))
.Add("Minuten", GetType(Integer))
End With
For Each el In q
df.Rows.Add(el.art, el.Count, el.Sum)
Next el
Dim bs As New BindingSource With {.DataSource = df}
bs.Sort = "Count DESC"
Dim _Sum As Integer
_Sum = df.AsEnumerable().Sum(Function(row) row.Field(Of Integer)( _
"Minuten"))
If bs.Count <> 1 Then
FirefoxH29.Text = String.Concat(_Sum.ToString & " [Min]")
Else
FirefoxH29.Text = String.Concat(_Sum.ToString & " [Min]")
End If Problem Anzahl Ereignisse gelöst, mein Fehler
Beitrag wurde zuletzt am 02.04.18 um 17:59:13 editiert. | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 03.04.18 18:26 |
| Sorry Manfred X,
meinen letzten Post von gestern 17:50, konntest du schon lesen?
verstehe nicht warum er die Minuten für den Monat nicht ausspuckt, die Auswertung bleibt leer?
Danke wenn du da Zeit findest | |
Re: Stoerdauer ermitteln | | | Autor: Manfred X | Datum: 03.04.18 20:51 |
| Da kann ich nur raten. Am Code ist nichts erkennbar.
Stimmen die Parameter-Werte: Mnth, Year, Masch ? | |
Re: Stoerdauer ermitteln | | | Autor: ERBRU | Datum: 04.04.18 06:27 |
| Danke für den Hinweis, habe es mal geprüft
die Parameter sind im Prinzip die gleichen wie für das Pareto
habe die Reihenfolge der Parameter geändert
von
Stoerdauer2(year_selected, mnth_selected, masch_selected) zu
Stoerdauer2(mnth_selected, year_selected, masch_selected) weil der Code die Reihenfolge unter dem Cursor so abgefragt hat. Na ja jetzt funktioniert es.
Beitrag wurde zuletzt am 04.04.18 um 06:34:27 editiert. | |
| 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 sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere Infos
|