Unterprogramm im Hauptprogramm erstellen / und DataSet als Parameter übergeben

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von DerSmurf.

    Unterprogramm im Hauptprogramm erstellen / und DataSet als Parameter übergeben

    Hallo ihr lieben
    Wie viele von euch ja wissen, bin ich gerade dabei mein VBA Projekt in ein eigenständiges Vb.net Projet mit DatSet umzubasteln.
    Ich tue mich in vielem sehr, sehr schwer - aber mit eurer Hilfe wirds so allmählich und das Ding nimmt so langsam echt Form an und ich kann bald Betatesten :o)
    Nun gibt es eine Sache bei der ich bisher nur eine ganz grobe Idee habe - aber keine Ahnung ob das Funktioniert.
    Folgendes:
    Bisher ist es so, dass es mein VBA Hauptprogramm und mehrere kleinere "Unter"Programme gibt, sowie ein externes (also nicht VBA und nicht von mir) Programm (Namens Eho), welches Artikel speichert.
    Also Name, Art.Nr, Lieferant, Preis, usw.
    Eins dieser kleinen Unterprogramm ist die "zoo.xlsm". Diese beinhaltet alle Artikel aus dem Eho und dient dazu Preise herauszufinden. Also mittels Suche, oder EAN Code Eingabe.
    Die zoo.xlsm soll dabei aber eigenständig auf jedem beliebigen PC laufen können, ohne auf das Eho zugreifen zu müssen - also sind hier alle Artikel aus dem Eho enthalten.
    Um dies zu realisieren habe ich eine "Import.xlsm". Diese greift auf die Speicherdatei (*.db) des Eho zu, läd hieraus die benötigten Artikeldaten, löscht den Inhalt der zoo.xlsm und fügt die neuen Daten formatiert ein.
    Ich muss also nach dem Anlegen, oder ändern von Artikeln im Eho, immer erst die Import.xlsm starten und das entsprechende Makro starten, damit die zoo.xlsm aktuell bleibt.

    In meinem Vb.net Programm sind die Artikeldaten in einem DataSet (gespeichert als xlsm) im Hauptprogramm untegebracht.
    Mein Gedanke war nun in meinem Hauptprojekt ein Unterprojekt zu erstellen. Hier soll die Ausgabe (also das Erstellen des Programmes) im Ordner des Hauptprogrammes Unterordner Programme erfolgen. Wie realisiere ich das?
    Außerdem würde ich gerne einen optionalen Parameter übergeben. Wenn möglich das DataSet (bzw. die entsprechende DataTable), wenn ich mein Unterprogramm über das Hauptprogramm starte.
    Ich hoffe die Erklärung war verständlich.
    So kann ich im Unterprogramm dann prüfen, ob es über das Hauptrogramm gestartet wurde und ggf. ein fremdes DataSet geladen werden soll, oder ob es alleine ausgeführt wurde und die Daten nur anzeigen soll.

    Macht dieser Gedanke Sinn? Oder würdet ihr das komplett anders realisieren?
    Edit: Achja und ich hab im Hauptprogramm aktuell noch zwei DataSets. Eins davon enthält nichts anderes als die Artikeldaten. Das andere DataSet enthält alles andere. Das Arikel DataSet ist dabei unverschlüsselt, das ArtikeldataSet ist verschlüsselt (mit Passworteingabe beim Programmstart und Cryptostream).
    Ich habe damals zwei DataSets gebastelt, damit eben die Artikel nicht verschlüsselt sind und ich evtl. das komplette DataSet übergeben könnte.
    Macht das Sinn, oder kann ich auch einfach ein DataSet draus machen und nur die benötigten DataTable übergeben?

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

    Eh... wat?
    Also nochmal in kurz. Derzeit sind Artikeldaten in Eho. Diese greifst Du mithilfe Deiner Import.xlsm ab und schreibst sie in zoo.xlsm rein.
    Und nun?

    DerSmurf schrieb:

    In meinem Vb.net Programm sind die Artikeldaten in einem DataSet (gespeichert als xlsm)
    Du speicherst die XML-Daten des tDS in ner xlsm?
    Was ist Dein Ziel? Das erkenn ich nicht. Du willst jetzt n VB.Net-Eho-Daten-Import-/Export(unter)programm schreiben? Den kompletten 2. Absatz versteh ich inhaltlich einfach nicht.
    Auch das mit den 2 tDSs versteh ich insofern nicht, weil Du überlegst, dass Du sie zusammenfasst (klingt gut, ein tDS ist besser als 2). Das eine wirst Du dann komplett beim Abspeichern verschlüsseln. Klar soweit. Aber was willst Du wohin übergeben? Klar kannst Du nur einzelne Tabellen (wohinauchimmer) übergeben. Aber Dein Ziel ist gerade schwierig zu erkennen.
    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.
    Ich möchte ein zweites Programm erstellen, welches alle Artikeldaten erhält (also DataTable Articles).
    Dieses Programm soll auch auf anderen PCs lauffähig sein - also nicht auf das DataSet des Hauptprogrammes zugreifen.
    Das Importgedöns möchte ich dabei so einfach wie möglich halten (eben nicht wie bisher in VBA)

    Nun überlege ich wie ich die Daten in dieses Programm bekomme.
    Da war die Überlegung, die DataTable mit Artikeln optional übergeben zu können.
    Je nachdem wie mein Programm dann gestartet wird sollen Daten automatisch importiert werden oder eben nicht.
    Und wie dachtest Du, übergibst Du eine DataTable in ein anderes Programm? Ne DataTable ist ne Klasseninstanz. Das kann man programmintern machen, aber nicht programmübergreifend. Wenn das ein eigenständiges Programm ist, kannst Du keine DataTable übergeben. Aber Du könntest die DataTable-Daten speichern (DeinTds.DeineDataTable.WriteXML(Dateiname)) und dann später im anderen Programm wieder laden (DeinTds.DeineDataTable.ReadXML(Dateiname))
    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.
    Da gibt's mehrere Möglichkeiten. Du könntest über Startparameter arbeiten, also im Hauptprogramm das Nebenprogramm mit Diagnostics.Process.Start(PfadZuDeinemNebenprogramm, Befehlszeilenparameter) starten und dann im Nebenprogramm diese Parameter mit Environment.GetCommandLineArgs auswerten. Dann siehst Du, ob der zu erwartende Startparameter, der im Hauptprogramm eincodiert wurde, im Nebenprogramm ankommt. Wenn ja, wurde es (wahrscheinlich!) über das Hauptprogramm gestartet. Wenn andere Parameter oder gar keiner übergeben wurde, dann eben nicht. Ansonsten geht das auch mit anderen Interprozesskommunikationsmethoden wie z.B. anonymen Pipes.
    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.
    Also, aus zwei DataSets ein DataSet in einem fast fertigen Programm zu machen ist das letzte...
    Aber ich habe es hinbekommen. Alles läuft.

    Dann habe ich eine neues Projekt zum Parametertesten erstellt. Dies enthält Hauptprogramm und Unterprogramm.
    Hauptprogramm:

    VB.NET-Quellcode

    1. Private Sub BTNmitParameter_Click(sender As Object, e As EventArgs) Handles BTNmitParameter.Click
    2. Diagnostics.Process.Start(Application.StartupPath & "\Unterprogramm\Unterprogramm.exe", "123")
    3. End Sub

    Unterprogramm:

    VB.NET-Quellcode

    1. Private Sub frmUnterprogramm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim Parameter As String() = Environment.GetCommandLineArgs() 'edit Mist... Dim Parameter = Environment... aber ich vergess es immer wieder - *Besserung gelob
    3. If Parameter.Length > 1 AndAlso Parameter(1) = "123" Then
    4. Label1.Text = "Parameterstart"
    5. Else
    6. Label1.Text = "ohne Parameter"
    7. End If

    Das funktioniert.
    Mir ist jedoch eingefallen, dass ich ZWEI Datatable "übergeben" muss (siehe Bild).
    Im Unterprogramm gibt es die gleichen beiden DataTable (Articles und Supplier).
    Mit
    DeinTds.DeineDataTable.WriteXML(Dateiname)
    müsste ich ja zwei xml Dateien erzeugen. Das wird ja dann schwierier mit dem Einlesen.
    Wie schmeiße ich denn in meinem Hauptprogramm die beiden DataTable in eine xml?

    Edit: hab die Demo mal angehängt, falls du / ihr sie braucht.
    Das Unterprogramm wird in den Debug Ordner des Hauptprogrammes erstellt.
    Und nicht wundern, die xml Datei heißt Tee.xml (kopierfehler :(
    Bilder
    • DataSet.jpg

      27,25 kB, 641×492, 58 mal angesehen
    Dateien
    Ich sehe jetzt aber auch nicht die Schwierigkeit im Einlesen zweier Dateien.
    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.
    Ja, sorry. Ich hab einfach zu kompliziert gedacht.
    Im Hauptprogramm schreibe ich beide zu exportierenden DataTables in xml Dateien.
    Diese lese ich dann im Unterprogramm wie folgt ein (denn ich muss ja nicht das komplette DataSet befüllen)

    VB.NET-Quellcode

    1. Private Sub DataSetImport()
    2. DataSet1.Supplier.ReadXml(Application.StartupPath & "\Supplier.xml")
    3. DataSet1.Articles.ReadXml(Application.StartupPath & "\Articles.xml")
    4. End Sub


    Edit:
    Eine Sache habe ich noch.
    Durch testen habe ich herausgefunden, dass die beiden DataSets (also das im Hauptprogramm und das im Unterprogramm), den gleichen Namen haben müsse.
    In meinem Fall DtsSettings. Im Unterprogramm wollte ich aber eigentlich das DataSet DtsArticle nennen.
    Was ja eigentlich wurscht ist, weils der User ja eh nicht sieht - ich kann es ja als Article.xml speichern.
    Aber geht das irgendwie unproblematisch?

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

    Warum müssen die beiden den gleichen Namen haben? Wegen des Im- und Exports der XML? Dann könntest Du notfalls die XML-Zeilen im Nachhinein (z.B. mit IO.ReadAllLines/WriteAllLines) manipulieren.
    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.
    Hmm. das ist mir zu lästig. Denn letztlich ist der Name des DataSets ja auch irgendwie egal - denn es gibt ja nur ein einziges.
    Also bleibt der Name einfach bei DtsSettings, auch wenn es Artikel speichert.

    Zwei Fragen habe ich noch zu Post6.
    Warum empfiehlst du den Start mit
    ​Diagnostics.Process.Start(PfadZuDeinemNebenprogramm, Befehlszeilenparameter)

    Was bringt mit das "Diagnostic."? Ich kann doch mit einem einfachen Process.Start auch Befehlszeilenparameter übergeben.
    Und gibt es eine Möglichkeit auch mehrere - also 2 - Befehlszeilenparameter zu übergeben?

    DerSmurf schrieb:

    Was bringt mit das "Diagnostic."?
    Ich gebe es hier im Forum meist mit kompletten Namespace an, bevor sich jemand beschwert, dass es nicht klappt, weil bei den importierten Namespaces genau der nicht dabei ist, den man braucht. Du hast offensichtlich System.Diagnostics bei Deinem Projekt dabei. Ich standardmäßig z.B. nicht, weil ich den zu selten brauche.

    Befehlszeilenparameter ist ein String. Da kannst Du auch a b 123 reinschreiben. Was Du daraus machst, bleibt Dir ja im Zielprogramm selber überlassen. Environment.GetCommandLineArgs sieht dabei jeden Textbaustein zwischen Leerzeichen als eigenes Argument. Beim genannten Beispiel hättest Du also: den vollen Pfad zur Exe, a, b, 123
    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.
    Alles klar. Ich habe versucht mehrere Parameter als mehrere Strings zu übergeben.
    Also ​Process.Start(PfadZuDeinemNebenprogramm, "Param1" "Param2")
    ​Process.Start(PfadZuDeinemNebenprogramm, "Param1 Param2") funktioniert dann natürlich.
    Also auf zum nächsten Problem (Thread).

    Aber wie immer - vielen, vielen Dank für deine Top Hilfe!