Max Value eine Spalte einer Datatable eines Dataset

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Max Value eine Spalte einer Datatable eines Dataset

    Moin,

    bevor mich EDR zu Recht mal wieder unverblümt mit aller Macht auf den Scheiß den ich mache hinweist, frag ich lieber gleich :D

    Vorhanden ist ein typ. Dataset, mit einer Tabelle Kalkulationen. In dieser Tabelle Kalkulationen gibt es 3 Spalten,

    ID als Int -> Prim.Key,
    Nummer als String,
    Kunde als Int

    Die Tabelle ist über eine Bindingsource an ein DGV gebunden. In dem DGV darf der Anwender munter Rows adden und deleten. Wen eine neue Row geadded wird, soll das Feld Nummer automatisch dem Max wert der Column Nummer + 1 erhalten.
    Durch Googeln bin ich schließlich zu diesm Ansatz gekommen:

    Quellcode

    1. Dataset.Kalkulationen.AsEnumerable().Sum(Function(x) If(x.IsNull("Nummer"), 0, Convert.ToInt32(x("Nummer"))))
    Dafür bekomm ich bestimmt gleich ne Klatsche :D, ja gleich 2 Mal, warum Nummer nen String ist weiß ich leider auch nicht, hatte nen Grund, ist hier aber absulut doof.

    Mein problem ist nun, falls der Anwender eine Row löscht und danach eine neue erstellt, fliegt mir der Code oben mit einer 'DeletedRowInaccessibleException' um die Ohren. Ich vermute mal, irgendwer wird jetzt sowas sagen wie "Zu recht".

    Beim Suchen nach dem Fehler bin ich auf Fälle gestossen, bei denen versucht wurde auf ähneliche Art .count zu verwenden. Antwort/Lösung war hier, das .count auf das Bindingsource zu machen, da das wohl die gelöschten Roews nicht mehr enthält und somit auch den Fehler nicht werfen kann.
    Ich vermute für mein Max Value sollte ich einen ähnlichen Weg einschlagen, finde aber keinen Ansatz wie das mit dem Bindingsource gehen soll und google bringt mich nur zu Lösungen mit der DataTable, die ich ja schon habe.

    Kan mir wer mit nem Ansatz helfen?

    *Topic verschoben*

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

    weil das Objekt keine .max Methode hat, bzw ich sie nicht gefunden hab.

    Das mit der rowstate hatte ich mir auch schon überlegt, aber ich dachte nach dem Thread mit dem .count, wo EDR eskaliert ist, das man sowas nicht aufs Dateset sondern auf Die Bindingsource macht, weil da dann keine DeletedRows drin sind, dachte ich logisch wäre es dann auch hier das aufs BS zu machen, damit man nicht auf rowstate prüfen muss.

    DianonForce schrieb:

    warum Nummer nen String ist weiß ich leider auch nicht, hatte nen Grund, ist hier aber absulut doof.
    Dann wird irgendwann, also jetzt, die Frage aufkommen: Warum änderst Du es nicht ab, bevor es zu noch mehr Chaos kommt?

    DianonForce schrieb:

    weil das Objekt keine .max Methode hat
    Das ist richtig, das Objekt (eh, welches eigentlich?) hat keine Max-Methode. aber für ne Sammlung von gleichen Objekten gibt's ne Max-Extension, genauso wie es die Sum-Extension gibt. Wenn Du System.LINQ als importierten Namespace hast, taucht Max auch auf.

    VB.NET-Quellcode

    1. DeinDataSet.Kalkulationen.Max(Function(x)...

    btw: Warum arbeitest Du mit AsEnumerable?
    Warum wird ein Kunde durch einen Integer repräsentiert? Ne Kundennummer oder Kunden-ID, ja ok, aber ein ganzer Kunde?
    Mit String-Identifizierung einer Column wie mit IsNull("Nummer") zu arbeiten, stellt insofern ein Problem dar, weil eine Namensänderung der Spalte vom Compiler an der Stelle nicht erkannt wird und es dann zur Laufzeit erst mit ner Exception quittiert wird. Arbeite stattdessen mit: String.IsNullOrEmpty(x.Nummer) - falls Du Nummer als String behalten willst.
    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.