typisiertes DataSet - alle vorkommenden Category Rows in Auswahl an Article Rows finden

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

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

    typisiertes DataSet - alle vorkommenden Category Rows in Auswahl an Article Rows finden

    Hallo ihr lieben
    Ich habe mir ein Bestellprogramm gebastelt, welches als zweite exe in meinem Programm funktioniert.
    Dieses Programm erstellt - gestartet durch die Hauptanwendung - für eine ausgewählte Firma ein DataSet mit entsprechenden Artikeln und Kategorien (Warengruppen).
    Dafür verwende ich ein extra DataSet. Im DtsSettings sind die Daten gespeichert, das DtsExport übernimmt die temporäre speicherung.
    DtsExport wird dann aus der Hauptanwendung in eine xml gespeichert, und im Bestellprogramm wird diese temporäre Datei dann eingelesen, damit die beiden DataSets verglichen werden können.
    Nun werden neue Artikel hinzugefügt, nicht vorhandene gelöscht usw.
    Das funktioniert alles einwandfrei. Mit einer Ausnahme.
    Beim Programmieren der Anwendung bin ich so vorgegangen, dass ich einen Lieferanten auswähle, und alle Artikel die diesem Lieferanten zugewiesen sind, dann im DtsExport landen.
    Allerdings hatte ich bei den Kategorien einen Denkfehler. Hier schmeiße ich einfach alle die es gibt rein. Sinnvoller wäre ja, nur Kategorien zu exportieren, für die es auch tatsächlich Artikel gibt.
    Hier der relevante Code: (Die Sub LoadSupplier öffnet eine Form, auf der alle Lieferanten zur Wahl stehen. Hier wird dann der SupplierBindingSource.Current entsprechend geändert)

    VB.NET-Quellcode

    1. 'Firma auswählen
    2. Dim result As DialogResult
    3. LoadSupplier(False, result)
    4. If result = DialogResult.Cancel Then Exit Sub
    5. If SupplierBindingSource.Current Is Nothing Then Exit Sub
    6. Dim SelectedSupplier = DirectCast(DirectCast(SupplierBindingSource.Current, DataRowView).Row, DtsSettings.SupplierRow)
    7. Dim CustNo = SelectedSupplier.CustomeNumber
    8. Dim ArticleSupplierRow = DtsSettings.ArticleSupplier.FirstOrDefault(Function(x) x.Name = SelectedSupplier.Name)
    9. If ArticleSupplierRow Is Nothing Then
    10. MessageBox.Show("Für diesen Lieferanten wurden keine Artikel gefunden")
    11. Exit Sub
    12. End If
    13. Dim RelevantRows = ArticleSupplierRow.GetArticleRows
    14. Dim newArticle As DtsExport.ArticleRow
    15. For Each row In RelevantRows
    16. newArticle = DtsExport.Article.NewArticleRow
    17. newArticle.ArtNr = row.ArtNr
    18. If Not row.IsEANNull Then newArticle.EAN = row.EAN
    19. newArticle.Name1 = row.Name1
    20. If Not row.IsName2Null Then newArticle.Name2 = row.Name2
    21. newArticle.Ve = row.Ve
    22. newArticle.PurchasingPrice = row.PurchasingPrice
    23. If Not row.IsNoteNull Then newArticle.Note = row.Note
    24. newArticle.expiring = row.Expiring
    25. newArticle.CategoryID = row.CategoryID
    26. DtsExport.Article.Rows.Add(newArticle)
    27. Next
    28. DtsExport.WriteXml(Application.StartupPath & "\Programme\Bestellung\TEMP" & SelectedSupplier.Name & ".xml")
    29. 'DtsExport leeren
    30. DtsExport.Article.Clear()
    31. 'Kategorien exportieren
    32. DtsSettings.Category.WriteXml(Application.StartupPath & "\Programme\Bestellung\TEMPCategory.xml")

    Nun scheitere ich aber an dieser Aufgabe.

    Ich möchte für jeden Eintrag in Dim RelevantRows = ArticleSupplierRow.GetArticleRows die Kategorie auslesen und jede vorkommende Kategorie einmal entsprechend exportieren.
    Da ein exportieren wie im obigen Beispiel ja nicht mehr möglich sein wird (schätze ich) - hätte ich auch kein Problem eine Table Categories im DtsExport anzulegen
    Und kann ich mit die CategorieRow evtl. schon an dieser Stelle holen: newArticle.CategoryID = row.CategoryID wenn ich nicht mit der ID arbeite?
    Soll ich ja eh nicht - aber bekomm ich immer nicht anders hin :(
    Bilder
    • DataSet.jpg

      63,34 kB, 530×469, 76 mal angesehen

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

    Die Kategorien kannst Du genauso in Dein ExportTds schieben. Musst sie nur alle zusammensammeln:

    VB.NET-Quellcode

    1. Dim CategoriesToExport = RelevantRows.Select(Function(x) x.CategoryRow)

    Da DtsExport vermutlich vom selben Typ wie DtsSettings ist, must Du also keine neue Tabelle anlegen. Sondern einfach nur CategoriesToExport in die entsprechende DataTable schieben.

    btw: Umbenennungstipp: RelevantRows ArticlesToExport


    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.
    Du willst scheints erst die untergeordnete Tabelle befüllen, und die übergeordneten Datensätze nachholen.
    Das ist bischen gegen das Konzept relationaler Datenverarbeitung, weil im Zwischenstadium fahren bei dir dann Datensätze rum mit ungültigen Fremdschlüsseln.
    Das einfachste "saubere" wäre, du holst in "ordentlicher" Manier erst alle Parent-Datensätze, dann alle ChildDatensätze, die du brauchst.
    Und dann löschst du die Parent-Sätze, die du nicht brauchst.

    Ansonsten müsste man was coden, wo zu jeder ChildRow geguckt wird, ob der Parent schon übertragen wurde.
    Das ginge mit einem HashSet(Of ParentRow).
    Danke euch beiden.
    Ich habe nun eure beiden Antworten quasi zusammengefasst.
    Nach @VaporiZed Lösungsansatz, berücksichtige ich

    ErfinderDesRades schrieb:

    Das einfachste "saubere" wäre, du holst in "ordentlicher" Manier erst alle Parent-Datensätze, dann alle ChildDatensätze, die du brauchst.

    Allerdings, weiß ich ja erst, welche ParentDatasätze (Kategorien) ich brauche, nachdem ich die ChildDatensätze (Artikel) habe.
    Deswegen suche ich mir zuerst die "ArticleToExport" und die zugehörigen "CategoriesToExport".
    Diese CategoriesToExport durchschleife ich dann, und speichere sie, wenn nicht schon vorhanen, in DtsExport.
    Danach schmeiße ich die ArticleToExport ins DtsExport.

    VB.NET-Quellcode

    1. 'zu exportierende Artikel suchen
    2. Dim ArticleToExport = ArticleSupplierRow.GetArticleRows
    3. 'Kategorien der Exportartikel speichern
    4. Dim CategoriesToExport = ArticleToExport.Select(Function(x) x.CategoryRow)
    5. 'Kategorien in DtsExport übertragen
    6. Dim newCategory As DtsExport.CategoryRow
    7. For Each Category In CategoriesToExport
    8. Dim FindCategory = DtsExport.Category.FirstOrDefault(Function(x) x.Name = Category.Name)
    9. If FindCategory Is Nothing Then
    10. newCategory = DtsExport.Category.NewCategoryRow
    11. newCategory.Name = Category.Name
    12. newCategory.ID = Category.ID
    13. DtsExport.Category.Rows.Add(newCategory)
    14. End If
    15. Next
    16. 'Artikel in DtsExport übertragen
    17. Dim newArticle As DtsExport.ArticleRow
    18. For Each row In ArticleToExport
    19. newArticle = DtsExport.Article.NewArticleRow
    20. newArticle.ArtNr = row.ArtNr
    21. If Not row.IsEANNull Then newArticle.EAN = row.EAN
    22. newArticle.Name1 = row.Name1
    23. If Not row.IsName2Null Then newArticle.Name2 = row.Name2
    24. newArticle.Ve = row.Ve
    25. newArticle.PurchasingPrice = row.PurchasingPrice
    26. If Not row.IsNoteNull Then newArticle.Note = row.Note
    27. newArticle.expiring = row.Expiring
    28. newArticle.CategoryID = row.CategoryID
    29. DtsExport.Article.Rows.Add(newArticle)
    30. Next
    31. DtsExport.WriteXml(Application.StartupPath & "\Programme\Bestellung\TEMP" & SelectedSupplier.Name & ".xml")
    32. 'DtsExport leeren
    33. DtsExport.Article.Clear()
    34. DtsExport.Category.Clear()


    Den Import in meinem Bestellprogramm passe ich jetzt erst an. Die Kategorien waren ja bisher in einer separaten xml.
    Allerdings sieht die erzeugte xml (mitsamt den Verweisen auf die CategorieID)aus obigen Code erst einmal richtig aus.