Wert aus Colum in weiterer Column "Speichern"

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Wert aus Colum in weiterer Column "Speichern"

    Hallo zusammen,

    gegeben ist ein typ. Dataset.



    Beim anlegen eines RechnungsPostens wird der Artikelpreis aus der Tabelle Artikel in EinzelpreisArtikel der Tabelle RechnungPosten übernommen.
    Wenn ich aber nun den Preis des Artikels änder, änder sich auch der Preis bei den Posten. Dummerweise auch Rückwirkend für alle älteren. Das darf natürlich nicht sein.
    Für diesen Fall dachte ich mir lege ich eine weitere Column an und speichere den Wert dort.
    Versuch habe ich dieses im Codebehind des DataSets mit folgendem Code.

    VB.NET-Quellcode

    1. ​Partial Class BillDts
    2. Partial Public Class RechnungPostenDataTable
    3. Private Sub RechnungPostenDataTable_TableNewRow(sender As Object, e As DataTableNewRowEventArgs) Handles Me.TableNewRow
    4. With CType(e.Row, RechnungPostenRow)
    5. .EinzelpreisArtikel = .EinzelpreisArtikelNetto
    6. End With
    7. End Sub
    8. End Class
    9. End Class


    Bei EinzelpreisArtikelNetto habe ich AllowDBNull auf False und den DefaultValue auf 0 gesetzt.

    Dummerweise wird immer der Wert 0 gesetzt.
    Was habe ich falsch gemacht?
    Gibt es andere Wege mein Vorhaben zu realisieren?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Bin nicht so der typ. Dataset Experte, daher mal die Frage an dich, ob TableNewRow das richtige Event für dein Vorhaben ist.

    Wäre es nicht besser, das Aktualisieren des Artikelpreises zu unterbinden? Ist doch albern die selben Daten in der gleichen Tabelle 2 mal zu speichern...
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich bin mir ja auch nicht sicher ob es der richtige weg ist. Der wert wird auch nicht übernommen. Das event wird das falsche sein denke ich.
    Klar, solange kein artikel gewählt ist kann kein Preis übernommen werden. Somit wird immer der defaultwert gesetzt.

    Wie könnte ich denn das aktualisieren unterbinden? Wäre ein versuch wert.

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

    Das TableNewRow-Ereignis kommt ganz zum Anfang. Da steht dann in der Zeile noch gar kein Wert drin. Daher ist das zu früh. Im RechnungPostenRowChanged-Ereignis bist Du m.E. richtig. Übergib bei Neuerstellung einer Row für den EinzelpreisArtikel z.B. den Wert -1. Und im tDS-CodeBehind schreibst Du dann:

    VB.NET-Quellcode

    1. If e.Row.EinzelpreisArtikel = -1 Then e.Row.EinzelpreisArtikel = [WertAusDerArtikelTabelle]

    Dadurch wird das erstmal nur bei Erstellung aus der Tabelle übernommen und als eigener Wert gespeichert. Sollte eigentlich auch das Speichern und Laden überleben, aber leider hab ich gerade zuwenig Zeit, um das zu testen.
    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.

    Akanel schrieb:

    Wie könnte ich denn das aktualisieren unterbinden?

    Denke das ist der richtige Ansatz zur Lösung. Da steig ich allerdings aus. Typ. DataSet ist nicht mein Fachgebiet. Denke @ErfinderDesRades, der Meister des Typ. DataSet, kann hier weiter helfen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Allerdings bin ich grad verwirrt. Wie steht denn überhaupt jene Spalte in Verbindung mit der ArtikelTabelle? Dass die RechnungPosition ne ArtikelID hat und so an die andere Tabelle gebunden ist, ist mir klar. Aber hast Du auch noch ne direkte Verbindung zwischen den Preisspalten?
    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.
    Der Einzelpreis in der Tabelle RechnungPosten hat eine Expression.

    Parent(FK_Artikel_RechnungPosten).Einzelpreis

    Bin grad nur am Handy, daher sorry das der code nicht in tags steht.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ehm ... ja. Sorry, aber was erwartest Du? Mit ner festen Expression kann das natürlich nix werden. Du müsstest schon in diesem Punkt die Tabellen voneinander trennen und mit dem von mir genannten Code arbeiten, um das hinzubekommen, indem Du die Verbindung nur über die Artikel-ID hast und darüber zu Beginn Dir den Preis abholst.
    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.
    Habe die Expression entfernt und den DefaultValue der EinzelpreisArtikel Spalte auf 0 gesetzt.
    Dann im CodeBehind folgenden Code probiert.

    VB.NET-Quellcode

    1. Partial Public Class RechnungPostenDataTable
    2. Private Sub RechnungPostenDataTable_RechnungPostenRowChanging(sender As Object, e As RechnungPostenRowChangeEvent) Handles Me.RechnungPostenRowChanging
    3. If e.Row.EinzelpreisArtikel = 0 Then e.Row.EinzelpreisArtikel = e.Row.ArtikelRow.Einzelpreis
    4. End Sub
    5. End Class

    Dabei kommt folgende Exception:
    ​System.Data.InRowChangingEventException: "Ein vorgeschlagener Wert kann nicht im RowChanging-Ereignis geändert werden."

    VaporiZed schrieb:

    Im RechnungPostenRowChanged-Ereignis bist Du m.E. richtig.

    ChangED, nicht ChangING
    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.