2 Klassen miteinander verbinden

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

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Schrubbii.

    2 Klassen miteinander verbinden

    Hallo,

    ich hab ein "kleines" Problem mit meiner Weiterverarbeitung von Daten. Ich habe beliebig viele Zeilen in einem Array (of String) welche verarbeitet wurden. Diese sieht nun zB so aus (Anhang TestDaten.xml)

    Nun muss ich die Daten weiter verarbeiten. Hierzu hab ich 2 Klassen erstellt wie folgt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Customer
    2. Property FirstName As String = ""
    3. Property FirstName As String = ""
    4. Property LastName As String = ""
    5. Property Street As String = ""
    6. Property Zip As Integer = ""
    7. Property City As String = ""
    8. End Class
    9. Public Class Item
    10. Property ArticleNumber As String = ""
    11. Property ArticleText As String = ""
    12. Property Quantity As String = ""
    13. Property PZN As String = ""
    14. End Class


    Jeder Kunde hat 1-n Items. Wie müsste ich das jetzt machen damit ich über das Customer-Objekt welches ich erstellt habe (für jeden Kunden einen) auf diese Items zugreifen? Danke :)
    Dateien
    • TestDaten.xml

      (3,82 kB, 121 mal heruntergeladen, zuletzt: )

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

    Es gibt auch Auto-Implemented Properties.
    Das erspart Schreibarbeit.


    Ein einigermassen relationaler Ansatz wäre das:

    VB.NET-Quellcode

    1. Public Class Customer
    2. Public Property CustomerID As Long
    3. Public Property FirstName As String
    4. Public Property LastName As String
    5. Public Property Street As String
    6. Public Property Zip As String 'Postleitzahlen sind zwar numerisch, können aber führende Nullen enthalten
    7. Public Property City As String
    8. End Class
    9. Public Class Item
    10. Public Property ArticleNumber As String
    11. Public Property ArticleText As String
    12. Public Property PZN As String
    13. End Class
    14. Public Class Order
    15. Public Property CustomerID as String
    16. Public Property ArticleNumber As String
    17. Public Property Quantity As Integer
    18. End Class
    19. Public Class OrderList
    20. Public Property Orders As List(Of Order)
    21. End Class
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich würde eine systematischer Benamung vorschlagen:

    VB.NET-Quellcode

    1. Public Class Customer
    2. Public Property ID As Integer 'Primärschlüssel
    3. Public Property FirstName As String
    4. Public Property LastName As String
    5. Public Property Street As String
    6. Public Property Zip As String 'Postleitzahlen sind zwar numerisch, können aber führende Nullen enthalten
    7. Public Property City As String
    8. End Class
    9. Public Class Article
    10. Public Property ID As Integer 'Primärschlüssel
    11. Public Property ArticleText As String
    12. Public Property PZN As String
    13. End Class
    14. Public Class Order
    15. Public Property CustomerID As Integer '1. Fremdschlüssel
    16. Public Property ArticleID As Integer '2. Fremdschlüssel
    17. Public Property Quantity As Integer
    18. End Class


    Eine Klasse OrderList ist nicht erforderlich, denn die Klasse List(Of Order) gibts ja schon, und das ist ja eine OrderList.
    Okay, das hilft mir ja schonmal in der Theorie weiter. Nun liegts aber an der Programmierung. Bin von Java rüber gekommen nach VB & hab recht wenig Ahnung wie ich das nun umsetzen würde.

    Mein Beispiels-Datensatz mit allen Infos sieht nun wie folgt aus (XML-Format):

    XML-Quellcode

    1. <NumIndex index='0'>
    2. <order_id>18</order_id>
    3. <C0_customer_id>2</C0_customer_id>
    4. <order_main_entry_timestamp>2015-05-28 17:30:56</order_main_entry_timestamp>
    5. <OrderRowSet>
    6. <OrderRowSetNumIndex index='0'>
    7. <C0_order_row_id>37</C0_order_row_id>
    8. <C0_warranty_order_row>0</C0_warranty_order_row>
    9. <C0_A0_article_id>435</C0_A0_article_id>
    10. <C0_A0_article_no>7685923</C0_A0_article_no>
    11. <C0_A0_article_quantity>1.00</C0_A0_article_quantity>
    12. <C0_A0_article_description>Beschreibung 1</C0_A0_article_description>
    13. </OrderRowSetNumIndex>
    14. <OrderRowSetNumIndex index='1'>
    15. <C0_order_row_id>38</C0_order_row_id>
    16. <C0_warranty_order_row>0</C0_warranty_order_row>
    17. <C0_A1_article_id>1284</C0_A1_article_id>
    18. <C0_A1_article_no>18220</C0_A1_article_no>
    19. <C0_A1_article_quantity>20.00</C0_A1_article_quantity>
    20. <C0_A1_article_description>Beschreibung 2</C0_A1_article_description>
    21. </OrderRowSetNumIndex>
    22. </OrderRowSet>
    23. <DispatchAddress>
    24. <C0_first_name>TestV1 TestV11</C0_first_name>
    25. <C0_last_name>TestN1</C0_last_name>
    26. <C0_street>testS1</C0_street>
    27. <C0_house_no>1</C0_house_no>
    28. <C0_zip>TestZ1</C0_zip>
    29. <C0_city>TestC1</C0_city>
    30. </DispatchAddress>
    31. </NumIndex>
    32. <NumIndex index='1'>
    33. <order_id>20</order_id>
    34. <C1_customer_id>2</C1_customer_id>
    35. <order_main_entry_timestamp>2015-06-09 00:59:17</order_main_entry_timestamp>
    36. <OrderRowSet>
    37. <OrderRowSetNumIndex index='0'>
    38. <C1_order_row_id>40</C1_order_row_id>
    39. <C1_warranty_order_row>0</C1_warranty_order_row>
    40. <C1_A0_article_id>432</C1_A0_article_id>
    41. <C1_A0_article_no>7685716</C1_A0_article_no>
    42. <C1_A0_article_quantity>5.00</C1_A0_article_quantity>
    43. <C1_A0_article_description>Beschreibung 3</C1_A0_article_description>
    44. </OrderRowSetNumIndex>
    45. <OrderRowSetNumIndex index='1'>
    46. <C1_order_row_id>41</C1_order_row_id>
    47. <C1_warranty_order_row>0</C1_warranty_order_row>
    48. <C1_A1_article_id>432</C1_A1_article_id>
    49. <C1_A1_article_no>10143953</C1_A1_article_no>
    50. <C1_A1_article_quantity>2.00</C1_A1_article_quantity>
    51. <C1_A1_article_description>Beschreibung 4</C1_A1_article_description>
    52. </OrderRowSetNumIndex>
    53. <OrderRowSetNumIndex index='2'>
    54. <C1_order_row_id>42</C1_order_row_id>
    55. <C1_warranty_order_row>0</C1_warranty_order_row>
    56. <C1_A2_article_id>526</C1_A2_article_id>
    57. <C1_A2_article_no>65925</C1_A2_article_no>
    58. <C1_A2_article_quantity>1.00</C1_A2_article_quantity>
    59. <C1_A2_article_description>Beschreibung 5</C1_A2_article_description>
    60. </OrderRowSetNumIndex>
    61. </OrderRowSet>
    62. <DispatchAddress>
    63. <C1_first_name>testV2</C1_first_name>
    64. <C1_last_name>testN2</C1_last_name>
    65. <C1_street>testV3</C1_street>
    66. <C1_house_no>2</C1_house_no>
    67. <C1_zip>TestZ2</C1_zip>
    68. <C1_city>TestC2</C1_city>
    69. </DispatchAddress>
    70. </NumIndex>
    71. <NumIndex index='2'>
    72. <order_id>21</order_id>
    73. <C2_customer_id>139</C2_customer_id>
    74. <order_main_entry_timestamp>2015-06-09 01:03:34</order_main_entry_timestamp>
    75. <OrderRowSet>
    76. <OrderRowSetNumIndex index='0'>
    77. <C2_order_row_id>43</C2_order_row_id>
    78. <C2_warranty_order_row>0</C2_warranty_order_row>
    79. <C2_A0_article_id>435</C2_A0_article_id>
    80. <C2_A0_article_no>7685923</C2_A0_article_no>
    81. <C2_A0_article_quantity>1.00</C2_A0_article_quantity>
    82. <C2_A0_article_description>Beschreibung 6</C2_A0_article_description>
    83. </OrderRowSetNumIndex>
    84. <OrderRowSetNumIndex index='1'>
    85. <C2_order_row_id>44</C2_order_row_id>
    86. <C2_warranty_order_row>0</C2_warranty_order_row>
    87. <C2_A1_article_id>264</C2_A1_article_id>
    88. <C2_A1_article_no>15020</C2_A1_article_no>
    89. <C2_A1_article_quantity>1.00</C2_A1_article_quantity>
    90. <C2_A1_article_description>Beschreibung 7</C2_A1_article_description>
    91. </OrderRowSetNumIndex>
    92. </OrderRowSet>
    93. <DispatchAddress>
    94. <C2_first_name>TestV3</C2_first_name>
    95. <C2_last_name>TestN3</C2_last_name>
    96. <C2_street>TestS3</C2_street>
    97. <C2_house_no>3</C2_house_no>
    98. <C2_zip>TestZ3</C2_zip>
    99. <C2_city>TestC3</C2_city>
    100. </DispatchAddress>
    101. </NumIndex>


    Jede Num-Index gehört zu einem Kunden, jede "OrderRowSetNumIndex" ist ein Item eines Kunden.

    Eine Idee? :)
    1. das Xml ist unvollständig - es fehlt das Root-Element
    2. Es handelt sich nicht um Kunden, Artikel, Bestellungen, sondern um Bestellungen, BestellDetails, Lieferaddressen
      Da musst du ein ganz anderes Datenmodell für entwerfen, und ausserdem brauchst du ja trotzdem noch eine Kunde-Tabelle - nur in diesem Xml sind die Kunden garnet aufgeführt.
    3. Also auf Kunden wird verwiesen, mit einer customer_id, aber die Kundendaten selbst sind im Xml nicht enthalten
      Wie gesagt: trotzdem brauchst du eine Kundentabelle, denn ohne Kunde ist die schönste Bestellung nichts wert.
    4. selbes Problem mit den Artikeln: Was will man mit einer article_id, wenn es keine Daten zum Artikel gibt?
    Also du brauchst ein relationales Datenmodell, was folgende Tabellen in richtiger Weise miteinander in Beziehung setzt:
    Kunde, Bestellung, Artikel, BestellPosten

    Du kannst dir mal das "Minikass"-Sample von DataExpressions: Filter und berechnete Spalten im Dataset angucken, ungefähr so muss das Datenmodell strukturiert sein, nur dasses dort nur Artikel und Bons (=Bestellungen) gibt, Kunden sind dort nicht angelegt.




    ups - ich sehe grade: das xml ist komplett unbrauchbar: Es geht nicht an, dass in der ersten Bestellung die customerID c0_customer_id, heisst, in der 2. Bestellung heisst sie aber c1_customer_id, und in der 3. Bestellung c2_customer_id.
    Es ist jedesmal eine Customer-ID, und die darf nicht jedesmal anders heißen.
    Dasselbe gilt für alle anneren Xml-Tags auf unterster Ebene ebenso.

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

    ErfinderDesRades schrieb:

    das Xml ist unvollständig - es fehlt das Root-Element

    Ist das womöglich ein serialisiertes Objekt aus einem anderen Programm?
    Da fehlt nämlich normalerweise auch das Root-Element.

    In dem Fall könnte man es ja in eine passenden Datenstruktur rein deserialisieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo,

    danke für die Mühe.

    Habe den xml-Export nochmals verändert, diesmal mit anderer Ausgabe. Nun schaut diese so aus:

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1"?>
    2. <OrderExport Page="1" ItemsPerPage="2000" ServerTimestamp="1433805634">
    3. <NumIndex index='0'>
    4. <order_id>18</order_id>
    5. <customer_id>2</customer_id>
    6. <order_main_entry_timestamp>2015-05-28 17:30:56</order_main_entry_timestamp>
    7. <OrderRowSet>
    8. <OrderRowSetNumIndex index='0'>
    9. <order_row_id>37</order_row_id>
    10. <warranty_order_row>0</warranty_order_row>
    11. <article_id>435</article_id>
    12. <article_no>7685923</article_no>
    13. <article_quantity>1.00</article_quantity>
    14. <article_description>Beschreibung 1</article_description>
    15. </OrderRowSetNumIndex>
    16. <OrderRowSetNumIndex index='1'>
    17. <order_row_id>38</order_row_id>
    18. <warranty_order_row>0</warranty_order_row>
    19. <article_id>1284</article_id>
    20. <article_no>18220</article_no>
    21. <article_quantity>20.00</article_quantity>
    22. <article_description>Beschreibung 2</article_description>
    23. </OrderRowSetNumIndex>
    24. </OrderRowSet>
    25. <DispatchAddress>
    26. <first_name>testV1 TestV11</first_name>
    27. <last_name>testN1</last_name>
    28. <street>testS1</street>
    29. <house_no>1</house_no>
    30. <zip>testZip1</zip>
    31. <city>testCity1</city>
    32. </DispatchAddress>
    33. </NumIndex>
    34. <NumIndex index='1'>
    35. <order_id>20</order_id>
    36. <customer_id>2</customer_id>
    37. <order_main_entry_timestamp>2015-06-09 00:59:17</order_main_entry_timestamp>
    38. <OrderRowSet>
    39. <OrderRowSetNumIndex index='0'>
    40. <order_row_id>40</order_row_id>
    41. <warranty_order_row>0</warranty_order_row>
    42. <article_id>432</article_id>
    43. <article_no>7685716</article_no>
    44. <article_quantity>5.00</article_quantity>
    45. <article_description>Beschreibung 3</article_description>
    46. </OrderRowSetNumIndex>
    47. <OrderRowSetNumIndex index='1'>
    48. <order_row_id>41</order_row_id>
    49. <warranty_order_row>0</warranty_order_row>
    50. <article_id>432</article_id>
    51. <article_no>10143953</article_no>
    52. <article_quantity>2.00</article_quantity>
    53. <article_description>Beschreibung 4</article_description>
    54. </OrderRowSetNumIndex>
    55. <OrderRowSetNumIndex index='2'>
    56. <order_row_id>42</order_row_id>
    57. <warranty_order_row>0</warranty_order_row>
    58. <article_id>526</article_id>
    59. <article_no>65925</article_no>
    60. <article_quantity>1.00</article_quantity>
    61. <article_description>Beschreibung 5</article_description>
    62. </OrderRowSetNumIndex>
    63. </OrderRowSet>
    64. <DispatchAddress>
    65. <first_name>testV2</first_name>
    66. <last_name>testN2</last_name>
    67. <street>testS2</street>
    68. <house_no>1</house_no>
    69. <zip>testZip2</zip>
    70. <city>testCity2</city>
    71. </DispatchAddress>
    72. </NumIndex>
    73. <NumIndex index='2'>
    74. <order_id>21</order_id>
    75. <customer_id>139</customer_id>
    76. <order_main_entry_timestamp>2015-06-09 01:03:34</order_main_entry_timestamp>
    77. <OrderRowSet>
    78. <OrderRowSetNumIndex index='0'>
    79. <order_row_id>43</order_row_id>
    80. <warranty_order_row>0</warranty_order_row>
    81. <article_id>435</article_id>
    82. <article_no>7685923</article_no>
    83. <article_quantity>1.00</article_quantity>
    84. <article_description>Beschreibung 6</article_description>
    85. </OrderRowSetNumIndex>
    86. <OrderRowSetNumIndex index='1'>
    87. <order_row_id>44</order_row_id>
    88. <warranty_order_row>0</warranty_order_row>
    89. <article_id>264</article_id>
    90. <article_no>15020</article_no>
    91. <article_quantity>1.00</article_quantity>
    92. <article_description>Beschreibung 7</article_description>
    93. </OrderRowSetNumIndex>
    94. </OrderRowSet>
    95. <DispatchAddress>
    96. <first_name>testV3</first_name>
    97. <last_name>testN3</last_name>
    98. <street>testS3</street>
    99. <house_no>12</house_no>
    100. <zip>testZip3</zip>
    101. <city>testCity3</city>
    102. </DispatchAddress>
    103. </NumIndex>
    104. </OrderExport>


    Das Endresultat hat eine Struktur von (Beispiel):

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <Auftragsdatei xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <Auftraege>
    4. <Auftrag index='0'>
    5. <Kopfdaten>
    6. <Belegnummer>000036</Belegnummer>
    7. <Belegdatum>2015-05-11 11:35:49</Belegdatum>
    8. <Kundennummer>1</Kundennummer>
    9. <PatientAnrede>Anrede</PatientAnrede>
    10. <PatientName>testV1 testN1</PatientName>
    11. <PatientVorname>testV1</PatientVorname>
    12. <PatientNachname>testN1</PatientNachname>
    13. <PatientStrasse>testS1</PatientStrasse>
    14. <PatientPLZ>testZip1</PatientPLZ>
    15. <PatientOrt>testCity1</PatientOrt>
    16. </Kopfdaten>
    17. <Positionen>
    18. <Positionsdaten index='0'>
    19. <Artikelnummer>55671</Artikelnummer>
    20. <Artikeltext>Beschreibung 1</Artikeltext>
    21. <Menge>2</Menge>
    22. <Pharmazentralnummer>06579975</Pharmazentralnummer>
    23. </Positionsdaten index='1'>
    24. <Positionsdaten>
    25. <Artikelnummer>55710</Artikelnummer>
    26. <Artikeltext>Beschreibung 2</Artikeltext>
    27. <Menge>1</Menge>
    28. <Pharmazentralnummer>06580174</Pharmazentralnummer>
    29. </Positionsdaten>
    30. </Positionen>
    31. </Auftrag>
    32. <Auftrag index='1'>
    33. <Kopfdaten>
    34. <Belegnummer>000036</Belegnummer>
    35. <Belegdatum>2015-05-11 11:35:49</Belegdatum>
    36. <Kundennummer>1</Kundennummer>
    37. <PatientAnrede>Anrede</PatientAnrede>
    38. <PatientName>testV2 testN2</PatientName>
    39. <PatientVorname>testV2</PatientVorname>
    40. <PatientNachname>testN2</PatientNachname>
    41. <PatientStrasse>testS2</PatientStrasse>
    42. <PatientPLZ>testZip2</PatientPLZ>
    43. <PatientOrt>testCity2</PatientOrt>
    44. </Kopfdaten>
    45. <Positionen>
    46. <Positionsdaten index='0'>
    47. <Artikelnummer>55671</Artikelnummer>
    48. <Artikeltext>Beschreibung 3</Artikeltext>
    49. <Menge>2</Menge>
    50. <Pharmazentralnummer>06579975</Pharmazentralnummer>
    51. </Positionsdaten>
    52. <Positionsdaten index='1'>
    53. <Artikelnummer>55710</Artikelnummer>
    54. <Artikeltext>Beschreibung 4</Artikeltext>
    55. <Menge>1</Menge>
    56. <Pharmazentralnummer>06580174</Pharmazentralnummer>
    57. </Positionsdaten>
    58. <Positionsdaten index='2'>
    59. <Artikelnummer>55710</Artikelnummer>
    60. <Artikeltext>Beschreibung 5</Artikeltext>
    61. <Menge>1</Menge>
    62. <Pharmazentralnummer>06580174</Pharmazentralnummer>
    63. </Positionsdaten>
    64. </Positionen>
    65. </Auftrag>
    66. <Auftrag index='2'>
    67. <Kopfdaten>
    68. <Belegnummer>000036</Belegnummer>
    69. <Belegdatum>2015-05-11 11:35:49</Belegdatum>
    70. <Kundennummer>1</Kundennummer>
    71. <PatientAnrede>Anrede</PatientAnrede>
    72. <PatientName>testV3 testN3</PatientName>
    73. <PatientVorname>testV3</PatientVorname>
    74. <PatientNachname>testN3</PatientNachname>
    75. <PatientStrasse>testS3</PatientStrasse>
    76. <PatientPLZ>testZip3</PatientPLZ>
    77. <PatientOrt>testCity3</PatientOrt>
    78. </Kopfdaten>
    79. <Positionen>
    80. <Positionsdaten index='0'>
    81. <Artikelnummer>55671</Artikelnummer>
    82. <Artikeltext>Beschreibung 6</Artikeltext>
    83. <Menge>2</Menge>
    84. <Pharmazentralnummer>06579975</Pharmazentralnummer>
    85. </Positionsdaten index='1'>
    86. <Positionsdaten>
    87. <Artikelnummer>55710</Artikelnummer>
    88. <Artikeltext>Beschreibung 7</Artikeltext>
    89. <Menge>1</Menge>
    90. <Pharmazentralnummer>06580174</Pharmazentralnummer>
    91. </Positionsdaten>
    92. </Positionen>
    93. </Auftrag>
    94. </Auftraege>
    95. </Auftragsdatei>
    Also - das eigentliche Problem war: Das System für die ich diese Imports der .XML machen muss nimmt nur die 2te Struktur an, die 1te ist jedoch die welche ich aus meinem bisherigen System bekomme (also die wichtigen Teile daraus, das sind vielleicht 30% der Sachen aber den Rest hab ich schon gefiltert). Nun bleibt als "letzter" Schritt die Auslesung der 1. XML & die Umwandlung in das 2te Format. Wobei sich das Problem gerade wohl erledigt hat... denn eigentlich muss ich ja nur die Namen der einzelnen Knoten (oder Werte) auslesen & die benötigten in die Formatierung bringen....