Ein neues Projekt erstellen, welcher Weg ist zielfürend

  • VB.NET

Es gibt 76 Antworten in diesem Thema. Der letzte Beitrag () ist von blam.

    Ein neues Projekt erstellen, welcher Weg ist zielfürend

    Guten Morgen zusammen

    Im vergagnenen Jahr konnte ich zwei kleine Projekte mit vb.net realisiert. Es gelang mir mit Recherche, viel Arbeit, Debuggen und und und zwei funktionstüchtige Tools zu entwickeln. Ich lese dort ein xlsx aus, bearbeite die Spalten, schreibe ein neues xlsx und speichere dieses zur Weiterverarbeitung. :)
    Nun steht das nächste Projekt an, bei welchem ich aber nicht richtig weiss, wie ich es angehen soll und hoffe hier die nötigen Inputs zu bekommen. Bei meinem Projekt geht es darum, dass ich xlsx Dateien mit unterschiedlichem Inhalt zur Weiterverarbeitung bekomme. Es können Zahlungsverbindungen sein, Adressen und Personen, Auftragsübersichten einfach quer Beet alles, was so im Excel verarbeitet wird. Von den vielen Inhalten der Quellen benötige ich aber für die Weiterverarbeitung immer die gleichen Inhalte, wieder je nach Thema. Ich möchte mir jetzt mit vb.net etwas programmieren, mit dem ich die verschiedenen xlsx Dateien so aufbereiten kann, dass ich am Schluss einen "sauberen" Output pro Quelldatei habe. Ich stelle mir das so vor: Ich habe ein Tool, in welchem ich mittels RadioButton wählen kann, um was für ein Dokument es sich handelt. Also sind es Zahlungen, Adressen etc... Entsprechend meiner Auswahl wird dann das Output-Dokument (xlsx, csv) erstellt. Anschliessend werden von meiner Quell-Datei die Kopfzeilen ausgelesen. Mittels zB Listbox kann ich dann auswählen, welche Spalten ich aus der Quelle für den Output brauche. Ich habe mir etwas mit DataGridView vorgestellt, damit mir die Quelldatei angezeigt wird. Die Daten kommen so doof daher, dass aufgrund der Spaltenüberschrift nicht immer eindeutig ersichtlich ist, was der Inhalt ist. Daher fand ich diesen Ansatz nicht schlecht. Bin mir aber nicht sicher, ob das der richtige Weg ist. Ich muss auch zusätzliche Spalten einfügen und mehrere zu einer verarbeiten können und das geht ja in DGV nicht. Ist es besser, die benötigten Spalten ins Projekt zu importieren und dann dort weiter zu verarbeiten? Mir fehlt eindeutig die Erfahrung und weiss nicht, wie ich das angehen soll. Ich hoffe, dass ich hier jemanden finde, der mir den nötigen Input geben kann, damit ich zumindest wiess, wie ich es erfolgsversprchend anpacken kann. Für eure Unterstützung danke ich herzlich!!
    Guten Morgen,
    so grundsätzlich kann man das wohl machen, so wie du dir das vorstellst. Ich würde aber zwei Dinge in Frage stellen:
    1. Warum bekommst du diese Informationen als Excel-Datei und können diese gelieferten Dateien nicht schon in dem Format sein, das du brauchst? Nur so als Idee: Könntest du diese Dateien auch in einem anderen Format anfordern (xml, json, ...)? Die Verarbeitung wäre mit diesen Formaten leichter und setzt kein vorhandenes Excel voraus.
    2. Da ich nicht die Anzahl der Dateien kenne, aber bedarf es wirklich eines eigens geschriebenen "Transformierungsprogramms", obwohl Excel diese Funktionen von Haus aus mitliefert?
    Danke für deine Antwort

    1. Auf das Format der Quelldatei habe ich keinen Einfluss. Die kommen von verschiedenen externen Firmen, welche ich nicht beeinflussen kann. Die Überlegung mit dem Excel habe ich mir auch schon gemacht. Ist aber nicht so praktisch, da ja immer wieder neue Dateien kommen und bearbeitet werden müssen.
    2. Es sind duzende Dateien, welche regelmässig bereinigt werden müssen. Im Optimalfall nicht nur durch mich, sondern auch durch andere SB mittels meinem Tool.
    Wenn es Excel-Dateien sind, würde ich epplus verwenden und die Dateien in eine DataTable einlesen.
    Diese kannst du als DataSource an das DataGridView binden.

    epplus kannst du mittels nuget in dein Projekt einbinden.
    Wenn du das Programm kommerziell verwendest, verwende die Version 4 von epplus.
    Die Version 5 hat ein anderes Lizenzmodell.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Die Strukturierung der verschiedenen Optionen solltest du im typisierten Dataset konzipieren.
    Dann kann man leistungsfähige Oberflächen bauen, wie etwa eine Auswahl an Dateien, und eine Auswahl an Datei-Arten, und einen Zuordnungs-Mechanismus.

    Ziel ist auch, dein Denken von Listboxen und Radiobutton wegzukriegen hin zu Datensätzen und wie diese miteinander zusammenhängen.
    Weil wenn man in Controls denkt, programmiert man auch in Controls herum, und das gerät ziemlich schnell in ein ziemliches Kuddelmuddel.

    Zum typDataset und seinen Möglichkeiten:
    vier Views-Videos
    Besten Dank für die Rückmeldungen.

    @petaod: wenn irgendwie möglich, möchte ich dieses Projekt ohne zusätzliche Tools, Lizenzen etc. lösen.

    @ErfinderDesRades: Ich habe die Views-Videos angeschaut, alle sechs. Verständlich aufgebaut, ich meine begriffen zu haben, was du den Zuschauern zeigen möchtest. Was ich jetzt aber (noch) nicht verstehe, wie soll ich das in mein Projekt einfliessen lassen? Beispielsweise hat meine Excelliste mit Zahlungen Spalten von A bis BJ. Ich bnötige davon aber nur die Spalten Sender, Empfänger, Datum, Betrag, Sendenummer, Währung. In der Quelldatei heissen die jeweiligen Spalten aber anders und zwar heissen sie bei jedem Datenlieferanten anders. Oder meinst du, dass ich mit dem Inhalt meines Excels eine DataTable erstelle und von dort aus eine Beziehung herstelle zu einem DataTable, welches dann die Spalten beinhaltet, welche ich benötige? Ich stehe gerade noch vor einem grossen Berg....
    Stichwort „Datenmodell“. Du solltest du dir überlegen welche Daten du bekommst und welche du benötigst. Daraus kannst du dann eine oder mehrere Klassen ableiten mit denen du dann weiter arbeiten kannst.

    Im besten fall kannst du alle excel daten in einer Klasse abbilden und dann mit der Klasse weiter arbeiten anstatt unterschiedlicher Excel Dateien.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    jo, ich sag auch "Datenmodell", aber erkläre glaub was anderes.
    Du hast gesagt, es gebe viele Excel-Files, verschiedenerlei Excel-Sheet-Typen, und je nachdem brauchst du andere TabellenBlätter und andere Spalten aus je den Blättern.
    Ja, genau das modellieren - 4 Tabellen: InputFile, InputTyp, Sheet, Column.
    Die Relationen dazu:
    • InputTyp -> Sheet -> Column
    • InputTyp -> InputFile
    Das bedeutet: Aus jedem InputFileTyp kannst du mehrere Sheets auslesen, und aus jedem Sheet mehrere Columns.
    die zweite Relation bedeutet: jedes InputFile kannst du einem FileTyp zuordnen.
    Möglicherweise ist das Modell schon übertrieben kompliziert, und du musst aus jedem InputFileTyp immer nur genau ein Sheet auslesen, - dann kann die Tabelle Sheet entfallen.
    Ja, und dann bastel dir einen Parent-ChildView, sodass du InputTypen anlegen kannst, und deren jeweilige Columns.
    Im nächsten Schritt liest du Excel-DateiPfade in die InputFiles ein.
    Dann ordnest du jeden Excel-Pfad einem InputTyp zu.
    Dann kannst du einen Knopf drücken, und die ganze Verarbeitung abfahren: Das Programm weiss, was mit jedem Excel-File zu tun ist.
    Evtl. sortierst du die Excel-Files bereits im Dateisystem in verschiedene Ordner - dann kann die Zuordnung von DateiPfad zu InputTyp beim Einlesen der Pfade automatisch erfolgen.
    Ich meine verstanden zu haben....

    Ich modelliere eine Tabelle InputFile, diese entspricht/enthält mein zu bearbeitendes Excel-File. Die Tabelle Sheet beinhaltete die verschiedenen Tabellenblätter aus dem InputFile. Und die Tabelle Column die jeweiligen Spalten der einzelnen Tabellenblätter. Unter InputTyp modelliere ich dann die jeweiligen "Vorlagen" für meine verschiedenen DatenTypen (Zahlungen, Adressen etc.) mit den Spalten, wie ich sie benötige. Richtig?

    blam schrieb:

    wenn irgendwie möglich, möchte ich dieses Projekt ohne zusätzliche Tools, Lizenzen etc. lösen.
    Geht nicht.
    Wenn du mit Excel arbeitest benötigst du entweder so was wie epplus, das du in dein Tool integrierst.
    Oder du musst sicherstellen, dass auf dem Zielrechner Office installiert ist.
    Ersteres ist die sichere Variante.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    blam schrieb:

    Richtig?
    glaub nicht ganz.
    InputTyp kriegt eiglich nur einen Namen. Und das ist der Name einer "Vorlage".
    Dem untergeordnet sind ja die Sheets - die haben auch Namen.
    Und dem Sheet untergeordnet sind die Columns - auch Namen.

    Die InputFiles - Pfade - werden eingelesen, und jeweils einem InputTyp zugeordnet.
    Dadurch ist dann definiert, welche Sheets und Columns in diesem InputFile bearbeitet werden.

    Also was du vmtl. unter "Vorlage" verstehst, verteilt sich über mehrere verknüpfte Tabellen. Logisch, weil eine Vorlage muss ja mehrere Columns in mehreren Sheets definieren.
    Vielleicht wäre "Vorlage" tatsächlich auch ein besserer Name für InputTyp.

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

    Was meinst du mit "füttern"?
    Was ist in einer Vorlage drinne, worauf ein Sheet oder eine Column Hunger haben könnte?

    Datensätze anlegen tust du über den Parent->Child->Child - View: Vorlage -> Sheet -> Column
    Da legst du einen Vorlage-Datensatz im Vorlage-DatagridView an, und vergibst den Namen der Vorlage, mw "Mitsubishi-Rechnung".
    Wenn du nun den Vorlage-Datensatz anwählst, zeigt der Parent-Child-View alle Sheets dieser Vorlage - nämlich keines.
    Also legst du die Sheet-Datensätze des Vorlage-Datensatzes an, insbesondere unter Angabe des Sheet-Namens.
    Und wenn du einen Sheet-Datensatz anwählst, zeigt der Child->Child - View alle Columns dieses Sheets (soweit sie verarbeitet werden sollen) - nämlich keines.
    Also legst du die Column-Datensätze des angewählten Sheet-Datensatzes an, insbesondere unter Angabe des Column-Namens.

    Das ganze kann man abspeichern und auch wieder neu laden, damit man das nicht jedesmal neu machen muss.

    InputFiles werden nicht händisch angelegt - das sind ja Dateipfade, die von Platte gelesen werden.
    Aber wenn sie eingelesen sind, solls da auch ein Datagridview für geben, ein JoiningView, mit dem man festlegen kann, welche Vorlage für das jeweilige InputFile zuständig ist.

    Jo, wenn alle eingelesenen InputFile-Datensätze der richtigen Vorlage zugewiesen sind, kann ein Algorithmus abfahren, der da die ganzen schauerlichen Dinge tut, die zu tun sind.

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

    blam schrieb:

    Danke für deine Antwort

    1. Auf das Format der Quelldatei habe ich keinen Einfluss. ...
    2. Es sind duzende Dateien, welche regelmässig bereinigt werden müssen...


    ohne die Dateien zu kennen/sehen ist es rästel raten. Hört sich an wie ein Albtraum das ganze.
    Datenbereinigen von Firmen; x mögliche Formate der Quelldateinen. willst du dir das wirklich antuen?

    keine Ahnung ob du was hast zum auslesen der Excel Tabellen + Spalten ?
    schau nach OLEDB und GetSchema, wenn du nix hast kann ich ein Bsp. posten
    @ErfinderDesRades: Mit "füttern" meine ich, dass ja irgendwann die Daten aus meinem zu bearbeitenden Excel in die verschiedenen Tabellen müssen. In meinem DataSet habe ich jetzt 3 Tabellen: "VorlageZahlungen", "Sheet" und "Column". In deinem Video vier Views(I) generierst du die Daten für deine Tabellen "Article", "Category" und "Deliverer" mittels Code. Bei mir ist es so, dass das zu bearbeitende Excel meiner Tabelle "VorlageZahlungen" zugewiesen wird. In der Tabelle "Sheet" werden die Namen der einzelnen Sheets des zugewiesenen Excels ausgelesen und in der Tabelle "Column" die einzelnen Spalten des jeweiligen "Sheet". So versteh ich das. Bin ich einigermassen auf dem richtigen Weg?

    @Kasi: Nein, habe ich noch nicht. Ich versuche gerade mit "New System.Data.OleDb...." weiterzukommen.
    Hi blam,
    hier ein Bsp. mit OLEDB

    in der Checkedlistbox sind die Spalten der ausgewählten Excel Tabelle

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Data.OleDb
    3. Public Class Form2
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\a9.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES'")
    6. con.Open()
    7. ListBox1.Items.AddRange(con.GetSchema("Tables", New String() {Nothing, Nothing, Nothing, "TABLE"}
    8. ).AsEnumerable().Select(Function(d) d("TABLE_NAME").ToString.Replace("$", "")).ToArray)
    9. End Using
    10. End Sub
    11. Private Sub ListBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    12. CheckedListBox1.Items.Clear()
    13. Using con As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\a9.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES'")
    14. Dim adp As New OleDbDataAdapter("Select * from [" & ListBox1.SelectedItem.ToString & "$]", con)
    15. Dim dt As New DataTable()
    16. adp.Fill(dt)
    17. For Each column As DataColumn In dt.Columns
    18. CheckedListBox1.Items.Add(column.ColumnName)
    19. Next
    20. End Using
    21. End Sub
    22. End Class


    sieht dann so aus



    gruss
    kasi

    blam schrieb:

    In deinem Video vier Views(I) generierst du die Daten für deine Tabellen "Article", "Category" und "Deliverer" mittels Code.
    Das geht bei dir natürlich nicht.
    Du musst die Datensätze selbst eingeben.
    So, wie ich das in post#13 geschrieben hab.
    Einen Parent->Child->Child - View bauen, und die Datensätze eingeben, mit der Hand. Wie in post#13 geschrieben.
    Du kannst auch einen Screenshot von deim typDataset anhängen, da sieht man am besten, ob auf richtigem Weg.
    Und wenn der Parent->Child->Child - View fertig ist, von dem auch ein Bild.
    Ach - zum Parent->Child->Child - View: Dazu gehören noch Buttons zum Abspeichern und zum Laden - so, wie im 4-View-Tut das glaub auch gibt.

    blam schrieb:

    Bei mir ist es so, dass das zu bearbeitende Excel meiner Tabelle "VorlageZahlungen" zugewiesen wird. In der Tabelle "Sheet" werden die Namen der einzelnen Sheets des zugewiesenen Excels ausgelesen und in der Tabelle "Column" die einzelnen Spalten des jeweiligen "Sheet".
    Nein, das hat keinen Sinn.
    Deine Tabellen sollen ja eine Vorlage sein, und nicht aus iwelchen dahergelaufenen Excel-Workbooks immer wieder anders befüllt werden.
    Sondern deine Vorlage-Datensätze, die du wie in post#13 beschrieben, von Hand eingibst - die bestimmen, welche Sheets später aus den dafür geeigneten Excel-Workbooks ausgewertet werden.

    Die Vorlagen sollen bestimmen, was angesprochen wird in der Excel-Datei.
    Nicht andersrum!
    Die Excel-Dateien sollen nicht bestimmen, was in der Vorlage steht.

    Aber die Excel-Dateien sind auch erst später dran - wenn die Vorlagen fertig sind, und abgespeichert, und von Platte eingelesen werden können.
    Die Vorlagen sind Vorlagen. Das wird einmal erstellt, und dann nicht weiter verändert.
    Sondern die Vorlagen werden angewendet auf die Excel-Dateien, die im Tagesgeschäft reinkommen mögen.

    Schickt dir FA Mitsubishi eine Excel-Datei, dann wendest du die "Mitsubishi-Vorlage" an.
    Schickt dir Volkswagen eine Excel-Datei, dann wendest du die "Volkswagen-Vorlage" an.
    So ist die Idee.
    jo - ergibt für mich Sinn - also ich kann mir einen denken, wenn ich das sehe:
    Die Excel-Workbooks sind verschieden aufgebaut, je nach Ersteller.
    Ihnen gemeinsam ist, dass sie Datensätze transportieren mit den in VorlageZahlungen aufgeführten Informationen - nur halt je nach Excel-Workbook-Ersteller in unterschiedlichen Sheets und Columns.

    Ist das richtig, dass es darum geht, aus Excel-Workbooks verschiedener Art Transaktions-Datensätze auszulesen, und in ein einheitliches Format zu überführen?