Summenberechnung einer ChildRow-Zelle für alle Parent-Rows

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von silverbob76GE.

    Summenberechnung einer ChildRow-Zelle für alle Parent-Rows

    Hallo Leute

    suche schon seit zwei Tagen und komme nicht mehr weiter.

    Ich habe ein DataSet mit zwei Tables, einer Parent und einer Child-Table, die über eine Relation miteinander verbunden sind. Die Parent Table enthält ca. 8000 Datensätze mit ca. 50 Spalten.
    Die ChildTable enthält immer eine ChildRow je ParentRow. Ich möchte den Wert einer Zelle in der ChildRow für alle ParentRows berechnen.
    Leider blicke ich da nicht durch.

    ParentTable => Komplett
    ChildTable => Komplett_Mengen

    Die Benennung ist etwas ungklücklich, ich weiß.

    Folgender Ansatz führt nicht zum Ziel, da die Parent-Table anscheinend nicht durchlaufen wird.

    VB.NET-Quellcode

    1. Dim zeile = DirectCast(DirectCast(KomplettBindingSource.Current, DataRowView).Row, DSAufträge.KomplettRow)
    2. Dim unterzeile = zeile.GetKomplett_MengenRows()
    3. Dim pudach As Double
    4. For i = 0 To KomplettBindingSource.Count - 1
    5. For Each rweinzel In unterzeile
    6. pudach += rweinzel._CZ_Dach
    7. MsgBox(pudach)
    8. Next
    9. KomplettBindingSource.MoveNext()
    10. Next


    Edit:

    Hab den DirecCast nun in die For-Schleife verschoben, es wird auch gerechnet, dauert aber sehr lang.
    Jemand ne Idee, wie ich das elegant und effizient lösen kann?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „silverbob76GE“ ()

    Nun, eine ParentTable kann ja mehrere Rows haben, richtig? Also row1, row2, row3 usw.
    Jede dieser Rows hat eine ChildRow, genau eine.

    ich will die ParentTable durchlaufen und die Werte der ChildRow für die Spalte Menge aufaddieren, so das am Ende ein Gesamtwert entsteht. Dieser Gesamtwert enthält dann alle ChildSpalten für Menge.

    Anders: im Parent stehen in jeder Datarow Aufträge. Jeder Auftrag hat eine ChildRow, in der der Auftragswert steht. Und genau diese Werte möchte ich addieren. Das klappt auch mit dem oben genannten Code, dauert aber etwa 45 Sekunden.

    silverbob76GE schrieb:

    Nun, eine ParentTable kann ja mehrere Rows haben, richtig?
    hmm, hmm.
    Also das Wort 'ParentRow' hat nur Sinn zusammen mit seim Gegenstück: 'ChildRow'.
    Eine ParentTable hat zwar Rows, aber keine ParentRows.
    Anders gesagt: "Alle Rows einer ParentTable" ergibt durchaus Sinn, aber "Alle ParentRows" ergibt keinen Sinn. "Alle ParentRows einer ChildRow" ergäbe Sinn, wenn nicht der Fakt bestünde, dass eine ChildRow eben nur genau eine ParentRow haben kann.

    Aber egal, ich glaube zu verstehen, dass du "Alle Rows der ParentTable" gemeint hast.



    Ansonsten:

    silverbob76GE schrieb:

    Das klappt auch mit dem oben genannten Code, dauert aber etwa 45 Sekunden.

    silverbob76GE schrieb:

    Hab den DirecCast nun in die For-Schleife verschoben, es wird auch gerechnet, dauert aber sehr lang.

    Offenbar hast du den gezeigten Code inzwischen stark verändert - kannste den bitte nochmal neu einstellen?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Du willst eine Summenzeile unter den Detailwerten haben oder?

    Drei Ansätze:
    • Zwei Datasets, einer mit den Details und einer mit der Summierung jeweils in einem eigenen Dataview.
    • Zwei Abfragen, je eine mit den Details und der Summierung per UNION in einer Tabelle zusammenführt.
    • Ein eigenes Control bauen, dass Deine Bedingungen erfüllt.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    @ErfinderDesRades

    Hab gedacht mit ParentRow wäre klar was gemeint ist. Natürlich sind es DataRows in einer Parent-Table. Macht ja sonst keinen Sinn. Trotzdem sorry, wenn die Erläuterung nicht eindetuig war.
    Es sind natürlich alle Rows einer ParentTable gemeint. Jede Row der ParentTable hat genau eine Row in der ChildTable.
    Als ich gestern den code eingefügt habe fiel mir nach dem posten auf, das der DirectCast vor der For-Schleife stand. Im Moment ist es so, das die For-Schleife sehr lange braucht, um das Ergebnis zu berechnen. Bei 8000 Datensätzen vermultich nicht so überraschend, aber eventuell gehts ja noch etwas schneller und besser / eleganter. Die Daten werden über eine xml-datei eingelesen.
    Hatte im Vorfeld versucht das über die Dataexpressions zu lösen, geht auch, dauert halt auch ne ganze Weile.

    Hier noch mal die aktuelle Methode die per button click ausgelöst wird.

    VB.NET-Quellcode

    1. Private Sub CzDachproAuftrag()
    2. Dim pudach As Double
    3. Dim puwand As Double
    4. For i = 0 To KomplettBindingSource.Count - 1
    5. Dim zeile = DirectCast(DirectCast(KomplettBindingSource.Current, DataRowView).Row, DSAufträge.KomplettRow)
    6. Dim unterzeile = zeile.GetKomplett_MengenRows()
    7. For Each rweinzel In unterzeile
    8. pudach += rweinzel._CZ_Dach
    9. puwand += rweinzel._CZ_Wand
    10. Next
    11. KomplettBindingSource.MoveNext()
    12. Next
    13. czdachjeauftrag.Text = CStr(Format(pudach, "N2"))
    14. SummeWandCZTextBox.Text = CStr(Format(puwand, "N2"))
    15. End Sub


    @INOPIAE
    korrekt, ich will die Summe der Spalte "Menge" aller Rows der ChildTable. Es gibt ca. 8000 Rows in der ParenTable, demnach auch 8000 rows in der ChildTable.
    Aktuell habe ich ein DataSet mit zwei Tables in Relation (Parent - Child).

    Welchen Mehrwert hätte ich mit zwei DataSets?

    Wenn der button-click ausgelöst wird, rechnet das Programm und ist quasi eingefroren. Vermutlich macht es Sinn, das mit einem BackgroundWorker azsuführen, oder?

    Ist doch ganz einfach. Ein DataSet, zwei Tables. Eine Parent Tabelle, eine Child Tabelle, verbunden über eine Relation.
    Die Parent Tabelle hat 8000 DataRows. Die Child Tabelle hat ebenfalls 8000 DataRows.

    Jede DataRow der Parent-Tabelle hat genau eine DataRow in der Child Tabelle. Da gibts net so viel zu erklären denke ich.
    Bilder
    • 2022-12-13 17_30_42-KIP-Logistik-2023 - Microsoft Visual Studio.png

      5,88 kB, 542×267, 83 mal angesehen
    Ich intervenier mal. Du willst die Summe allen Menge-Zeilenwerte haben?
    Dann

    VB.NET-Quellcode

    1. Dim DeinErgebnis = DeinTds.Details.Sum(Function(x) x.Menge)

    Also nix mit den ParentRows, wenn die effektiv keine Rolle für die Berechnung spielen.
    Auch überhaupt nix mit BindingSource. Die Daten sind in den DataTables und die kannst Du direkt auslesen.
    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.

    silverbob76GE schrieb:

    Jede DataRow der Parent-Tabelle hat genau eine DataRow in der Child Tabelle. Da gibts net so viel zu erklären denke ich.


    Na ja ich hätte dann im Datenmodell auch eine 1:1 Beziehung erwartet und keine 1 : n. Und bei einer 1:1 -Beziehung stellt sich immer die Frage nach dem warum zwei Tabellen.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).