Dataset Rows einer zweimal "untergeordneten" DataTable auslesen

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

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

    Dataset Rows einer zweimal "untergeordneten" DataTable auslesen

    Hallo ihr lieben
    Mit angehängtem (Bild) DataSet habe ich ein Bestellprogramm realisiert.
    Die Funktionen um eine Bestellung, bzw. einen Bestand zu tätigen, sind soweit fertig.
    Ich denke das DataSet erklärt sich von selbst. das einzige was wohl nicht klar ist sind die Columns Amount und TotalPrice in der DataTable Article.
    Diese habe ich eingefügt, um eine neue Bestellung "temporär" speichern zu können.
    Es muss also nicht beim Tätigen einer neuen Bestellung, eine OrderRow erzeugt werden, sondern erst wenn ich die Bestellung wirklich abschließe.
    Hier werden nun die DtsSettings.Article.Amount und ...TotalPrice in die Tabelle OrderEntry eingetragen und am Ende alle DtsSettings.Article.Amount und TotalPrice gelöscht.
    Ich glaube das macht es programmiertechnisch etwas schwieriger als wenn ich beim Klick auf "neue Bestellung" eine OrderRow erzeuge und sofort alle Mengen als OrderEntryRow speicher.
    Aber das Verhalten meines Programmes auf diese Art Mengen speichern zu können, ohne eine OrderRow erzeugen zu müssen, gefällt mir besser.
    Das jedoch bringt mich jetzt an einen Punkt an dem ich alleine nicht weiter komme.
    Und zwar muss ich, wenn ich eine alte Bestellung lade, auf die zugehörige OrderEntry zuggreifen und hier die Mengen aus der OrderEntry an die entsprechenden Article weitergeben.


    Also ich übergebe die ausgewählte OrderRow an meine Bestellform:

    VB.NET-Quellcode

    1. Private Sub OrderDataGridView_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles OrderDataGridView.CellDoubleClick
    2. Dim Orderrow = DirectCast(DirectCast(OrderBindingSource.Current, DataRowView).Row, DtsSettings.OrderRow)
    3. 'Bestellform anzeigen
    4. Dim newOrder As New frmNewOrder
    5. With newOrder
    6. .DtsSettings = Me.DtsSettings
    7. .ArticleBindingSource.DataSource = Me.DtsSettings
    8. .OrderBindingSource.DataSource = Me.DtsSettings
    9. .CategoryBindingSource.DataSource = Me.DtsSettings
    10. .StocktakingBindingSource.DataSource = Me.DtsSettings
    11. .SettingsBindingSource.DataSource = Me.DtsSettings
    12. .SetIsOrder = True
    13. .SetOrderrow = Orderrow
    14. .Show(Me)
    15. End With
    16. End Sub


    In der frmNewOrder prüfe ich dann, ob "OrderRow" (die über SetOrderrow bespeist wird) nicht nothing ist (also eine alte Order enthält).
    Wenn nicht, muss eben zu der OrderRow die OrderEntrys gefunden werden und entsprechend die Article.Amount und Article.TotalPrice befüllt werden.

    Wie stelle ich das am besten an?

    *Topic verschoben*
    Bilder
    • DataSet.jpg

      290,46 kB, 1.920×1.080, 61 mal angesehen

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

    DerSmurf schrieb:

    das einzige was wohl nicht klar ist sind die Rows Amount und TotalPrice in der DataTable Article.
    Ähm - wenn ich mich nicht sehr irre, sind Amount und TotalPrice keine Rows, sondern sind Columns.
    Und dann irritiert mich sehr, wie unordentlich die Tabellen in deim Dataset-Designer rumliegen. Ist dir entgangen, dass man die herumschieben kann, und so die Leserlichkeit dieses Datenmodells erheblich verbessern?

    Dein Anliegen verstehe ich nicht wirklich.
    In zeile#13 setzst du die OrderRow.
    Und wenn die Nothing ist, ...


    Ah - jetzt habichs - wenn sie nicht Nothing ist sollen deren Entries gefunden werden.
    Naja, die OrderEntries einer rwOrder kriegt man doch mit rwOrder.GetOrderEntryRows()
    Du musst doch das Tut gelesen haben, weil das Konzept kommt mir doch überaus bekannt vor!
    codeproject.com/Articles/10351…ped-Dataset-for-Beginners
    Huhu
    Sorry für meinen "Schlampenpost". Das fehlende Wörtchen "nicht" hast du korrekt dazugeraten. Dies habe ich ergänzt.
    Auch habe ich ein neues DataSet Bildchen angehängt. Ich weiß, dass man die Tables lustig hin und her bewergen kann. Aber ich hab mir ganz ehrlich keine Gedanken gemacht, dass es für jemanden, der sich dieses DataSet nicht jeden Tag anguckt ein Problem darstellt, wenn die Tables nur so dahingeschmissen sind. Allerdings gilt das ja wahrscheinlich auch für mich, wenn ich irgendwann in zwei Jahren mal was am Programm ändere.
    Das Tut habe ich gelesen, aus Verständnisspgründen mehfrach. GetRows() ist mir bekannt und auch die OrderEntry Rows habe ich.
    Allerdings brauche ich ja noch zu jeder OrderEntryRow die ArticleRow. Daran scheitere ich.
    Ich wollte mit einer For Each Schleife die OrderEntryRows durch und für jede row.getarticlerows() ausführen. Das klappt aber nicht.
    Traurigerweise habe ich direkt Lösungen wie ArticleID aus OrderEntryRow in DtsSettings.Article suchen im Kopf... das bekomm ich irgendwie nicht raus.

    VB.NET-Quellcode

    1. Private Sub LoadOldOrder()
    2. Dim OrderEntrys = OrderRow.GetOrderEntryRows()
    3. For Each row In OrderEntrys
    4. Dim OrderedArticle = row.getarticlerows() '
    5. 'getarticlerows" ist kein Member von "DtsSettings.OrderEntryRow".
    6. OrderedArticle.Amount = row.Amount
    7. OrderedArticle.TotalPrice = row.Price
    8. Next
    9. End Sub
    nochmal das Tut lesen und lernen, im ObjectBrowser deine DatasetKlassen nachzugucken.
    oder nochmal im Tut die Systematik der generierten Klassen nachlesen: Jede DataRow ist sowohl mit all ihren Childrows als auch all ihren ParentRows über total simpel selbsterklärende Methoden/Properties verknüpft. Und das so systematisch, dass ich hier deinen Code korrigieren kann, obwohl ich dein Dataset nicht habe:

    VB.NET-Quellcode

    1. Private Sub LoadOldOrder()
    2. Dim OrderEntrys = OrderRow.GetOrderEntryRows()
    3. For Each entry In OrderEntrys
    4. Dim OrderedArticle = entry.ArticleRow
    5. OrderedArticle.Amount = entry.Amount
    6. OrderedArticle.TotalPrice = entry.Price
    7. Next
    8. End Sub
    Eine ParentRow (wie OrderEntryRow.ArticleRow) ist natürlich nicht als .GetArticleRows(), abrufbar denn eine ParentRow ist ja immer nur eine einzige.
    Weil ein Parent hat viele Childs, ein Child hat aber nur einen Parent.