vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevDataGrid - Gönnen Sie Ihrem SQL-Kommando diesen krönenden Abschluß!  
 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
Stoerdauer 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.
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