SQL View Daten bearbeiten

  • VB.NET

Es gibt 47 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    SQL View Daten bearbeiten

    Hallo Zusammen,

    ich versuche mal meine Aufgabe zu schildern.

    Lese Daten aus einer SQL View in eine DGV. Im Desginer habe ich diese über eine Bindingsource mit der SQL View verbunden.
    Ich würde der DGV dann gerne eine Spalte zufügen mit dem Wert Status Gedruckt. Bei Bestätigen eines Button wird hier der Wert von False auf True gesetzt.

    Wie kann ich den Status speichern? ich kann ja nur lesen und nichts in die Datenbank schreiben.
    Kann ich per XML die Daten speichern und weiterbearbeiten? Die SQL View wird immer aktualisiert also auch die Möglichen Daten, die ich in ein XML schreiben würde.

    Ich versuche mich ganz neu in VB.NET und muss mich schon mal entschuldigen, dass ich garantiert nicht alles richtig beschrieben habe.

    Vielen Dank

    Beste Grüße

    Kim

    Kim schrieb:

    Wie kann ich den Status speichern? ich kann ja nur lesen und nichts in die Datenbank schreiben.
    Jo - dassis schlecht, dass du Daten, die offsichtlich den Datenbank-Daten zugeordnet sind, dort nicht speichern kannst.
    Dann wirste diese Informationen wohl als Datei auf Platte tun müssen, und wenn du die View vonne Datenbank holst, deine Zusatzdaten dazu-holen.
    Und absehbar sind Probleme, wenn du Zusatzdaten hast, deren zugehörige Datenbank-Daten entweder gelöscht sind, oder auch einfach nicht abgerufen vonne DB.

    Wiedemauchsei.
    Dein DGV ist offsichtlich an ein typisiertes Dataset gebunden, welches über TableAdapter aus der DB befüllt wird.
    So ein typDataset enthält verschieden viele Tabellen, unter anderem eine, in die deine SqlView geladen wird.

    Das einfachste ist wohl, der SqlView-DataTable eine zusätzliche bool-Spalte zuzufügen, mit DefaultValue=False.
    Die kannste auch im DGV anzeigen lassen, und hast schoma ein Gui, wode die Info eingeben kannst.

    Abspeichern ist nun unschön.
    Letztendlich musste eine Liste von Schlüsselwerten von Platte speichern/laden. Die SqlView-Datensätze, deren Primärschlüssel auf einen dieser WErte matchen, bekommen True in ihre Zusatzspalte eingetragen.

    Aber füge erstmal die Zusatzspalte deiner DataTable hinzu. Das muss im Dataset-Designer erfolgen - kein Code!
    Poste am besten Bild vom Dataset-Designer. Man kann da viel falsch machen, andererseits auf einem Bild auch schnell sehen, obs funktionieren wird.

    Wenn du den Dataset-Designer nicht kennst, guck dir im Datenbank-Bereich mein vier-Views-Tutorial an, da wird in Videos damit gearbeitet - dass du's mal gesehen hast.
    Zum bilder einstellen gibts unterm Forum-Editor einen button "erweiterte Bearbeitung", der eröffnet viele Möglichkeiten, u.a., Bilder hochzuladen.

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

    ja, super!

    Nur würde ich sie sinniger benennen, etwa PrintedOut oder so.
    Wäre auch schön, wenn der Name andeutet, dass die Spalte auf der DB nicht zu finden ist. Andererseits ists schwierig, dafür einen geeigneten Namen zu finden - er soll ja auch kurz sein - dassis inne Praxis wichtiger als man zunächstmal ahnt. Also wenn das nicht so wichtig ist, bleib bei PrintedOut oder so.
    Wichtig: Keine Spaces oder Umlaute in derlei Benennungen!
    Das bringt nur Scherereien.

    Jo - die Benamung scheint ja auf der DB bereits gründlich versaut (überlängen, unverständlich, Spaces drinne) - aber das soll dich nicht hindern, es besser zu machen.
    Einen Primärschlüssel hat die View ühaupt nicht, oder?

    Und versuch auch Hülse-Dataset (pfui - ein Umlaut!) und DataTable umzubenennen, und den TableAdapter.
    du wirst doch nicht mit Objekten namens NFHülseDataset.Nordfolien_Steinfeld_View_Core_ListTableAdapter hantieren wollen von nun an bis in Ewigkeit?
    Oder besser generier dir das Zeug neu, aber mit vernünftigen Namen. Beim Umbenennen zickt Dataset gewaltig rum.
    Vorschläge:
    dtsHuelse fürs Dataset
    SteinfeldItem für die Tabelle (TableAdapter entsprechend) - wenn dir was besseres einfällt ist das auch erlaubt. Für mich ist das jdfs. komplett kryptisch, deswegen Item - das bedeutet alles und nichts.



    Ach - wo wir grad so schön benennen: Auch dein Projekt ist ja unschlau benamt. Spaces drinne, und Xml ist ein Dateiformat - ich finde ungeeignet grad am Ende eines ProjektNamens aufzutauchen.
    Zumal das Projekt womöglich garnix mit Xml zu tun haben wird.
    Bisher scheints was mit Drucken zu tun zu haben, und mit Hülsen, und mit einer Datenbank. Da tät mir schon was einfallen, wenn ich damit richtig läge (und wenn ich den Namen der DB wüsste).

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

    Hey, Vielen dank für die Tipps.

    ich habe das Project neu erstellt mit den neuen Benennungen.

    Ja du hast recht ich will später die markierten Zeilen (Zeile nach Zeile) ausdrucken und der Zeile den Wert mitgeben das diese gedruckt ist und danach Filtern, bzw. die gedruckten Zeilen ausblenden.
    Bilder
    • neue Spalte.jpg

      332,61 kB, 1.920×1.080, 102 mal angesehen
    Das Drucken heb dir für zuletzt auf - Drucken ist immer eklig.
    Aber sonst kannste Logik schon anlegen, also ein DruckButton, der die selectierten rows zusammensucht und an einen Druckersub-Stub übergibt (Stub: Methode ohne Inhalt - wird später ausprogrammiert).
    Und der dann die PrintedOut-Property auf true setzt (oder das macht schon der Druckersub-Stub).
    Und dann einen weiteren button, der diese sonder-Infos auf Platte speichert.
    Und einen, der den kram lädt und zuordnet und dem SqlView zuordnet - das wird spassig!

    Wie gesagt: zu speichern sind nur die PrimKey-Werte der ausgedruckten SteinfeldItemRows. Nenn die Datei "PrintedSteinfeldKeys.txt" - ich glaub, eine text-datei wird erstmal am einfachsten.
    Ist aber abzusehen, dass noch mehr Informationen lokal zu speichern sind, dann vielleicht besser gleich mit einem Extra-TypDataset, was du mit WriteXml auf Platte tust.
    Aber nur wenn das absehbar ist - ansonsten ist Text schon ok, und kann man auch später noch umbauen auf Dataset.
    Guten Morgen

    Das Drucken hatte ich mir wie folgt vorgestellt.


    VB.NET-Quellcode

    1. For Each sRow As DataGridViewRow In Me.SteinfeldItemDataGridView.SelectedRows
    2. Me.tb_Auftrag.Text = Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(1).Value
    3. Me.tb_Artikel.Text = Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(2).Value
    4. Me.tb_Beschreibung.Text = Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(3).Value
    5. Me.tb_Menge.Text = Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(4).Value
    6. Me.tb_Kst.Text = Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(5).Value
    7. Me.tb_StartDatum.Text = Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(6).Value
    8. Me.PrintDocumentHuelse.Print()
    9. Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(7).Value = "true"
    10. Me.SteinfeldItemDataGridView.Rows(sRow.Index).Cells(8).Value = Now
    11. Next


    Ich würde die gewünschten Werte der Zeilen in verschiedene TextBoxen füllen, diese dann per PrintDokument auf einem Beleg anordnen und pro Zeile ausdrucken.
    Anschließend den PrintetOut Boolean auf True setzen und einen Timestamp mitgeben.

    Textdatei und XML Datei habe ich angelegt.

    Ich hoffe das ist so in Ordnung, das drucken pro Zeile funktioniert schon mal.

    Glaube das größte Problem wird sein den PrintetOut Wert und den Timestamp in eine XML oder Textdatei zu schreiben und diese dann über die Pro_ Order_ No_ (Auftragsnummer) wieder zuzuordnen.
    Bilder
    • Form1.jpg

      352,91 kB, 1.921×1.080, 88 mal angesehen

    Kim schrieb:

    Das Drucken hatte ich mir wie folgt vorgestellt.
    Ähm nein - Drucken geht ganz ganz anders.
    Wie gesagt: schreib nur einen Methoden-Stub.
    du hast jetzt das genaue Gegenteil gepostet: Nämlich keine Methode, aber den Inhalt einer Methode (der so keinesfalls umgesettzt werden sollte).

    Ganz generell: Poste immer ganze Methoden. Man muss vor allem wissen, was reingeht, und was rauskommt.
    Dagegen sind die Innereien (also sowas wie in post#7) gradezu nebensächlich.
    wie gesagt: schreib einen Drucker-Sub-Stub, der du eine Liste von SteinfeldItemrows übergeben kannst - nix anneres.
    Und der einzige Inhalt dieses Drucker-Sub-Stubs soll sein, dasser SteinfeldItemrow.PrintedOut=True setzt (auch wenn das erstmal gelogen ist, weil das Drucken wird ja später zugefügt).

    Kim schrieb:

    ... das drucken pro Zeile funktioniert schon mal.
    Echt? Da bin ich ja schwer beeindruckt.
    Und kann mir auch nicht recht erklären, wie du das zuwege gebracht hast.
    (Na, vlt. druckst du einfach einen Screenshot, so wie's aussieht.)
    Wie dem auch sei: Die Drucker-Sub soll nicht am Datagridview herumfummeln, sondern soll mit Datensätzen - SteinfeldItemRow - arbeiten, die ihr übergeben werden.

    Glaube das größte Problem wird sein den PrintetOut Wert und den Timestamp in eine XML oder Textdatei zu schreiben und diese dann über die Pro_ Order_ No_ (Auftragsnummer) wieder zuzuordnen.
    Jo - sehe ich auch so. Aber eins nachem andern:
    Auswahl der selectierten Datensätze
    Übergabe derselben an die DruckSub - die setzt die Datensätze auf PrintedOut=true
    Wegschreiben der PrintTimestamps und PrintedIDs in eine Dataset-Datei
    Laden derselben und Zuordnen zu einem frischen SqlView

    Tja, wies aussieht musste jetzt ein neues typDataset anlegen, zum auf Platte schreiben. Mit einer Tabelle OutPrint mit den spalten TimeStamp und ID.
    Vielleicht zum entwickeln legste ein Extra-Form an, was diese Tabelle im DGV anzeigen, laden und speichern kann.

    Du kannst auch ein richtiges Datenmodell entwerfen, also eine übergeordnete Tabelle Druck, die den Timestamp beinhaltet sowie eine Bemerkung,
    und untergeordnet PrintedItem mit den geprinteten IDs - solch kann auch nützlich sein.

    Ach noch ein: Auswählen der selectierten DataRows geht so:

    VB.NET-Quellcode

    1. Dim sfis=new list(Of SteinfeldItemrow)
    2. For Each dgvRow In Me.SteinfeldItemDataGridView.SelectedRows
    3. dim sfi = Directcast(Directcast(dgvRow.DataBoundItem, DataRowView).Row, SteinfeldItemrow)
    4. sfis.Add(sfi)
    5. Next
    (Directcast(Directcast(dgvRow.DataBoundItem, DataRowView).Row, SteinfeldItemrow) ist voll bescheuert und umständlich, und muss man halt hinter sich bringen)



    An deim Code sehe ich übrigens, dass du Strict Off programmierst. Dassis garnix überhaupt nicht gut - total bäh!
    ganz wichtig: Visual Studio - Empfohlene Einstellungen
    Sofort erledigen!!
    Weil ohne das codest du nur immer mehr so Fehler ein, wie ich jetzt gesehen habe.

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

    Alles Klar habe mir die Seite angeschaut und die Einstellung übernommen.

    VB.NET-Quellcode

    1. Private Sub cmd_Drucken_Click(sender As Object, e As EventArgs) Handles cmd_Drucken.Click
    2. dtsHuelse.SteinfeldItemRow.PrintedtOut = True
    3. End Sub


    Ich hoffe jetzt hab ich es richtig. Den anderen Kram habe ich wieder raus genommen. Möchte es ja richtig machen!

    Oh habe gerade gesehen die Ändererungen deine Beitrags. Ich schaue mir die gleich in Ruhe an.
    Da fehlen Druck.ID und PrintedItem.DruckID, sowie die Relation zw. den beiden.
    PrintedItem.ID geht auch nicht - da denkt man, es wäre ein eindeutiger Primärschlüssel. Tatsächlich ists aber eine Art "informeller Fremdschlüssel" auf SteinfeldItem - sollte also heissen PrintedItem.SteinfeldItemID
    Anbei noch ein Bild, hoffe jetzt ist es besser.


    Darf ich mal fragen, wie man so fit in vb.net wird? gibt es da einen speziellen Weg?
    Ich habe ja schon viel in diesem Forum gelesen und sehe immer Comments von dir. Hut ab!
    Bilder
    • Relation.jpg

      348,02 kB, 1.920×1.080, 86 mal angesehen
    mach dir am besten ein TabControl aufs form
    In Tab1 verschiebst du alle Controls, die du bisher hast. Das geht am besten über die DokumentenStruktur-Ansicht.
    Gugge das Video-Tut "Layout in Winforms" im Winform-Tut-Bereich.

    Für Laden und Speichern der Zusatzdaten machste auf Tab2 Buttons und Datagridview(s) hin - wenn du die Tabellen aussm DatenQuellfenster auf den Tab ziehst, wird das DGV ja gleich fertig eingerichtet.
    Sodass dein Ladebutton nur noch sagen muss MyDtsDruck.ReadXml(FilePath)
    und der SaveButton: MyDtsDruck.WriteXml(FilePath)

    Den Save-Button zuerst betätigen, damit die Datei ühaupt erstmal existiert.
    Dann kannste erstmal händisch ein paar Datensätze anlegen.
    Ach mist - du musst ja sogar gleich einen Parent-Child-View bauen, weil zuerst muss ja ein Druck-Datensatz angelegt werden, bevor man PrintedItem eintragen kann, weil jedes PrintedItem braucht ja die Zuordnung zum Druck.
    Ich hoffe, Parent-Child-View ist dir nix neues, und kennste vonne 4-View-Videos bereits.

    Dann kannste auch schon versuchen, die Methode zu schreiben, die die SteinfeldItem durchguckt, und die gedruckten ins dtsDruck exportiert. ansonsten schreib ich die eben
    Aber poste erstmal, wenn das mit Laden/speichern klappt.
    Guck - so müsste eine Export-Routine gehen:

    VB.NET-Quellcode

    1. Private Sub ExportPrinteds(printedRows As IEnumerable(Of SteinfeldItemRow))
    2. Dim rwDruck = dtsDruck.Druck.AddDruckrow(Date.Now, "")
    3. For Each rwItem In printedRows
    4. dtsDruck.PrintedItem.AddPrintedItemRow(rwDruck, rwItem.ID)
    5. Next
    6. End Sub
    Ich hab den Plan geändert - es ist nicht nötig, alle SteinfeldItem durchzugehen.
    Weil du übergibst die zu druckenden SI ja bereits der DruckRoutine.
    Dieselbe Variable, die der DruckRoutine übergeben wird, kannste auch der Export-Routine übergeben.

    Das Ergebnis eines solchen Exports müsste sofort auf Tab2 sichtbar werden.
    wenn ich diese Export Methode schreibe bekomme ich folgende Fehler.

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

    und

    ""ID" ist kein Member von dtsHuelse.SteinfeldItemRow"
    Bilder
    • ParentChild.jpg

      425,8 kB, 1.923×1.080, 88 mal angesehen

    Kim schrieb:

    ""ID" ist kein Member von dtsHuelse.SteinfeldItemRow"
    jo - das stimmt allerdings. Tja, was ist denn dann der Primärschlüssel von SteinfeldItem?

    Übrigens nützt zu diesem Punkt kein Bild des Form-Designers - ein Code-Snippet des beanstandeten Codes wäre hier aussagekräftiger (und nicht vergessen: immer ganze Methode posten).
    Wenn allerdings genau mein Code - unverändert - der beanstandete ist, dann brauchts auch kein Code-Snippet, weil das hab ich ja bereits geliefert.