verwendetes Datenbanksystem: <Sql Server Ce>
Hallo,
ich hab mal wieder ein Problem. Meine Tabelle sieht so aus:
id Datum Betrag Kontostand
1 19.5.2012 100 100
2 20.5.2012 400 500
3 21.5.2012 50 550
Also der der Kontostand wird immer so berechnet: Betrag + Kontostand des vorherigen Eintrags.
Es sollte aber immer der Kontostand des Eintrags mit dem nächstgeringeren Datums addiert werden.
So sieht es jetzt aus:
id Datum Betrag Kontostand
1 19.5.2012 100 100
2 21.5.2012 400 500
3 20.5.2012 50 550
So sollte es aussehen:
id Datum Betrag Kontostand
1 19.5.2012 100 100
2 21.5.2012 400 550
3 20.5.2012 50 150
Wie löst man das Am besten?
Ich hätte diesen Lösungsvorschlag:
DataView view = new DataView(dataset.Tables["Kontostand"]);
view.Sort = "datum";
for (int i = 0; i < view.ToTable().Rows.Count; i++)
{
if (i <= 0)
{
view.ToTable().Rows[i]["kontostand"] = view.ToTable().Rows[i]["betrag"].ToString();
}
else
{
view.ToTable().Rows[i]["kontostand"] = Convert.ToDecimal(view.ToTable().Rows[i - 1]["kontostand"].ToString()) + Convert.ToDecimal(view.ToTable().Rows[i]["betrag"].ToString());
}
}
dataset.Tables["Kontostand"] = view.ToTable(); //Hier liegt das Problem. Eigenschaft ist schreibgeschützt.
Gibt es noch bessere Wege dieses Problem zu lösen?
Gruss Niklas
Achtung: Ich bin Anfänger! Es besteht die Möglichkeit auf falsche Antworten!
A programmer is just a tool which converts caffeine into code.
Wie soll dein Lösungsvorschlag mit dem Problem zusammenhängen?
Du sortierst da die Tabelle. Deswegen ist die aber noch nicht auch in dieser Reihenfolge abgespeichert.
mit dem nächstgeringeren Datums
nächsthöherem...
Und wie hängt das ganze mit dem Thema dieses Beitrags zusammen?
Ich könnte mir nach mehrmaligem lesen vorstellen, du hast die Beträge und möchtest anschließend zu jeder Zeile den Betrag ausrechnen?
Dazu würde ich mir die Rows alle sortieren so wie du das schon machst. Dann durchläufst du sie und rechnest jeweils den Kontostand aus, trägst ihn ein und lässt am Ende wieder die Tabelle abspeichern.
Hallo GeneralKampfKeks
Ehrlich gesagt würde ich den Kontostand nicht ausgerechnet abspeichern, ausser du hast Millionen von Datensätzen.
Vorgeschlagene Möglichkeiten:
1.
Tabelle Einnahmen, Tabelle Ausgaben.
2.
Boolean Flag ob Einnahme oder Ausgabe....
3.
Ausgaben mit einem (-) versehen.
Du hättest dann den Vorteil, den Betrag dynamisch auszurechnen :
Du kannst dann sowas machen wie Sum(Einnahmen)-Sum(Ausgaben).
Beste Grüsse
Diräkt
Ich könnte mir nach mehrmaligem lesen vorstellen, du hast die Beträge und möchtest anschließend zu jeder Zeile den Betrag ausrechnen?
Dazu würde ich mir die Rows alle sortieren so wie du das schon machst. Dann durchläufst du sie und rechnest jeweils den Kontostand aus, trägst ihn ein und lässt am Ende wieder die Tabelle abspeichern.
Ja so habe ich es bis jetzt gemacht, nur ich weis nicht wich ich die neue Tabelle in die alte schreibe wie im beispiel oben.
dataset.Tables["Kontostand"] = view.ToTable(); //Hier liegt das Problem. Eigenschaft ist schreibgeschützt.
Achtung: Ich bin Anfänger! Es besteht die Möglichkeit auf falsche Antworten!
A programmer is just a tool which converts caffeine into code.
Das hier
view.ToTable().Rows_["kontostand"] = view.ToTable().Rows_["betrag"].ToString();
schreibt doch schon die Daten in deine Table. Die müsstest du dann nur wieder in die DB schreiben.
Ganz dringender Tip. Lass diese ständigen To... Aufrufe weg.
Eine View hat auch Rows.
...["kontostand"] = ....ToString(); ein Kontostand ist ganz sicher kein String.
Convert.ToDecimal(view.ToTable().Rows[i - 1]["kontostand"].ToString())
Die Row lässt sich sicher in decimal oder double oder so casten. Aber dochnicht in String umwandeln und den dann wieder in was anderes zurückwandeln.
Wenn Cast nicht geht, ist was falsch geplant.
Ich weiß das wird sicher wieder auf offtopic gesetzt, aber ich kann sowas einfach nicht sehen 😃