DataTables im DataSet automatisch durch übergeordnete Tabelle befüllen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    DataTables im DataSet automatisch durch übergeordnete Tabelle befüllen

    Hallo,

    folgendes Beispiel-DataSet:



    Ich möchte aus dtraw, dtAufbereitet befüllen. In dtraw befinden sich zu bestimmten Zeitpunkten zwei Messwerte SubStatus und LEDStatus. Das Ganze ist pro Station jedoch unabhängig voneinander.
    Ich berechne in der Aufbereitung unter anderem jedoch die Dauer welche sich aus der Differenz zweier Zeitstempel einer StationsID ergibt.
    Da die Zeitstempel der Stationen sich überschneiden können, muss ich die dtraw stationsweise aufteilen. Gibt es die Möglichkeit diese "Stations-gefilterten" Tabellen schon im Designer so zu verknüpfen, dass sie dtraw hinterherspringen nur halt mit Filter auf StationsID?

    Also momentan mache ich es so, da gibts nur unschöne Wiederholungen:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Füll dtraw
    2. DS1.dtraw.Clear()
    3. Using cmd As SqlCommand = 'fertiger Command
    4. Using da As New SqlDataAdapter(cmd)
    5. da.Fill(DS1.dtraw)
    6. End Using
    7. End Using
    8. 'Füll dtStations
    9. Dim linquery As EnumerableRowCollection(Of DataSet1.dtrawRow)
    10. linquery = From t In DS1.dtraw Where t.StationsID = 1
    11. For Each result In linquery
    12. DS1.dtStation1.AdddtStation1Row(result.Zeitstempel, result.SubStatus, result.LEDStatus, result.StationsID)
    13. Next
    14. linquery = From t In DS1.dtraw Where t.StationsID = 2
    15. For Each result In linquery
    16. DS1.dtStation2.AdddtStation2Row(result.Zeitstempel, result.SubStatus, result.LEDStatus, result.StationsID)
    17. Next
    18. linquery = From t In DS1.dtraw Where t.StationsID = 3
    19. For Each result In linquery
    20. DS1.dtStation3.AdddtStation3Row(result.Zeitstempel, result.SubStatus, result.LEDStatus, result.StationsID)
    21. Next
    22. linquery = From t In DS1.dtraw Where t.StationsID = 4
    23. For Each result In linquery
    24. DS1.dtStation4.AdddtStation4Row(result.Zeitstempel, result.SubStatus, result.LEDStatus, result.StationsID)
    25. Next
    26. Dim bis As DateTime
    27. Dim von As DateTime
    28. 'Füll dtAufbereitet
    29. DS1.dtAufbereitet.Clear()
    30. von = DS1.dtStation1(0).Zeitstempel
    31. Dim diff = TimeSpan.FromSeconds(99999)
    32. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation1(0).SubStatus, diff.TotalSeconds * DS1.dtStation1(0).SubStatus, DS1.dtStation1(0).LEDStatus, 1)
    33. For i = 1 To DS1.dtraw.Count - 1
    34. bis = DS1.dtStation1(i - 1).Zeitstempel
    35. von = DS1.dtStation1(i).Zeitstempel
    36. diff = bis - von
    37. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation1(i).SubStatus, diff.TotalSeconds * DS1.dtStation1(i).SubStatus, DS1.dtStation1(i).LEDStatus, 1)
    38. Next
    39. von = DS1.dtStation2(0).Zeitstempel
    40. diff = TimeSpan.FromSeconds(99999)
    41. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation2(0).SubStatus, diff.TotalSeconds * DS1.dtStation2(0).SubStatus, DS1.dtStation2(0).LEDStatus, 2)
    42. For i = 1 To DS1.dtraw.Count - 1
    43. bis = DS1.dtStation2(i - 1).Zeitstempel
    44. von = DS1.dtStation2(i).Zeitstempel
    45. diff = bis - von
    46. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation2(i).SubStatus, diff.TotalSeconds * DS1.dtStation2(i).SubStatus, DS1.dtStation2(i).LEDStatus, 2)
    47. Next
    48. von = DS1.dtStation3(0).Zeitstempel
    49. diff = TimeSpan.FromSeconds(99999)
    50. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation3(0).SubStatus, diff.TotalSeconds * DS1.dtStation3(0).SubStatus, DS1.dtStation3(0).LEDStatus, 3)
    51. For i = 1 To DS1.dtraw.Count - 1
    52. bis = DS1.dtStation3(i - 1).Zeitstempel
    53. von = DS1.dtStation3(i).Zeitstempel
    54. diff = bis - von
    55. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation3(i).SubStatus, diff.TotalSeconds * DS1.dtStation3(i).SubStatus, DS1.dtStation3(i).LEDStatus, 3)
    56. Next
    57. von = DS1.dtStation4(0).Zeitstempel
    58. diff = TimeSpan.FromSeconds(99999)
    59. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation4(0).SubStatus, diff.TotalSeconds * DS1.dtStation4(0).SubStatus, DS1.dtStation4(0).LEDStatus, 4)
    60. For i = 1 To DS1.dtraw.Count - 1
    61. bis = DS1.dtStation4(i - 1).Zeitstempel
    62. von = DS1.dtStation4(i).Zeitstempel
    63. diff = bis - von
    64. DS1.dtAufbereitet.AdddtAufbereitetRow(von, diff.TotalSeconds, DS1.dtStation4(i).SubStatus, diff.TotalSeconds * DS1.dtStation4(i).SubStatus, DS1.dtStation4(i).LEDStatus, 4)
    65. Next


    Viele Grüße

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hab nun doch was ohne Wiederholungen und ohne die ganzen Tabellen hingekriegt

    Spoiler anzeigen

    VB.NET-Quellcode

    1. DS1.dtAufbereitet.Clear()
    2. Using cmd As SqlCommand = 'fertiger Command
    3. Using da As New SqlDataAdapter(cmd)
    4. da.Fill(DS1.dtAufbereitet)
    5. End Using
    6. End Using
    7. Dim bis As DateTime
    8. Dim von As DateTime
    9. Dim linquery As List(Of DataSet1.dtAufbereitetRow)
    10. For Each id In {1, 2, 3, 4}
    11. linquery = (From t In DS1.dtAufbereitet Where t.StationsID = id Order By t.Zeitstempel Descending).ToList
    12. von = linquery(0).Zeitstempel
    13. Dim diff = TimeSpan.FromSeconds(99999)
    14. linquery(0).Dauer = diff.TotalSeconds : linquery(0).Integral = diff.TotalSeconds * linquery(0).SubStatus
    15. For i = 1 To linquery.Count - 1
    16. bis = linquery(i - 1).Zeitstempel
    17. von = linquery(i).Zeitstempel
    18. diff = bis - von
    19. linquery(i).Dauer = diff.TotalSeconds : linquery(i).Integral = diff.TotalSeconds * linquery(i).SubStatus
    20. Next
    21. Next


    Wär trotzdem interessant zu wissen, ob man ganze Tabelle irgendwie in andere Tabellen übernehmen kann. Oder vielleicht kann man aus einer DatarowCollection eine Tabelle machen?
    For Each id In {1, 2, 3, 4}. Für sowas gibt's eigentlich For id = 1 To 4, aber wenn Du es so lassen willst …
    Ganze Tabellen in andere übernehmen/übertragen: Nuja, eigenlich nur scheibchenweise, also so, wie Du es schon machst. Weil Tabellen ja eigentlich alle anders aussehen. Sonst sollte man überlegen, ob man nicht 2 Tabellen zusammenfassen kann. Aber DataRowCollections nicht. Das sind ja alles untypisierte DataRows. Da müsstest Du hast jedes Bruchstück erstmal casten. Klar könnte man sich da ne tolle Methode dafür basteln. Aber der Einsatzzwecke bliebe fraglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.