Dataset und Xml- Dateien unter verschiedenen Namen laden und speichern

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

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

    Dataset und Xml- Dateien unter verschiedenen Namen laden und speichern

    Hallo zusammen,

    ich bin neu im Forum, lese aber die Seite schon länger. Deshalb hat sich wieder die Lust aufs Programieren entwickelt.
    Bin aber leider Anfänger, trotz meiner fast 60 Jahren :=( früher hatte ich einiges mit VB6 programiert in Access Datenbanken.
    Die Artikel zum Dataset von "ErfinderDesRades" haben mich motiviert, hiermit eine kleine Datenbank zu erstellen, ebenso wie die Hilfestellungen von VaporiZed oder VB1963 und vielen anderen.

    Den Code zur DB hab ich meist hier aus dem Forum, zusätzlich als Nachschlagewerk noch VB2019 von Th. Thies!

    Das mit dem Dataset wird hier sehr gut erklärt, es funktioniert auch wie beschrieben... jedoch nur wenn ich ein Dataset mit Namen benenne.
    Ich komme nicht weiter beim Versuch, das Dataset unter einem neuen Namen (Dts1, Dts2, Dts3 etc.) abzuspeichern und es dann weiter zu benutzen.
    Ebenfalls ärgerlich, beim laden des Dts.xml fragt Windows "mit welchem Prog die Datei geöffnet werden soll?" Na ja, wegklicken hilft ist aber nicht Zielführend.

    Ich habe mal den Code vom Hauptmenu und des (ersten) Forms angehängt und noch einige Komentare hinzugefügt.
    Alle bisherigen (erfolglosen) Versuche die TOMdts.xml umzubenennen, wurden wieder gelöscht.... ich wollte damit einen Lachflash verhindern....
    wie gesagt.... typische Anfängerprobleme!

    Ich wäre nun dankbar, wenn mir jemand zeigen kann, wie ich die genannten Probleme beseitigen kann.

    Grüße Udo


    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Hauptmenu
    3. Private Sub Hauptmenu_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. ' Dim TomListe As New FileInfo(OpenFileDialog1.FileName)
    5. 'MsgBox(TomListe)
    6. End Sub
    7. 'Menu Einstellungen und Auswahl
    8. Private Sub MenuStrip1_ItemClicked(sender As Object, e As EventArgs) Handles SchließenToolStripMenuItem.Click, ÖffnenToolStripMenuItem.Click,
    9. SpeichernToolStripMenuItem.Click, DruckenToolStripMenuItem.Click, ExportierenToolStripMenuItem.Click, NeuerEintragToolStripMenuItem.Click,
    10. EintragÄndernToolStripMenuItem.Click, EintragLöschenToolStripMenuItem.Click, SeitenansichtToolStripMenuItem.Click, HilfeZumToMGeneratorToolStripMenuItem.Click,
    11. InformationenToolStripMenuItem.Click, TOM_Liste_Eintrag.Click, ÜberschriftenEintrag.Click, MandantenToolStripMenuItem.Click
    12. Select Case True
    13. Case sender Is ÖffnenToolStripMenuItem
    14. Dim _Datafile As New FileInfo(OpenFileDialog1.FileName)
    15. OpenFileDialog1.Filter = "XML-File | *.xml"
    16. OpenFileDialog1.Title = "Die TOM des Mandanten öffnen"
    17. If OpenFileDialog1.ShowDialog <> Windows.Forms.DialogResult.OK Then Return
    18. System.Diagnostics.Process.Start(OpenFileDialog1.FileName) 'beim speichern eines neuen Namens kommt hier Fehler "kann Datei nicht finden?"
    19. MessageBox.Show("The File to open is: " & " " & OpenFileDialog1.FileName)
    20. DateiPfad = OpenFileDialog1.FileName'DateiPfad wurde über Modul als public deklariert um überall darauf zuzugreifen
    21. 'eigentlich will ich mit dieser Variablen die DtsXml in verschiedenen Formularen öffnen.
    22. Case sender Is SpeichernToolStripMenuItem
    23. SaveFileDialog1.Filter = "xml-file | *.xml"
    24. If SaveFileDialog1.ShowDialog <> Windows.Forms.DialogResult.OK Then Return
    25. Dim _Datafile As New FileInfo(SaveFileDialog1.FileName)
    26. If Not _Datafile.Exists Then
    27. 'oder hier? neue Xml's mit Namen aus SaveFileDialog1 erzeugen, d.h. TOMdts1, TOMdts2 etc
    28. End If
    29. System.Diagnostics.Process.Start(SaveFileDialog1.FileName)
    30. 'neue Xml's mit Namen aus SaveFileDialog1 erzeugen, d.h. TOMdts1, TOMdts2 etc
    31. Refresh()
    32. Case sender Is DruckenToolStripMenuItem
    33. MsgBox("drucken angeklickt")
    34. Case sender Is ExportierenToolStripMenuItem
    35. MsgBox("exportieren angeklickt")
    36. Case sender Is SchließenToolStripMenuItem
    37. 'MsgBox("schließen angeklickt")
    38. Close()
    39. Case sender Is TOM_Liste_Eintrag
    40. 'MsgBox("Liste angeklickt")
    41. frmTOM_Liste.ShowDialog()
    42. Case sender Is ÜberschriftenEintrag
    43. 'MsgBox("Liste angeklickt")
    44. frmÜberschriften.Show()
    45. Case sender Is MandantenToolStripMenuItem
    46. 'MsgBox("Liste angeklickt")
    47. frmMandant.ShowDialog()
    48. Case sender Is NeuerEintragToolStripMenuItem
    49. MsgBox("neuer Eintrag angeklickt")
    50. Case sender Is EintragÄndernToolStripMenuItem
    51. MsgBox("ändern angeklickt")
    52. Case sender Is EintragLöschenToolStripMenuItem
    53. MsgBox("löschen angeklickt")
    54. Case sender Is SeitenansichtToolStripMenuItem
    55. MsgBox("Seitenansicht angeklickt")
    56. Case sender Is HilfeZumToMGeneratorToolStripMenuItem
    57. MsgBox("Hilfe angeklickt")
    58. Case sender Is InformationenToolStripMenuItem
    59. MsgBox("Info angeklickt")
    60. End Select
    61. End Sub
    62. End Class


    und hier noch ein Form.
    Wie gesagt, ich bin bisher mit meinen Versuchen gescheitert, die TOMdts.WriteXml(DateiPfad) unter einem neuen Namen z.B. TOM_Udo_dts.WriteXml(DateiPfad) zu speichern und weiter zu benutzen. Natürlich alles unter dem neuen Namen, d.h. alle Dts Einträge müssen dann den neuen Namen haben.... also nur über Variablen?

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class frmTOM_Liste
    3. Private Sub TOM_Liste_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. 'MsgBox(DateiPfad)
    5. If DateiPfad = "" Then
    6. MsgBox("es muss zuerst eine Liste geladen werden")
    7. Close()
    8. Else
    9. Reload()
    10. End If
    11. End Sub
    12. Private Sub BearbeitenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BearbeitenToolStripMenuItem.Click,
    13. ListeSpeichernToolStripMenuItem.Click
    14. Select Case True
    15. Case sender Is ListeSpeichernToolStripMenuItem
    16. Save() 'aktuell geladene Xml Datei (die geöffnete aus Hauptmenu) speichern
    17. End Select
    18. End Sub
    19. 'Private _Datafile As New FileInfo("..\..\TOMDts.xml")
    20. 'Private _Datafile As New FileInfo("TOMDts.xml")
    21. 'Private _datafile As New FileInfo(DateiPfad)
    22. Private Sub Save()
    23. Validate()
    24. TOMdts.WriteXml(DateiPfad) 'funktioniert nur wenn das Dts z.B. TOMdts heist.
    25. 'Wie kann das Dts frei benannt werden, bzw. der Name aus OpenFileDialog1 (aus Hauptmenu) verwendet werden?
    26. TOMdts.AcceptChanges()
    27. End Sub
    28. Private Sub Reload()
    29. TOMdts.Clear()
    30. For Each tb As DataTable In TOMdts.Tables
    31. tb.BeginLoadData()
    32. Next
    33. TOMdts.ReadXml(DateiPfad) 'funktioniert nur wenn das Dts z.B. TOMdts heist. Wie kann das Dts frei benannt werden?
    34. 'TOMdts.ReadXml(_Datafile.FullName)
    35. For Each tb As DataTable In TOMdts.Tables
    36. tb.EndLoadData()
    37. Next
    38. TOMdts.EnforceConstraints = True
    39. TOMdts.AcceptChanges()
    40. End Sub
    41. End Class

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

    Willkommen im Forum.

    Was bei mir ankommt: Du hast ein tDS mit dem Namen X, aber willst es in Y umbenennen. Das Umbenennen klappt, aber dann funktioniert das Programm nicht mehr.

    Du musst mehrere Punkte angehen. Wenn das Original DTS1 heißt, heißt einmal die tDS-Klasse so. Zum anderen hat es aber auch eine NameProperty mit diesem Wert. Du müsstest also beides umbenennen.
    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.
    Hallo VaporiZed,

    vielen Dank für dein Feedback.
    Genau hier beginnen meine Probleme. Im Grunde speichert der Nutzer ein neues Dts mit neuem Namen ab. Org. ist z.B. TOMdts.xml und gespeichert wird neu Udo_dts.xml.
    diese will ich dann nach Neustart laden (oder eines der x vorhandenen) Wenn das Dataset dann bearbeitet wurde, wird entschieden ob mit gleichem Namen gespeichert wird
    oder unter einem neuen Namen.
    Fakt ist, es soll mit beliebigen Dateien gearbeitet werden, z.B. von Kollegen.
    Ich bekomm aber genau die von Dir beschriebenen Änderungen nicht hin, alles was ich versuche endet mit Fehlermeldungen.

    Deshalb die Bitte nach Codebeispielen damit ichs nachvollziehen kann wo, was geändert werden muss, wie die Variablen wo gesetzt werden müssen etc.
    und.... warum die Windowsabfrage nach dem Programm zum laden von XML kommt? (Wenn mein Prog läuft und ich eine XML lade)

    Die Frage ist also nicht "dass" sondern "wie" ;=)

    Grüße Udo

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

    Na Moment. Wenn es nur darum geht, dass jeder Nutzer seine Daten haben soll, musst Du ja im Programm nichts ändern. Nur einfach eine andere XML laden. Der tDS-Name muss doch gar nicht geändert werden. Du kannst es also so machen: User1 haut seine Daten ins Programm und speichert es unter User1.xml, User2 nimmt die Datei User2.xml usw.
    Die Frage ist nur, inwieweit das Programm synchron verwendet werden soll. Aber wenn jeder Benutzer seine eigene Exe hat, wird die XML lokal gespeichert und fertig. Selbst wenn eine zentrale Netzwerk-Exe besteht, kann man die XML lokal speichern und so hat jeder User seine eigene Daten. Aber irgendwie werd ich das Geühl nicht los, dass es nicht ganz das Szenario abdeckt, welches Du Dir vorstellst, oder?
    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.
    Hallo VaporiZed,

    vielen Dank für deine Antwort.

    Ich versuche mal mein Ansatz zu beschreiben.
    Die .exe kann lokal oder auf Teams liegen, das ist (hoffentlich) egal. Die Datasets (z.B. Udo1, Udo2, Udo3, Frank1, Frank2, Gerd1, Gerd3 etc.) liegen dann idealerweise im Netz.
    Ein gemeinsamer Ordner (z.B. "unsere Dateien") liegt dann im Netz auf Teams.
    Ein gemeinsamer Zugriff auf die Dateien soll nicht erfolgen (muss man dann irgendwie einschränken)
    Es sollte aber jeder auf die Datasets zugreifen können, diese verändern und unter gleichem oder neuen Namen abspeichern können.
    Natürlich sollte es möglich sein, auch ein neues Dataset mit neuem Namen zu erstellen.

    Die weiteren Schritte wären, das Dataset zu drucken, exportieren (pdf) oder einfach als gesammte Seite anschauen.....
    aber das sind die Zukunftsvisionen.... solange das mit dem Speichern der einzelnen Dts nicht funktioniert ist das Zukunftsmusik.
    Immer ein Schritt nach dem anderen ;=)
    Deshalb bewundere ich die Profis hier, die kurz mal was zusammenklicken etwas Code schreiben und alles funktioniert.

    Für mich sind das Welten... schon alleine das beim Laden einer .xml Datei das Windowsfenster aufgeht und fragt wie die Datei
    geöffnet werden soll, ist für mich ein unlösbares Problem!

    Deshalb auch meine bitte nach einem Code zu diesem Problem, der mit mehreren Datasets funktioniert.... mit einem geht das
    wie ErfinderDesRades super beschrieben hat... aber das mit den weiteren bekomm ich einfach nicht hin :=(

    Grüße Udo
    Nein, das ist der völlig falsche Weg. Es kann nur eines geben. Also: ein DataSet, welches in Deinem Programm rumschwirrt. Dessen Datenquelle, also aus welcher Datei die Daten kommen, das können unzählige sein, die man sich selbst raussucht:

    VB.NET-Quellcode

    1. DeinDataSet.ReadXML(OpenFileDialog1.FileName)

    mehr isses nicht. Und wohin man das abspeichert, ist einem auch überlassen. Aber im Programm ist hier nur ein DataSet sinnvoll, also DeinDataSet - wenn ich bei meinem Beispiel bleibe.
    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.