SQL View Daten bearbeiten

  • VB.NET

Es gibt 46 Antworten in diesem Thema. Der letzte Beitrag () ist von Kim.

    Habe jetzt die Spalte geändert Trotzdem kommt noch weiterhin die andere Fehlermeldung.

    "Fehler bei der Überladungsauflösung, da keine zugreifbare "AddDruckRow" diese Anzahl von Argumenten akzeptiert"

    VB.NET-Quellcode

    1. ​Private Sub ExportPrinteds(printedRows As IEnumerable(Of dtsHuelse.SteinfeldItemRow))
    2. Dim rwDruck = DtsDruck.Druck.AddDruckRow(Date.Now, "")
    3. For Each rwItem In printedRows
    4. DtsDruck.PrintedItem.AddPrintedItemRow(rwDruck, rwItem.Prod__Order_No_)
    5. Next
    6. End Sub
    hmm - dann ist wohl die DataTable nicht so wie ich dachte.
    Ich dachte, Druck.ID sei Primkey mit AutoIncrement.
    AutoIncrement-Spalten müssen beim Adden nicht extra angegeben werden - bleiben also übrig anzugeben die beiden Spalten Timestamp und Bemerkung - was ich denn ja auch tutete:

    VB.NET-Quellcode

    1. Dim rwDruck = DtsDruck.Druck.AddDruckRow(Date.Now, "")


    Aber du kannst auch mit dem Cursor die öffnende Klammer wegnehmen und wieder hinmachen - dann sollte Intellisense dir angeben, welche Argumente erwartet werden.

    Oder du setzst den Cursor auf AddDruckRow, und springst mit KontextMenü-"zu Definition gehen" dorthin, wo die Methode deklariert ist. Da steht ja, welche Argumente erwartet werden.
    Die Eindeutige ID in der Spalte "Product_ Order No_" ist ein String, da die Werte Zahlen mit Bindestrich (123456-1) sind.

    Gibt das ein Problem? Bei deinen Beispiel Videos ist es immer ein "INT32 Auto Increment True"

    Muss ich diesen Wert vllt. als Zahl umwandeln (1234561 ohne Bindestrich) und in eine Extra Spalte schreiben?
    ich habe in der Mastertabelle ein Spalte ID hinzugefügt. wusste leider nicht, dass diese ja Automatisch Nummern vergibt und dachte ich muss diese mit Werten füllen.

    Zu dem anderen Problem, nein konnte das noch nicht beheben. Denke bin noch viel zu Grün in Sachen VB.NET oder das Projekt ist für einen Anfänger wie mich zu schwer.
    Kann ich selber so gar nicht beurteilen.

    Neu

    Hmm - ich finds zum Aufgeben noch zu früh - aber musst du wissen.
    Allerdings bin ich sehr dafür immer erst ein Problem zu lösen, bevor man das nächst angeht.
    Als ich bin noch bei

    ErfinderDesRades schrieb:

    VB.NET-Quellcode

    1. Dim rwDruck = DtsDruck.Druck.AddDruckRow(Date.Now, "")
    "Fehler bei der Überladungsauflösung, da keine zugreifbare "AddDruckRow" diese Anzahl von Argumenten akzeptiert"
    Da kann man nun zwei Dinge dran lernen
    1. Normalerweise ists ein Kinderspiel, die Argumentliste per Intellisense zu Gesicht zu bekommen, und damit ablesen, welche Argumente (inkl. ihres Datentyps) die Methode haben will
      Wenn du weiter Prgogrammieren willst, ist das ein unverzichtbares KnowHow.
      Leider habich speziell dazu kein Video verfasst, sondern nur welche, bei denen sowas ähnliches vorkommt: Video-Tut: Welchen Datentyp hat das Objekt? , VisualStudio richtig nutzen (Google ist nicht deine Mami)
    2. Richtig modellieren - wie gesagt: Die Spalte Druck.ID sollte Primkey sein (ist sie ja), und sollte dann auch AutoIncrement haben - und dann sollte der Code allerdings korrekt durch den Compiler gehen.



    Kim schrieb:

    ich habe in der Mastertabelle ein Spalte ID hinzugefügt. wusste leider nicht, dass diese ja Automatisch Nummern vergibt und dachte ich muss diese mit Werten füllen.
    Ich weiss nicht, was bei dir die 'MasterTabelle' ist, und weiss jetzt nicht mehr, wie dein Datenmodell aussieht.
    Nach meim Dafürhalten ist das Datenmodell wie in post#12 gezeigt gut geeignet, und dem sollte nix hinzugefügt werden.
    Nur die Primkeyspalten sollten AutoIncrement bekommen - wenn sie es nicht haben.

    Neu

    Nein Aufgeben möchte ich auch noch nicht.

    So habe das ganze noch einmal Modelliert und siehe da der Fehler ist weg.
    Mit Mastertabelle meinte ich die Datatable aus dem Dataset "dtsHuelse" wo ich die Daten aus der SQL View Anzeige.
    Wenn das nicht notwendig ist eine dann nehme ich die Spalte wieder raus.

    Neu

    Ja genau Tabelle SteinfeldItem. Dachte nur vllt. benötigt diese auch eine ID. Aber wir hatten ja gesagt wir nehmen dann die Product_ Order_ No.

    Druck.ID ist Primär und AutoIncrement, sowie auch die PrintedItem.ID.
    Printed.Druck ID ist Autoincrement und PrintedtItem.SteinfeldItemID ist String.
    Eine Druck.SteinfeldItemID habe ich nicht.
    Bilder
    • dtsDruck.png

      143,23 kB, 1.922×1.080, 11 mal angesehen
    • Dataset dtsHuelse.jpg

      240,4 kB, 1.923×1.080, 11 mal angesehen

    Neu

    Leider funktioniert noch gar nichts der Sachen.

    Die Datatables sind noch komplett leer, da tut sich leider gar nichts.
    Das Schreiben macht er aber natürlich alles leer, da er keine Daten in den Tables hat.(er schreibt eine XML Datei ohne Daten)

    Möchte ich denn die ganze Zeile der SteinfeldItem Tabelle schreiben oder nur die Prod_ Order_ No_, PrintedOut und Timstamp Spalte?

    Ich habe es bissher nur geschaft die über die Datagridview die Zeilen zu markieren und zu schreiben.

    Du hattest ja am Anfang gesagt so macht man das nicht, da ich ja mit den Zeilen der Datatable arbeiten möchte. Stimmt ja auch.

    Nur leider ist mir das noch nicht gelungen.
    Ich hatte dein Schleife vom Anfang mal ausprobiert aber er meckert spätes Binden ist nicht möglich wenn ich

    VB.NET-Quellcode

    1. ​Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. Dim sfis = New List(Of dtsHuelse.SteinfeldItemRow)
    3. For Each dgvRow In Me.SteinfeldItemDataGridView.SelectedRows
    4. Dim sfi = DirectCast(DirectCast(dgvRowDataBound, DataRowView).Row, dtsHuelse.SteinfeldItemRow)
    5. sfis.Add(sfi)
    6. Next
    7. End Sub


    benutze.
    Bilder
    • 1.png

      180,26 kB, 1.956×1.080, 11 mal angesehen

    Neu

    Hmm - da musste einfach nochmal post#8 gucken - ich gab dir einen anderen Code - insbes. Zeile #5.
    Und bitte die sinnlosen Leerzeilen entfernen.
    Code soll kurz sein - und sinnlose Leerzeilen rauswerfen ist die einfachste Übung, das zu erreichen.

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

    Neu

    Habe den Code jetzt aus Post 8# genommen und der wirft einen Fehler aus. "Option Strict On" lässt spätes Binden nicht zu.

    markierte stelle ist dgvRow.DataBoundItem.

    VB.NET-Quellcode

    1. Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. Dim sfis = New List(Of dtsHuelse.SteinfeldItemRow)
    3. For Each dgvRow In Me.SteinfeldItemDataGridView.SelectedRows
    4. Dim sfi = DirectCast(DirectCast(dgvRow.DataBoundItem, DataRowView).Row, dtsHuelse.SteinfeldItemRow)
    5. sfis.Add(sfi)
    6. Next
    7. End Sub​

    Neu

    ah - gut - DataGridViewRowCollection ist eine veraltete Collection, daher erhält die dgvRow einen anderen Datentyp als ich gedacht habe, nämlich Object statt DataGridViewRow. Also muss man so durchschleifen:

    VB.NET-Quellcode

    1. Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. Dim sfis = New List(Of dtsHuelse.SteinfeldItemRow)
    3. For Each dgvRow As DataGridViewRow In Me.SteinfeldItemDataGridView.SelectedRows
    4. Dim sfi = DirectCast(DirectCast(dgvRow.DataBoundItem, DataRowView).Row, dtsHuelse.SteinfeldItemRow)
    5. sfis.Add(sfi)
    6. Next
    7. End Sub
    (auch ungetestet)



    Genereller Hinweis: Die Fehlermeldung ""Option Strict On" lässt spätes Binden nicht zu" bedeutet einen Fehler bei der Deklaration von Datentypen.
    Fehler-Ursache ist (konkret in diesem Fall), dass von einem Objekt mit dem Datentyp Object die Property oder Methode .DataBoundItem abgerufen werden sollte.
    Der Datentyp Object hat aber keine solche Property oder Methode.
    Das Gefasel von "Option Strict On..." in der Fehlermeldung will nun nahelegen, doch Option Strict Off zu stellen, weil dann ists egal, mit welchem Datentyp das Objekt deklariert ist.
    Das ist aber eine sch... - Idee.
    Korrekte Lösung des angezeigten Problems ist - das Objekt eben richtig zu deklarieren, wenns falsch deklariert ist (das ist hier konkret gelöst durch Einfügung der As-Klausel in die For-Schleife (#3) weil da wird dgvRow ja deklariert).

    Worauf ich hinaus will: wenn der Compiler mit sone "Option Strict On... blabla" - Meldung kommt, dann musst du den Datentyp des bemeckerten Objektes rauskriegen, und rauskriegen, wie's passieren konnte, dasses den falschen Datentyp hat, bzw. warum es unter einem ungeeigneten Datentyp deklariert wurde.
    (Beachte: es ist ein Unterschied, ob ein Objekt den falschen Datentyp tatsächlich hat, oder ob es nur ungeeignet deklariert ist.
    Die dgvRow hatte auch zuvor den richtigen Datentyp - nämlich in DGV.SelectedRows sind sicherlich ausschliesslich DataGridViewRows enthalten.
    Nur war sie nicht als DataGridViewRow deklariert (sondern garnicht, und da nimmt der Compiler den Datentyp Object an))

    Also worauf ich wirklich hinauswill: Du musst lernen, Datentypen zu erkennen. Siehe dieses: Video-Tut: Welchen Datentyp hat das Objekt?

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

    Neu

    Da hast du natürlich recht. Werde mir dein TUT auf jeden Fall anschauen und die Übung machen.

    Der Code funktioniert jetzt und ich setzte die PrntedOut Flags auf True und setzte den Zeitstempel.

    VB.NET-Quellcode

    1. Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. Dim sfis = New List(Of dtsHuelse.SteinfeldItemRow)
    3. For Each dgvRow As DataGridViewRow In Me.SteinfeldItemDataGridView.SelectedRows
    4. Dim sfi = DirectCast(DirectCast(dgvRow.DataBoundItem, DataRowView).Row, dtsHuelse.SteinfeldItemRow)
    5. sfi.PrintedOut = True
    6. sfi.TimeStamp = Now
    7. sfis.Add(sfi)
    8. Next
    9. End Sub​


    Dann schreibe ich den Dataset dtsHuelse in die XML PrintedSteinfeldKeys.xml

    VB.NET-Quellcode

    1. Private Sub cmd_Speichern_Click(sender As Object, e As EventArgs) Handles cmd_Speichern.Click
    2. DtsHuelse.WriteXml(FilePath)
    3. End Sub​


    leider bleiben die dtsDruck Datagridviews leer wenn ich dtsDruck.readXML anwende.

    Neu

    Die die dtsDruck Datagridviews müssten sich bereits befüllen, wenn du das Drucken ausführst.
    Ja - sehe ich - da wird dem dtsHuelse ja garnix hinzugefügt.
    Dann ist iwie logisch, dasses leer ist.
    Ungefährer Code:

    VB.NET-Quellcode

    1. Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. Dim sfis = New List(Of dtsHuelse.SteinfeldItemRow)
    3. For Each dgvRow As DataGridViewRow In Me.SteinfeldItemDataGridView.SelectedRows
    4. Dim sfi = DirectCast(DirectCast(dgvRow.DataBoundItem, DataRowView).Row, dtsHuelse.SteinfeldItemRow)
    5. sfi.PrintedOut = True
    6. sfi.TimeStamp = Now
    7. sfis.Add(sfi)
    8. Next
    9. dim rwDruck=dtsHuelse.Druck.AddDruckRow(date.Now) ' oder so ähnlich
    10. For Each sfi in sfis
    11. dtsHuelse.PrintedOut.AddPrintedOutRow(rwDruck,sfi.Order_PRodNo_)
    12. Next
    13. End Sub
    Du musst dir halt die Signaturen der Methoden dtsHuelse.Druck.AddDruckRow() und dtsHuelse.Druck.AddPrintedOutRow() genau angucken, was für Argumente die verlangen.
    Auf jeden Fall ist an dieser Stelle im Code die notwendige Information gegeben.

    Neu

    Wenn ich deinen Code mal Testweise nehme meckert er, das Druck kein Member von dtsHuelse ist und PrintedOut kein Member von dtsHuelse ist.


    habe den Code mal angepasst.

    VB.NET-Quellcode

    1. ​Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. Dim sfis = New List(Of dtsHuelse.SteinfeldItemRow)
    3. For Each dgvRow As DataGridViewRow In Me.SteinfeldItemDataGridView.SelectedRows
    4. Dim sfi = DirectCast(DirectCast(dgvRow.DataBoundItem, DataRowView).Row, dtsHuelse.SteinfeldItemRow)
    5. sfi.PrintedOut = True
    6. sfi.TimeStamp = Now
    7. sfis.Add(sfi)
    8. Next
    9. Dim rwDruck = DtsDruck.Druck.AddDruckRow(Date.Now, "") ' oder so ähnlich
    10. For Each sfi In sfis
    11. DtsDruck.PrintedItem.AddPrintedItemRow(rwDruck, sfi.Prod__Order_No_)
    12. Next
    13. End Sub


    und es klappt. Super Vielen Dank.
    Wie kann ich denn jetzt diese Informationen wieder aufrufen? Bzw. Wegschreiben und erneutes aufrufen?
    Wenn ich das Programm neustarte sind diese ja wieder weg
    Bilder
    • DatagridViews.png

      55,93 kB, 1.956×1.080, 8 mal angesehen

    Neu

    du musst bei dir, wenns funzt, natürlich das ' oder so ähnlich wegmachen.

    Ja, wegschreiben tut er es ja, wenn du den Wegschreiben-Button betätigst - was sonst? (soll er zumindest).
    Und dann geht auch laden.

    (Aber ich sehe, die cmd_Speichern_Click in post#35 - da wird ja auch das falsche Dataset weggeschrieben :P )

    Neu

    VB.NET-Quellcode

    1. Private Sub MarkPrinteds()
    2. Dim printedIds = New HashSet(Of Integer)(dtsDruck.PrintedItem.Select(Function(pi) pi.SteinfeldItemId))
    3. For Each itm In dtsHuelse.SteinfeldItem
    4. If printedIds.Contains(itm.Prod_Order_No) Then itm.PrintedOut = True
    5. Next
    6. End Sub
    Hashset(Of T) ist eine spezialisierte Auflistung, die super-schnell(!!!) angeben kann, ob ein gesuchtes Element enthalten ist.
    Deshalb fülle ich von dtsDruck.PrintedItem erstmal alle SteinfeldItemIds um in so ein Hashset (zeile#2).
    Im weiteren gucke ich dann im Hashset nach, und nicht in der dtsDruck.PrintedItem-Tabelle - wie man es wohl naiv anfangen würde.

    äh - ungetestet natürlich

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