Erstellen von Klassen -> Xml.Serialization | aus List(of Spalten erzeugen

  • VB.NET

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

    Erstellen von Klassen -> Xml.Serialization | aus List(of Spalten erzeugen

    Hallo ^^,

    die meisten Fragen konnte ich mir in diesem Forum beantworten, nun bin ich an einem Punkt wo ich nicht weiter komme :P.

    Folgende Situation
    Ich möchte aus einem „List(of cGroup)“ Spalten erzeugen. Für andere Angehensweisen bin auch offen ;).

    Hier meine Klasse

    VB.NET-Quellcode

    1. <XmlRootAttribute("Berechnung")> _
    2. Public Class cCalc
    3. <XmlArray("Item")> _
    4. Property _Item As New List(Of cItem)
    5. Public Class cItem
    6. <XmlAttribute()> Property ItemCode As String
    7. <XmlArray("ItemGroup")> <XmlArrayItem("Name")> Property _Group As New List(Of cGroup)
    8. Public Class cGroup
    9. Property Name As String
    10. Property inGroup As Boolean
    11. End Class
    12. End Class
    13. End Class


    Diese Klasse lasse ich über Xml.Serialization auslesen und in eine Datei schreiben. (die ADD Befehle für die Klasse hab ich mal weggelassen^^)
    Ausgabe

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <Berechnung xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <Item>
    4. <cItem ItemCode="1110005">
    5. <ItemGroup>
    6. <Name>
    7. <Name>Grp1</Name>
    8. <inGroup>true</inGroup>
    9. </Name>
    10. <Name>
    11. <Name>Grp2</Name>
    12. <inGroup>false</inGroup>
    13. </Name>
    14. </ItemGroup>
    15. </cItem>
    16. <cItem ItemCode="1110006">
    17. <ItemGroup>
    18. <Name>
    19. <Name>Grp1</Name>
    20. <inGroup>true</inGroup>
    21. </Name>
    22. <Name>
    23. <Name>Grp2</Name>
    24. <inGroup>false</inGroup>
    25. </Name>
    26. </ItemGroup>
    27. </cItem>
    28. </Item>
    29. </Berechnung>



    Diese XML-Datei soll als Quelle für EXCEL dienen. Aber ich brauch die Ausgabe in einem anderem Format.

    jetztige Ausgabe
    ItemCode
    Name
    inGroup
    1110005
    Grp1
    WAHR
    1110005
    Grp2
    FALSCH
    1110006
    Grp1
    FALSCH
    1110006
    Grp2
    WAHR


    Ausgabe die ich will
    ItemCode
    Grp1
    Grp2
    1110005
    WAHR
    FALSCH
    1110006
    FALSCH
    WAHR





    Hier eine grobe Ziel-Vorstellung wie Quelle dann aussehen würde
    Rech. Nr.
    Kunde
    ItemCode
    Stück
    Preis
    Grp1
    Grp2
    Grp...
    1
    Schmidt
    11110005
    5
    5,00 €
    WAHR
    FALSCH

    ...












    Danke ^^
    Das geht so nicht, schon vonne Datenmodellierung her.
    Deine cItem-Liste ist eine Baumstruktur, also in jedes cItem sind mehrere isInGroup-Items eingeschachtelt.
    Baumstrukturen sind Baumstrukturen - das sind keine Tabellen, und daher in Excel auch nicht als Tabelle darstellbar.

    Ändere die Struktur von cItem dahingehend, dass ein cItem genau 2 Properties hat: IsInGroup1 und IsInGroup2
    Die Verschachtelei ist dann aufzuheben, und dann ist dein Vorhaben prinzipiell wieder lösbar.
    Danke ErfinderDesRades,

    das konnte ich mir schon fast denken das es über diesen Weg nicht geht, schade. Die Herausforderung bei der Geschichte ist eben das die Anzahl der IsInGroup-Spalten variabel ist, es können 1 bis 6 Spalten sein, vll auch mehr.

    Falls jmd noch eine Idee hat, bitte schreiben :P.

    Ansonsten werde ich das Thema ende nächster Woche schließen.

    Info:
    Wenn ich die Struktur nach ErfinderDesRades ändere, funktioniert es problemlos. Aber halt fixe Spalten ^^.

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

    naja - WEr Lust hat, kann einen listigen Hack proggen.
    Also am Datenmodell ist nichts zu rütteln: das müssen 3 Tabellen sein: User, Group und Zuordnung

    Nun kann man vlt. hergehen, und zur Laufzeit nachgucken, wieviele Groups in der Group-Tabelle drin sind, wie die heißen, und dementsprechend DAtaColumns mit DataType.Bool an die User-Tabelle dranpatchen.
    Und dann halt die Zuordnungen durchgehen, und pro Zuordnung der zugeordneten UserRow an der richtigen Stelle ein True zuweisen, innerhalb dieses drangepatchten Bereiches.

    Jo, das kann man mit noch mehr List auch zur Anzeige bringen, also häßlich ist einfach, indem man ein ungebundenes DGV halt zur Laufzeit erst bindet.
    Und für einen Xml-Export geeignet dürfte das sowieso sein.

    Dann kann man das im DGV sogar bearbeiten, und die nächste Herausforderung ist, einen Rück-Konvertierer zu schreiben, der aus der einen großen User-TAbelle wieder 3 miteinander verknüpfte generiert - gewissermaßen ein "Re-Normalisierer", denn der erstgenannte Hack ist ein Verstoßen gegen die 3. Normalform.