vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Schützen Sie Ihre Software vor Software-Piraterie - mit sevLock 1.0 DLL!  
 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
Stördauer ermitteln 
Autor: ERBRU
Datum: 28.04.17 06:46

Hallo zusammen,

erweitern der Function (Manfred X) um Summe Stördauer pro Störtyp.

also die Function ermittelt die in einer Woche angelegenen Störmeldungen

Woche 2 3 x Mechanik, 2x EDV, 1x Elektrik usw. nun möchte ich die Sum(Minuten) dazu ermitteln

ungefähr so:
Woche 2 3 x Mechanik |40Minuten, 2x EDV| 120Minuten, 1x Elektrik|45Minuten

lässt sich das in der Function einbauen? als zusätzliche Spalte für die DGV


 Private Function GetFreq1(ByVal week As Integer, _
       year As Integer, masch As Integer) As DataTable
        Dim dt As DataTable = TPMDB.Stoerungen
        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)("MaschinenID") = masch
              Group By art = row.Field(Of String)("ArtderStörung") Into Count()
 
        Dim df As New DataTable
        df.Columns.Add("ArtderStörung") : df.Columns.Add("Count")
 
        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"
 
  Return df
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Stördauer ermitteln 
Autor: Manfred X
Datum: 28.04.17 09:41

Hallo!

Schau mal hier ....
Das ist zwar C#, aber nahezu identisch mit VB
http://www.csharp-examples.net/linq-sum/
http://www.codethinked.com/grouping-linq-aggregates-in-c
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Stördauer ermitteln 
Autor: ERBRU
Datum: 28.04.17 12:38

OK Danke für die Hinweise

doch ich weiß nicht sorecht wo in der Function ich die Summenbildung einbinden muss, soll ja auch plausibel sein, passen.

??? .Sum(Function(f) f.Stoerdauer)
Stoerdauer = mein Feld in der Tabelle Störungen bzw. in dt
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Demo für Linq: Group + Aggregate 
Autor: Manfred X
Datum: 28.04.17 13:07

Erläuterung für Mitlesende:
Es gibt eine Tabelle (dt) in der in jeder Zeile eine Störung verzeichnet ist:
gestörte Maschine, Art der Störung, Zeitpunkt, Dauer u.a.

Es soll nun für ein bestimmtes Jahr/eine bestimmte Maschine
eine Wochenauflistung gebildet werden, die pro Woche (Zeile)
für jede Störungs-Art die Gesamtdauer und die Häufigkeit enthält.

(Durch die Routine "IsFullRow" werden alle Sätze erkannt,
die DBNull-Werte enthalten.)

Private Function GetErrorsInWeeks _
        (year As Integer, masch As Integer) As DataTable
 
    Dim cal As Globalization.Calendar = _
        Globalization.CultureInfo.CurrentCulture.Calendar
 
    Dim df As New DataTable
 
    Dim q = _
        From row As DataRow In dt.AsEnumerable
           Where IsFullRow(row) AndAlso _
              row.Field(Of Date)("Störung Zeit").Year = year AndAlso _
              row.Field(Of Integer)("Maschine ID") = masch
              Let wk As Integer = _
                  cal.GetWeekOfYear(row.Field(Of Date)("Störung Zeit"), _
                  Globalization.CalendarWeekRule.FirstDay, DayOfWeek.Monday), _
                  art As Integer = row.Field(Of Integer)("Störung Art") _
           Group row By GroupKeys = New With {Key wk, Key art} _
           Into Group
           Order By GroupKeys.wk, GroupKeys.art
           Select New With _
                {.week = GroupKeys.wk, .art = GroupKeys.art, _
                 .sum = Group.Sum(Function(row As DataRow) _
                            row.Field(Of Integer)("Störung Dauer")), _
                 .max = Group.Max(Function(row As DataRow) _
                            row.Field(Of Integer)("Störung Dauer")),
                 .count25 = Group.Count(Function(row As DataRow) _
                            If(CInt(row.Field(Of Integer)("Störung Dauer")) _
                            > 25, _
                            True, False)), _
                 .count = Group.Count}
 
    'sortierte Auflistung der Störungsarten
    Dim arts = From row In dt.AsEnumerable _
                 Select art = row.Field(Of Integer)("Störung Art") _
                 Distinct Order By art
 
    'Spalten für Störungsarten erstellen
    With df.Columns
       .Add("Woche")
       For i As Integer = 0 To arts.Count - 1
          .Add(arts(i).ToString)
          .Add(arts(i) & " Summe Dauer")
          .Add(arts(i) & " Anzahl")
       Next i
    End With
 
    'eine Zeile für jede Woche im Jahr erstellen
    With df.Rows
       For i As Integer = 1 To 53
          df.Rows.Add(i)
       Next i
    End With
 
    df.PrimaryKey = {df.Columns(0)}
 
    'Auflistung (anonymer Typ) in Tabelle übertragen 
    For Each el In q
       Dim row As DataRow = df.Rows.Find(el.week)
       Dim i As Integer = df.Columns.IndexOf(el.art.ToString)
       row(i) = el.art '?????????????? Spalte redundant
       row(i + 1) = el.sum   'Summe der Störungsdauern
       row(i + 2) = el.count 'Anzahl der Störungen
    Next el
 
    Return df
End Function


Beitrag wurde zuletzt am 28.04.17 um 13:24:03 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Stördauer ermitteln 
Autor: ERBRU
Datum: 28.04.17 14:43

das hätte ich bestimmt nicht so hinbekommen, ich Danke dir wie verrückt.

melde mich noch einmal ob es dann auch funktioniert hat.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Demo für Linq: Group + Aggregate 
Autor: Manfred X
Datum: 28.04.17 15:18

Beispiele und Links
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Stördauer ermitteln 
Autor: ERBRU
Datum: 28.04.17 19:11

Hallo Manfred X,

Hat Super geklappt ist eine Liste mit vielen Spalten

 art As Integer = row.Field(Of Integer)("Störung Art")
habe ich als string deklariert da die Spalte ein String und kein Integer Wert hat.

Danke
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Stördauer ermitteln 
Autor: ERBRU
Datum: 28.04.17 19:13

mit dem Link muss ich mich mal ordentlich befassen
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Stördauer ermitteln 
Autor: ERBRU
Datum: 29.04.17 10:45

Info für mitlesende

diese Frage '?????????????? Spalte redundant von Manfred X, ist ein wichtiger Baustein in der Abfrage

musste erfahren wenn dem nicht so ist, funktioniert die Abfrage nur bedingt.
habe meine Daten bereinigt und siehe da, es funktioniert nun plausibel und nachvollziebar.

also wer das mal benutzt dran denken 'das die entsprechende Spalte redundant ist sonst klappt das nicht
in diesem Fall muss der String "Störungsart" immer Bspw. "nicht zugeordenet" immer so geschrieben werden, dann ist alles Gut. Bei mir war es so das der String mal so oder so geschrieben war. In meinem Projekt habe ich die Störungsart nun als Auswahl dem User angeboten der verwendete String wird so immer redundant sein.

Danke 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