Problem mit BindingSource.current - Spalte aus vorherigen Datensatz der Bindingsource aufaddieren

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Problem mit BindingSource.current - Spalte aus vorherigen Datensatz der Bindingsource aufaddieren

    Hi Leute

    ich versuche gerade eine Kassenbuchprogrammierung in VB Net zu schreiben, ist ein Privatprojekt. Grundlage für die Anwendung ist eine Excel-Tabelle. Hab mir in den Kopf gesetzt, das in vb net nachzubauen.
    Ich habe ein DataSet mit zwei DataTablen, die über einen Foreing-Key verbunden sind als Parent-Child.

    Aufbau der Child Table:

    Einahmen Ausgaben Bestand


    1. Zeile der Chidl-Table:

    Der Bestand wird durch die Einnahmen - Ausgaben + Anfangssaldo gerechnet. Anfangssaldo ist eine Variable, die ich über my.settings speicher und in die Berechnung vom Bestand einbinde.

    Wenn ich die zweite Zeile rechnen will, benötige ich den Bestand aus erster Zeile. Mit dem doppelten DirectCast bin ich ja immer nur in der aktuellen Zeile, und nicht wie benötigt in der vorherigen.
    Suche schon seit Tagen nach ner Lösung, die typsiert funktioniert.

    Wenn ich untypisiert auf das DataGridView zugreife und eine Variable in einer For i Schleife mitlaufen lasse, gehts. Würds aber gern typsiert machen, da meine DataTable auch typisiert erstellt sind.
    Hier mal mein Code, ein mix aus typisiertem und untypisiertem Zugriff. Hat jemand einen Ansatz für mich wie ich da rangehen kann?

    VB.NET-Quellcode

    1. For Each drv As DataRowView In mkBindingSource.List
    2. row = CType(drv.Row, Dts.MonatskostenRow)
    3. Dim i As Integer
    4. If i = 0 Then
    5. row.Bestandvorher = anfangssaldo
    6. row.Bestand = anfangssaldo + row.Einnahmen - row.Ausgaben
    7. End If
    8. If i > 0 Then
    9. Dim bestandvorher = CDec(MonatskostenDataGridView.Rows(i - 1).Cells(3).Value)
    10. row.Bestandvorher = bestandvorher
    11. row.Bestand = row.Einnahmen - row.Ausgaben + bestandvorher
    12. End If
    13. i += 1
    14. Next


    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    So blickt man da nicht durch.
    Kannst du nicht eine Methode schreiben, die so heisst, wie was sie tun soll?
    Dann wüsste ich, was getan werden soll.
    Und das mit anfangssaldo, bestandvorher - von wo aus werden die eingeflogen?

    Nützlich wäre auch ein Screenshot der typisierten DataTable, und den Namen des Datasets zu wissen, dann könnte man sogar Code formulieren, der vlt. bei dir 'ne Chance hätte, lauffähig gemacht zu werden.

    Also nochmal die 3 Dinge:
    • Methode schreiben, die so heisst, wie was sie tun soll
    • anfangssaldo, bestandvorher - wo kommen die her?
    • Name des Dts, und Bildle der DataTable
    Das Bild zum DataSet habe ich angehängt. DataSet Bezeichnung => Dts

    Parent Table Bezeichnung => Monatskasse
    Child Table Bezeichnung => Monatskosten

    Anfangssaldo: ist ein Wert, den der user eingibt. Dieser Wert ist variabel, da sich dieser ja jedes Jahr ändert. Den Wert speicher ich unter my.settings.anfangssaldo im Projekt und rufe ihn dann in der Methode ab.
    In dem Screenshot liegt der Anfangssaldo bei 1.500 €.

    Bestandvorher: dieser Wert ergibt sich aus der Addition der Spalten Einnahmen - Ausgaben. Allerdings soll bei erster laufender Nummer im Kassenbuch der Anfangssaldo einbezogen werden.

    In der zweiten Zeile muss dann entsprechend der Wert aus Spalte "Bestandvorher" aus erster Zeile addiert werden, damit Bestand der zweiten Zeile korrekt gerechnet wird. Hab nen Screenshot vom Datagridview angehängt, das ist visuell einfacher zu verstehen.

    Die Methode rufe ich über einen Button auf meiner Form auf.

    VB.NET-Quellcode

    1. Private Sub btnKassenbestand(sender As Object, e As EventArgs) Handles btnKassenbestand.Click
    2. Dim anfangssaldo As Decimal
    3. Dim row As Dts.MonatskostenRow
    4. Dim row1 = DirectCast(DirectCast(MonatskasseBindingSource.Current, DataRowView).Row, Dts.MonatskasseRow)
    5. anfangssaldo = My.Settings.Jahressaldo
    6. For Each drv As DataRowView In FKMonatskasseMonatskostenBindingSource.List
    7. row = CType(drv.Row, Dts.MonatskostenRow)
    8. Dim i As Integer
    9. If i = 0 Then
    10. row.Bestandvorher = anfangssaldo
    11. row.Bestand = anfangssaldo + row.Einnahmen - row.Ausgaben
    12. End If
    13. If i > 0 Then
    14. Dim bestandvorher = CDec(MonatskostenDataGridView.Rows(i - 1).Cells(3).Value)
    15. row.Bestandvorher = bestandvorher
    16. row.Bestand = row.Einnahmen - row.Ausgaben + bestandvorher
    17. End If
    18. i += 1
    19. Next
    20. End Sub
    Bilder
    • DataSet.png

      13,64 kB, 1.152×648, 115 mal angesehen
    • Screenhsot Datagrid.png

      10,9 kB, 1.152×648, 116 mal angesehen

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

    Hmm, reicht mir noch nicht zum schlau draus werden.
    Also die Methode heisst (im wesentlichen) Kassenbestand. Hmm - also tut sie Kassenbestand.

    Ähm, was muss man alles machen, wenn man Kassenbestand tun möchte? (Ich wusste nichtmal, dass Kassenbestand eine Tätigkeit ist).

    Vielleicht schreibst du noch ein Kommentar, wo steht, was sie macht?

    Die Bezeichnung der Methode könnte besser sein, gebe ich zu. Nein , Kassenbestand ist keine Tätigkeit

    Der User soll im Monat anfallende Kosten sowie Einnahmen in das Datagridview eintragen. Das Datagridview hat als Bindingsource die MonatsKasseMonatskostenbindingsource.

    Im Kassenbestand soll folgendes passieren:
    Tageseinnahmen / Tagesausgaben in die Spalte eintragen.
    Bestand ergibt sich aus Einnahmen - Ausgaben + Anfangssaldo. Der Bestand soll den tagesaktuellen Wert in der Kasse anzeigen. Der Bestand darf nicht negativ werden, da man aus einer Kasse mit negativen Wert ja kein Geld ausgeben kann.

    1. Zeile => Einnahmen - Ausgaben + Anfangssaldo
    2. Zeile und folgende => Einnahmen - Ausgaben + Bestand aus vorheriger Zeile

    So kann man kontrollieren, was tagesaktuell in der Kasse war.

    Anfangssaldo und Bestand werden dann in die Parent Datatable für den jeweiligen Monat übernommen.Das Problem ist, das die Werte in der DataRow bestand nie negativ sein dürfen. sonst würde ich einfach die Einzelnen Spalten aufsummieren und gut is.

    Suche einen Weg wie es typisiert geht, untypisiert klappt’s ja.

    Konnte ich das verständlicher rüberbringen?

    silverbob76GE schrieb:

    Im Kassenbestand soll folgendes passieren:
    Tageseinnahmen / Tagesausgaben in die Spalte eintragen.
    Da hakts bei mir schon wieder.
    Weil das hat doch der User schon gemacht. Als er den Kram ins DGV getippt hat.

    silverbob76GE schrieb:

    Anfangssaldo und Bestand werden dann in die Parent Datatable für den jeweiligen Monat übernommen.
    Ähm - die Parent-DataTable hat aber gar keine Spalte Bestand.
    Hi, was mir aufgefallen ist:

    Du machst ein Dim i as Integer und danach ein if i = 0 innerhalb einer For Schleife ...
    i ist immer 0 oder ?

    Da stimmt etwas nicht...

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

    Stimmt, in der parent wäre dann das der endsaldo für den Monat.

    der User trägt Einnahmen ein.
    der User trägt Ausgaben ein.
    der Code berechnet den Bestand in Erster Zeile inklusive Anfangssaldo.
    der Code berechnet den Bestand in zweiter Zeile und folgende inklusive Bestand aus erster Zeile usw.

    stell dir vor, du hast ne Kasse mit Geld drin.
    jetzt bekommst du an einem Tag Geld von jemandem, und kaufst auch ein. Abends zählst du deine Kasse.Der Wert in der Kasse am Abend ist dein Bestandvorher, an den du nächsten Tag weiterzählst.

    @ GerhardW: nein, da ist ein Zähler der mitläuft. Nur die erste Zeile soll den Anfangssaldo bekommen, die zweite Zeile den Endwert aus erster Zeile. Daher am Ende der Schleife i + = 1, und dann next.

    Die Spalte Bestand wird aus den Eingaben in das Datagridview ermittelt. Bei jeder Row_leave feuere ich die Methode ab, so wir die Bestandsspalte immer aktuell gehalten.



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

    sowas ungefähr?

    VB.NET-Quellcode

    1. Private Sub btnKassenbestand_Click(sender As Object, e As EventArgs) Handles btnKassenbestand.Click
    2. Dim anfangssaldo = My.Settings.Jahressaldo
    3. Dim rwVorher = DirectCast(DirectCast(FKMonatskasseMonatskostenBindingSource(0), DataRowView).Row, DTS.MonatskostenRow)
    4. rwVorher.Bestandvorher = anfangssaldo
    5. rwVorher.Bestand = anfangssaldo + rwVorher.Einnahmen - rwVorher.Ausgaben
    6. For i = 1 To FKMonatskasseMonatskostenBindingSource.Count - 1
    7. Dim row = DirectCast(DirectCast(FKMonatskasseMonatskostenBindingSource(i), DataRowView).Row, DTS.MonatskostenRow)
    8. row.Bestandvorher = rwVorher.Bestand
    9. row.Bestand = row.Bestandvorher + row.Einnahmen - row.Ausgaben
    10. rwVorher = row
    11. Next
    12. End Sub
    Genau das ist es. Ich wußte nicht, das man beim doppelten Directcast einfach den Index an die bindingsource hängen kann. Seit zwei Wochen suche ich nach ner Lösung, aber da wäre ich nie drauf gekommen. Hab mit BindingSourcePosition und BindingSource.Current rumhantiert, war natürlich totaler Kokolores, aber wenn man nicht weiter weiß probiert man alles aus.

    Du hast mi den Abend gerettet. Vielen Dank dafür 8o .

    Jetzt muss ich den Bestan nur noch in den Monat übernehmen, und an den nächsten Monat weitergeben. Dann hab ichs.
    Es stellt sich heraus, das die Berechnung für den Monat etwas schwieriger ist als gedacht.

    Der Code oben funktioniert einwandfrei. Allerdings muss ich den Endsaldo der ersten Zeile an die Datatable Monatskasse (Parent) weitergeben. Dann soll wieder mit dem Code aus Post 9 gerechnet werden, wobei der Anfangssaldo dieses mal der Ensaldo der ersten DataRow ist.

    Folgendes soll passieren:

    Das Endsaldo aus Monat 1 soll als Anfangssaldo in Monat 2 verwendet werden. Das klappt beim ersten Monat, auch beim zweiten Monat. Beim dritten Monat gehst dann nimmer.
    Wenn man in der Parten Table die Zeilen durchklickt, stimmen die Summen nicht mehr und irgendwann kommt ne Fehlermeldung.

    Der Code müsste in etwa lauten:

    Hab schon versucht, den Parenttable mit

    VB.NET-Quellcode

    1. Private Sub Button5_Click_1(sender As Object, e As EventArgs) Handles Button5.Click
    2. If MonatskasseBindingSource.Position = 0 Then
    3. Dim anfangssaldo = My.Settings.Jahressaldo
    4. Dim rwVorher = DirectCast(DirectCast(FKMonatskasseMonatskostenBindingSource(0), DataRowView).Row, Dts.MonatskostenRow)
    5. rwVorher.Bestandvorher = anfangssaldo
    6. rwVorher.Bestand = anfangssaldo + rwVorher.Einnahmen - rwVorher.Ausgaben
    7. For i = 1 To FKMonatskasseMonatskostenBindingSource.Count - 1
    8. Dim row = DirectCast(DirectCast(FKMonatskasseMonatskostenBindingSource(i), DataRowView).Row, Dts.MonatskostenRow)
    9. row.Bestandvorher = rwVorher.Bestand
    10. row.Bestand = row.Bestandvorher + row.Einnahmen - row.Ausgaben
    11. rwVorher = row
    12. Next
    13. Dim zeilekasse = DirectCast(DirectCast(MonatskasseBindingSource(0), DataRowView).Row, Dts.MonatskasseRow)
    14. zeilekasse.Anfangssaldo = anfangssaldo
    15. zeilekasse.Endsaldo = rwVorher.Bestand
    16. Else
    17. Dim a As Integer
    18. For a = 1 To MonatskasseBindingSource.Count - 1
    19. Dim zeilekasse0 = DirectCast(DirectCast(MonatskasseBindingSource(0), DataRowView).Row, Dts.MonatskasseRow)
    20. Dim zeilekasse1 = DirectCast(DirectCast(MonatskasseBindingSource(a), DataRowView).Row, Dts.MonatskasseRow)
    21. Dim anfangssaldo = zeilekasse0.Endsaldo
    22. Dim rwVorher = DirectCast(DirectCast(FKMonatskasseMonatskostenBindingSource(0), DataRowView).Row, Dts.MonatskostenRow)
    23. rwVorher.Bestandvorher = anfangssaldo
    24. rwVorher.Bestand = anfangssaldo + rwVorher.Einnahmen - rwVorher.Ausgaben
    25. For i = 1 To FKMonatskasseMonatskostenBindingSource.Count - 1
    26. Dim row = DirectCast(DirectCast(FKMonatskasseMonatskostenBindingSource(i), DataRowView).Row, Dts.MonatskostenRow)
    27. row.Bestandvorher = rwVorher.Bestand
    28. row.Bestand = row.Bestandvorher + row.Einnahmen - row.Ausgaben
    29. rwVorher = row
    30. Next
    31. zeilekasse1.Anfangssaldo = zeilekasse0.Endsaldo
    32. zeilekasse1.Endsaldo = rwVorher.Bestand
    33. Next
    34. End If
    35. End Sub


    Hab nen Denkfehler, oder das ist mir ein fach zu hoch. Bin für jeden Ansatz dankbar.
    Imo sind das zwei Vorgänge, die du trennen solltest, und jeweils eine Methode für schreiben:
    • BerechneMonatskostenSalden()
    • BerechneMonatskasseSalden()
    Für MonatskostenSalden habich ja eine Methode geliefert - die soll aus dem Klick raus und eine eigene werden.

    Dann ist die Benennung der Tabellen äusserst abwegig.
    "Monatskosten" - was soll das sein?
    Ich krieg meine Monate immer ganz umsonst, vom lieben Gott persönlich - muss ich nix für bezahlen.

    In meiner Welt - was bei dir da unter "Monatskosten" firmiert - das wäre bei mir eine Buchung.
    Und deine "Monatskasse" würde ich vlt. BuchungsMonat nennen oder sowas - weiss ich auch nicht recht.

    Also wenn du das umfrickelst auf vernünftige Namen, und die Logik aus den Klick-Handlern verlagerst in eine Methode, sinnvoll benamt, dann probier ich nochmal die Methode BerechneMonatsSalden()(die du ja anlegen sollst - leer) mit Inhalt zu füllen.
    Hi EdR

    vorweg, Danke für deine Antwort. Hab beide DataTable umbenannt:

    Monatskasse => Buchungsmonat
    Monatskosten => Buchung

    Hab eine Methode BerechneBuchungen() geschrieben, der Code aus deinem Post 9.

    VB.NET-Quellcode

    1. Private Sub BerechneBuchungen()
    2. Dim anfangssaldo = My.Settings.Jahressaldo
    3. Dim rwVorher = DirectCast(DirectCast(FKBuchungenBindingSource(0), DataRowView).Row, Dts.BuchungRow)
    4. rwVorher.Bestandvorher = anfangssaldo
    5. rwVorher.Bestand = anfangssaldo + rwVorher.Einnahmen - rwVorher.Ausgaben
    6. For i = 1 To FKMonatskasseMonatskostenBindingSource.Count - 1
    7. Dim row = DirectCast(DirectCast(FKBuchungenBindingSource(i), DataRowView).Row, Dts.BuchungRow)
    8. row.Bestandvorher = rwVorher.Bestand
    9. row.Bestand = row.Bestandvorher + row.Einnahmen - row.Ausgaben
    10. rwVorher = row
    11. Next
    12. End Sub


    Die zweite Methode nennt sich BerechneMonatsbuchungen()

    VB.NET-Quellcode

    1. Private Sub BerechneMonatsbuchungen()
    2. End Sub


    So weit so gut. Hoffe das ist in etwa das, was du meintest.

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

    also ich hab da mal was zusammengeschustert, bin ja gespannt, ob du dahinterkommst, wie's funktioniert.
    Es geht um diesen Code:

    VB.NET-Quellcode

    1. Private Sub BerechneSalden()
    2. BerechneBuchungen()
    3. BerechneMonatsbuchungen()
    4. End Sub
    5. Const _InvalidRows As DataRowState = DataRowState.Deleted Or DataRowState.Detached
    6. Private Sub BerechneBuchungen()
    7. Dim anfangssaldo = 50D ' oder my.settings
    8. Dim buchungen = Aggregate rw In Dts.Buchung Where 0 = (rw.RowState And _InvalidRows) Order By rw.Datum Into ToList
    9. Dim rwVorher = buchungen(0)
    10. rwVorher.BestandVorher = anfangssaldo
    11. rwVorher.Bestand = anfangssaldo + rwVorher.Einnahmen - rwVorher.Ausgaben
    12. For i = 1 To buchungen.Count - 1
    13. Dim row = buchungen(i)
    14. row.BestandVorher = rwVorher.Bestand
    15. row.Bestand = row.BestandVorher + row.Einnahmen - row.Ausgaben
    16. rwVorher = row
    17. Next
    18. End Sub
    19. Private Sub BerechneMonatsbuchungen()
    20. For Each rwMonat In Dts.BuchungsMonat.Where(Function(x) 0 = (x.RowState And _InvalidRows))
    21. Dim buchungen = rwMonat.GetBuchungRows
    22. If buchungen.Length = 0 Then Continue For
    23. rwMonat.Anfangssaldo = buchungen(0).BestandVorher
    24. rwMonat.Endsaldo = buchungen.Last.Bestand
    25. Next
    26. End Sub

    Dateien
    Erst mal Danke das du dir das überhaupt antust.

    Das ist alles ziemlich Neuland für mich, und übersteigt auf alle Fälle meine Kenntnisse, bin noch, wenn ich mir das anschaue extremster Amateur.

    Die Zeile "Const _InvalidRows..." : denke da gehts darum, das wenn die Eigenmschaft der DataRow sich ändert (neue Einträge, Einträge gelöscht, etc.), die Änderungen in einer Konstanten gespeichert werden.

    In Zeile 10: Aggregate (LINQ?) bietet die Möglichkeit, eine Liste zu durchlaufen (alle DataRows?), wobei der letzte Wert der Liste übernommen und für die nächste Zeile in der Liste zwischengespeichert und weiterverarbeitet wird.
    Mit ToList wird das Ergebnis der Liste zwischengespeichert?

    buchungen(0): damit erreichst du, das die erste DataRow (Zeile Null) anders als alle weiteren DataRows innerhalb der BindingSource gerechnet wird, da diese auf einer Variablen (my.settings => Anfangssaldo eingegeben durch den User) basiert.
    buchungen(i): die restlichen DataRows in der BindingSource werden anders als die erste Zeile berechnet, da Startwert = 1. Wenn ich mich nicht irre, kommt hier aggregate zum Zuge, da das Anfangssaldo aus Zeile Null "mitgenommen" wird.

    GetBuchungRows speichert die Werte der durchlaufenen Zeilen in einem Array.

    Musste viel googlen, um zu verstehen was du da gemacht hast. Kann nicht sagen, das ich verstanden habe, wie das kombiniert wird.

    Deine angehängte Datei kann ich in Visual Studio nicht öffnen, der meckert wegen der Zeile im fmrHaushaltsbuch.Designer => " Me.dtsHaushaltsbuch.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema".

    Hab da noch ein Problem. Wenn ich den Code von dir nutze funzt alles, wie es soll. Das setzt voraus, das alle Buchungen dem Datum nach korrekt eingepflegt werden. Wenn ich jdeoch nachträglich noch ne Buchung vornehmen will, die sagen wir mal vom Datum her in der Mitte des Monats wäre, dann stimmt der Endbestand nicht, zumindest nicht bei mir. Kann man das so berechnen lassen, das das Array vor Berechnung der Buchungen die BindingSource nach Datum sortiert, damit die tagesaktuellen Buchungen korrekt sind?

    silverbob76GE schrieb:

    Die Zeile "Const _InvalidRows..." : denke da gehts darum, das wenn die Eigenmschaft der DataRow sich ändert (neue Einträge, Einträge gelöscht, etc.), die Änderungen in einer Konstanten gespeichert werden.
    nein Const ist einfach die Deklaration einer konstanten Zahl, letztendlich.
    DataRowState.Deleted ist eine Zahl, DataRowState.Detached ist eine andere Zahl, und beide bitweise vereinigt sind DataRowState.Deleted Or DataRowState.Detached.
    Die Zahlen sind besondere Zahlen, sie haben nämlich lesbare Namen. Solche Zahlen nennt man Enum.
    Mit Enums kann man sehr schön mehrere diskrete Zustände ausdrücken, also nicht nur ja oder Nein.
    Etwa eine DataRow mit DataRowState.Deleted ist gelöscht, eine mit DataRowState.Detached ist noch in gar keiner DataTable enthalten. (Und eine mit DataRowState.Added ist neu hinzugekommen).
    Und mit diesem Test kann man prüfen, dass keines von beidem zutrifft: 0 = (rw.RowState And (DataRowState.Deleted Or DataRowState.Detached)).
    Da das sehr länglich wird, habe ich den Ausdruck DataRowState.Deleted Or DataRowState.Detached in obige Konstante zusammengefasst: _InvalidRows.
    Besorg dir ein gut Buch - Kühnel/Leibhard oder Löffelmann, beide gibts im INet umsonst.
    Lies das Kapitel zu Enum/Enumerationen nach - ohne das richtig zu verstehen kannst du in vb.net - Datenverarbeitung nichts werden.
    Aggregate rw In Dts.Buchung Where 0 = (rw.RowState And _InvalidRows) Order By rw.Datum Into ToList
    Ja, so sind Linq-Ausdrücke. Kann man von vorne nach hinten verstehen:
    Aggregate rw In Dts.Buchung führt v.a. die Laufvariable rw ein, die durch Dts.Buchung läuft, und zusammensammelt, was im weiteren definiert wird.
    Where 0 = (rw.RowState And _InvalidRows) ist ein Filter, der nur die rws passieren lässt, deren Rowstate weder Deleted noch Detached ist.
    Order By rw.Datum - selbsterklärend.
    Into ToList hier wird angegeben, dass in eine List(Of BuchungRow) aggregiert wird - List(Of BuchungRow) ist also der Datentyp des Gesamt-Ausdrucks, und somit auch Datentyp der Variable buchungen.

    silverbob76GE schrieb:

    buchungen(0): damit erreichst du, das die erste DataRow (Zeile Null) anders als alle weiteren DataRows innerhalb der BindingSource gerechnet wird
    garnicht.
    Die BindingSource kommt in meim Code garnet vor. Schau nochmal hin.

    Ich berechne sämtliche BuchungRows (ausser die gelöschten und detachten)

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

    Wow, das war sehr ausführlich. Das sind viele neue Begriffe, die ich erst einmal verstehen muss, und vor allem wann ich die anwenden kann.
    Ein einfaches DataSet mit DataTables kriege ich hin, mit einer For-Schleife durchlaufen auch.

    Aber das ist schon sehr viel komplexer. Werd mir die Bücher herunterladen und zusehen, das ich die so gut es geht durcharbeite.

    Hast du ne Idee zu dem Problem mit Eingabe von Buchungen, die als letzter Datensatz eingefügt werden, aber vom Datum her quasi mittig zwischen zwei Datumsen liegen? Die Berechnung des Tagesbestandes ist nicht korrekt, da die Methode die Buchungen nach Eingabe und nicht nach Datum errechnet.

    Edit:

    ich noch mal. Ist doch noch ein kleiner Fehler drin. Wenn man eine Buchung nachträglich mit jüngerem Datum als die letzte Buchung einträgt, ist diese ja in der letzten DataRow.
    Vom Buchungstag her müsste diese Buchung weiter oben stehen. Dadurch ändert sich natürlich auch der Bestand, und der übergebene Wert für die Montasbuchung.
    Wie könnte ich das anpassen? Hab mal ein Screenshot zum besseren Verständnis angehängt.
    Bilder
    • BerechneSalden.png

      13,35 kB, 1.152×648, 96 mal angesehen

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

    Hättest du hier noch ne Idee, wie ich das in den Griff bekommen kann?

    Wenn ein Eintrag mit früherem Datum erfolgt,als der letzte Eintrag, dann passen die Tagesbestände nicht mehr. Auch der Monats-Endsaldo ist dann falsch.
    Der Endsaldo wird auf Grundlage des zuletzt eingebeben Buchungssatzes ermittelt. Wenn diese Buchung jedoch vom Datum her vor dem vorherigen liegt, passen die Bestände nicht. Im Screenshot in Post 18 dargestellt.