Datensatz Update

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von tragl.

    Datensatz Update

    Hallo,

    ich habe eine Datenbank mit mehreren Tabellen (Lagerübersicht, Cyan, Gelb...) . Auf einer Form möchte ich einen neuen Datensatz in Tabelle "Lagerübersicht" speichern. Dabei wird bei Öffnung dieser Form eine Combobox mit den Spaltenwerten einer anderen Tabelle befüllt, je nach dem um Welche Artikelgrupe (Label8.Text) es sich handelt.

    VB.NET-Quellcode

    1. If Label8.Text = "Cyan" Then
    2. CodeComboBox.DataSource = CyanBindingSource
    3. CodeComboBox.DisplayMember = "Tonercode"
    4. CodeComboBox.ValueMember = "Tonercode"
    5. End If

    Nun kann man einen dieser "Tondercodes" auswählen und dazu eine Einbuchung durchführen.

    VB.NET-Quellcode

    1. 'Datenbanverbindung
    2. Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Printertool.mdb")
    3. con.Open()
    4. Dim Anfangsbestand As Int32 = CInt(TextBox1.Text)
    5. Dim Buchungsbestand As Int32 = CInt(BuchungsmengeTextBox.Text)
    6. If Buchungsbestand > Anfangsbestand Then
    7. MessageBox.Show("Die eingegebene Buchungsmenge würde den Lagerbestand unterschreiten!")
    8. Else
    9. Dim Lagerbestand = CInt(Anfangsbestand - Buchungsbestand)
    10. LagerstandTextBox.Text = Lagerbestand.ToString
    11. 'Aktualisierung des neuen Lagerstandes
    12. Dim d As OleDbCommand = New OleDbCommand("UPDATE '" & Label8.Text & "' SET `Lagerstand`='" & LagerstandTextBox.Text & "' WHERE '" & Label11.Text & "'='" & CodeComboBox.Text & "'", con)
    13. Dim drv = DirectCast(Me.LagerübersichtBindingSource.Current, DataRowView)
    14. Me.Validate()
    15. drv("Benutzer(Datensatzinfo)") = Environment.UserName
    16. drv("Datum(Datensatzinfo)") = heutigesDatum
    17. drv("Zeit(Datensatzinfo)") = jetzigeUhrzeit
    18. Me.LagerübersichtBindingSource.EndEdit()
    19. Me.TableAdapterManager.UpdateAll(Me.PrintertoolDataSet)
    20. MessageBox.Show("Daten wurden gespeichert!")
    21. End If


    Es funktioniert alles, bis auf der Update-Befehl. Ich möchte, dass der Lagerstand in der Tabelle (definiert durch Label8) bei dem Datensatz (definiert durch Code = CodeComboBox) mit dem neuen überschrieben wird.
    Die Werte aus dem Update-Befehl wurden schon per Setzung eines Haltepunktes kontrolliert und eine Fehlermeldung erscheint ebenso nicht.
    tja, du bastelst da ein schönes Command, führst es aber nicht aus.
    Stattdessen führst du TableAdapter.UpdateAll aus - der TableAdapter weiss natürlich nix von deinem schönen Command.
    Dringend empfohlen:
    Mach deine Änderungen einfach an der typisierten DataTable im PrintertoolDataSet, wo du was ändern willst. Und führe dann TableAdapter.UpdateAll aus.
    bastel dir keine selbstgebastelten Commands zusammen.
    @ErfinderDesRades Ich benutze diese Form um Einträge in Tabelle 'Lagerübersicht' einzutragen. Die TextBox 'neuer Lagerbestand' soll nun den Lagerbestand des ausgewählten Datensatzes (ComboBox) der jeweiligen Tabelle (unten an Form deklariert) überschreiben.
    Bilder
    • Bild_2020-11-04_130555.png

      31,11 kB, 525×677, 99 mal angesehen
    • Bild_2020-11-04_130648.png

      25,34 kB, 887×373, 102 mal angesehen

    uNbRaKe schrieb:

    Die TextBox 'neuer Lagerbestand' soll nun den Lagerbestand des ausgewählten Datensatzes (ComboBox) der jeweiligen Tabelle (unten an Form deklariert) überschreiben.
    Ich kann das nicht sehen, und weiss so nicht, welche Spalte in welchem Datensatz in welcher Tabelle du verändern willst.
    Ah - ich vermute Tabelle Lagerübersicht.Lagerbestand.
    Fehlt mir nur noch, wie die Combobox da einen bestimmten Lagerübersicht-Datensatz auswählt.



    ach nee warnix. Lagerbestand kommt ja nirgends vor, und Lagerstand kommt überall vor.
    Ich blick nicht durch, nur soviel: Bring dieses Datenmodell in Ordnung - darauf kann man imo keine Anwendung aufbauen.

    Du musst unbedingt die Grundlagen der Datenmodellierung erlernen - die Tabellen haben ja alle dieselben Spalten - aber keinerlei Relation untereinander.
    Im Datenbank-Bereich habich Tut zu Datenmodellierung, und dort ist auch auf ein besseres tut auf CodeProject verlinkt.

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

    VB.NET-Quellcode

    1. If Label8.Text = "Cyan" Then
    2. CodeComboBox.DataSource = CyanBindingSource
    3. CodeComboBox.DisplayMember = "Tonercode"
    4. CodeComboBox.ValueMember = "Tonercode"
    5. End If

    Dadurch habe ich einen bestimmten Datensatz aus Tabelle Cyan in dem Fall, da ich ja so einen Tonercode auswähle. Und zu diesem Datensatz möchte ich den Lagerstand überschreiben.

    Im Beispielbild mit Tabelle Cyan. Ich möchte nun das der Wert der TextBox "neuer Lagerbestand" (0) jetzt den Lagerbestand des Tonercodes 1 in Tabelle Cyan überschreibt.
    Bilder
    • Bild_2020-11-04_134300.png

      28 kB, 899×427, 95 mal angesehen
    vlt sowas:

    VB.NET-Quellcode

    1. Private Sub ChangeCyanLagerstand()
    2. Dim rwCyan = DirectCast(DirectCast(CyanBindingSource.current, DataRowView).Row, CyanRow)
    3. rwCyan.Lagerstand = LagerstandTextBox.Text
    4. Me.TableAdapterManager.UpdateAll(Me.PrintertoolDataSet)
    5. MessageBox.Show("Daten wurden gespeichert!")
    6. End Sub
    Oh Mann, du zeigst in deinen Bildern auch keine Tabelle Cyan, also möglicherweise gibt es keine CyanRow, aber das muss man annehmen, denn du hast eine Bindingssource mit dem Namen CyanBindingsource.
    Wenn du nicht alles zeigst und @ErfinderDesRades also raten musste, dann könntest du ja das Umsetzen auf deine Datenstruktur übernehmen, oder nicht?
    @Dksksm Ich habe auf dieser Form keine Tabelle Cyan. Die Bindingssource habe ich, da ich mit dieser die ComboBox anhand dieser befülle.


    Es geht ja darum dass ich den Lagerstand des ausgewählten Datensatzes per CodeComboBox anpassen möchte. Diese CodeComboBox ist je nach dem ob Cyan, Magenta, Geld oder Schwarz gewählt wurde mit den jeweilen Tonercodes befüllt.Und dies mache ich so.

    VB.NET-Quellcode

    1. If Label8.Text = "Cyan" Then
    2. CodeComboBox.DataSource = CyanBindingSource
    3. CodeComboBox.DisplayMember = "Tonercode"
    4. CodeComboBox.ValueMember = "Tonercode"
    5. End If
    6. If Label8.Text = "Gelb" Then
    7. CodeComboBox.DataSource = GelbBindingSource
    8. CodeComboBox.DisplayMember = "Tonercode"
    9. CodeComboBox.ValueMember = "Tonercode"
    10. End If
    11. If Label8.Text = "Magenta" Then
    12. CodeComboBox.DataSource = MagentaBindingSource
    13. CodeComboBox.DisplayMember = "Tonercode"
    14. CodeComboBox.ValueMember = "Tonercode"
    15. End If
    16. If Label8.Text = "Schwarz" Then
    17. CodeComboBox.DataSource = SchwarzBindingSource
    18. CodeComboBox.DisplayMember = "Tonercode"
    19. CodeComboBox.ValueMember = "Tonercode"
    20. End If


    Jetzt stehen je nach dem welche Farbe ausgwählt wurde, zB M100-M109, S100-S109, C100-109 oder G100-109 in der CodeComboBox.

    Jeder Tonercode hat ja seinen eigenen datensatz also Lagerstand und diesen möchte ich beim speichern überschreiben. Gleichzeitig soll die Buchung eben im Lagerübersichtsdatagridview aufgenommen werden und in der dazugehörigen Tabelle Lagerübersicht gespeichert werden.

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

    uNbRaKe schrieb:

    Ich habe auf dieser Form keine Tabelle Cyan.
    Nanu - wie komme ich auf 'Cyan'? Hast du das bild in post#5 ausgewechselt?
    Nun steht da 'Gelb' wo imo vorher 'Cyan' stand.
    also musses nun GelbRow heissen, nicht (mehr) CyanRow.
    Ausserdem musst du noch [tt]Imports DeinProjekt.DeinDataset über die Datei schreiben, weil der vollqualifizierte Name der GelbRow lautet:
    DeinProjekt.DeinDataset.GelbRow[/tt].
    vielleicht hilft auch Intellisense ein bischen die richtige Addressierung herauszufinden.
    Oder du tippst im ObjectBrowser 'GelbRow' in die Suche ein - der findet den Datentyp ganz sicher.



    Ah - hier:

    uNbRaKe schrieb:

    Dadurch habe ich einen bestimmten Datensatz aus Tabelle Cyan
    Daher denke ich, es gibt bei dir eine Tabelle Cyan.
    ich verstehe deine Logic nicht.. mal hast du Gelb, Magenta
    dann wiederum einen Artikel...M100-M109 etc...

    Lagerbewegungen sollten in/aus EINER Tabelle berechnet werden
    hier mal ein enfaches Bsp. mit 2 Datagridviews

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form5
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. Dim names = From row As DataGridViewRow In _
    5. DataGridView1.Rows.Cast(Of DataGridViewRow)() _
    6. Where Not row.IsNewRow _
    7. Select (CInt(row.Cells(0).Value)) Distinct
    8. For Each n In names
    9. Dim nArtikel As String = String.Empty
    10. Dim nEingang As Integer = 0
    11. Dim nAusgang As Integer = 0
    12. Dim nBestand As Integer = 0
    13. For i As Integer = 0 To DataGridView1.Rows.Count - 1
    14. If CInt(DataGridView1.Rows(i).Cells(0).Value) = n Then
    15. If DataGridView1.Rows(i).Cells(2).Value IsNot DBNull.Value Then
    16. nArtikel = CStr(DataGridView1.Rows(i).Cells(1).Value)
    17. nEingang += CInt(DataGridView1.Rows(i).Cells(2).Value)
    18. nAusgang += CInt(DataGridView1.Rows(i).Cells(3).Value)
    19. End If
    20. End If
    21. nBestand = nEingang - nAusgang
    22. Next
    23. 'Lagerbewegungen an Datagridview2
    24. DataGridView2.Rows.Add(n, nArtikel.ToString, nEingang, nAusgang, nBestand)
    25. Next
    26. End Sub
    27. Private Sub Form5_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    28. 'Data
    29. With DataGridView1
    30. .Columns.Add("ArtikelId", "ArtikelId")
    31. .Columns.Add("Artikelname", "Artikelname")
    32. .Columns.Add("Eingang", "Eingang")
    33. .Columns.Add("Ausgang", "Ausgang")
    34. .Rows.Add(1, "Cyan", 45, 4)
    35. .Rows.Add(2, "M100-M109", 32, 8)
    36. .Rows.Add(3, "Magenta", 19, 5)
    37. .Rows.Add(3, "Magenta", 123, 0)
    38. .Rows.Add(3, "Magenta", 19, 4)
    39. .Rows.Add(3, "Magenta", 0, 64)
    40. .Rows.Add(2, "M100-M109", 8, 8)
    41. End With
    42. With DataGridView2
    43. .Columns.Add("ArtikelId", "ArtikelId")
    44. .Columns.Add("Artikelname", "Artikelname")
    45. .Columns.Add("Eingang", "Eingang")
    46. .Columns.Add("Ausgang", "Ausgang")
    47. .Columns.Add("Bestand", "Bestand")
    48. End With
    49. End Sub
    50. End Class
    @Kasi Also ich habe Formen auf denen es jeweils die Tabelle Cyan, Gelb, Magenta, Schwarz, Fixiereinheit und Transferkit, mit deren Datensätzen gibt. Über diese Formen gelant man bei Artikelein- oder Ausbuchung auf eine Form , welche die Tabelle Lagerübersicht beinhaltet. Je nach dem über welche vorherige Form man auf die Ein- Ausbuchungsform gelant, wird die ComboBox mit den entsprechenden Artikeln aus Cyan, Gelb, Magenta, Schwarz, Fixiereinheit oder Transferkit befüllt. So kann man eine Ein- oder Ausbuchung durchführen, indem ein neuer Datensatz auf Tabelle Lagerübersicht angelegt wird. Man soll eine Buchungsmenge eingeben, die mitt dem alten Lagerstand verrechnet werden soll. Es ensteht ein neuer Lagerstand für einen Artikel, der ja per Combobox ausgewählt wurde. Nun soll der neue Lagerstand auch bei dem Datensatz des Artikels in Tabelle Cyan, Gelb, Magenta, Schwarz, Fixiereinheit oder Transferkit (je nach dem welcher Artikel ausgewählt ist) überschreiben. Bisher funktioniert auch alles. Auf Tabelle Lagerübresicht erhalte ich einen Datensatz, der den neuen Lagerstand anzeigt. Nur bei dem jeweiligen Artikel möchte ich den Lagerstand anpassen. Ich hoffe das ist verständlich.

    uNbRaKe schrieb:

    Die Bindingssource habe ich, da ich mit dieser die ComboBox anhand dieser befülle.

    Dann benenne die doch sinnvollerweise schonmal um in bsCmbCyan dann wissen die Leute hier und du selbst auch, dass die BindingSource einer ComboBox angehörig ist.

    Und dann wie ErfinderDesRades schon schrieb einen Import auf dein DataSet machen, sonst musst du das alles ausschreiben mit den Rows. Deshalb wird er auch keine CyanRow oder GelbRow
    finden, denn aktuell müsstest du die dann wie folgt ansprechen: DeinProjekt.DeinDTS.CyanTabelle.CyanRow

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:

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