| |
VB.NET - FortgeschritteneDemo 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. | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere Infos
|
|
|
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
|
|