Daten aus 2 DataTables mit Relation

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

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    Daten aus 2 DataTables mit Relation

    Hallo zusammen,

    ich habe als Grundlage folgendes DataSet.



    Auf der Form ist es wie folgt dargestellt:



    Nun möchte ich mir eine Statistik ausdrucken. Und zwar brauche ich die Vertriebler(Name) und die Anzahl der Pläne die jeder einzelne Vertriebler erstellt hat.

    Quasi Vertriebler 1 hat 5 Stück, Vertriebler 2 hat 10 u.s.w.

    mit folgendem Code kann ich mir die Vertriebler anzeigen/Drucken lassen:

    VB.NET-Quellcode

    1. For i = 0 To bsVertriebler.Count - 1
    2. Dim rwVertriebler = DirectCast(DirectCast(bsVertriebler(i), DataRowView).Row, VertrieblerRow)
    3. .DrawString(rwVertriebler.Name.ToString, ListFont, Brushes.Black, x, y)
    4. y += LineHeight + 10
    5. Next​


    oder

    VB.NET-Quellcode

    1. ​Dim tb = Dts1.Vertriebler
    2. For Each rw In tb
    3. .DrawString(rw.Name.ToString, ListFont, Brushes.Black, x + 450, y - 245)
    4. y += LineHeight + 10
    5. Next


    Nun fehlen mir noch die Pläne zu den einzelnen Vertrieblern.
    Nun habe ich gesehen das die PlanRow auch die VertrieblerRow zur Verfügung stellt.



    Dadurch habe ich es mit folgendem Code Probiert.

    VB.NET-Quellcode

    1. ​For i = 0 To bsVertrieblerPlan.Count - 1
    2. Dim rwPlan = DirectCast(DirectCast(bsVertrieblerPlan(i), DataRowView).Row, PlanRow)
    3. Dim rwVertriebler = rwPlan.VertrieblerRow
    4. .DrawString(rwVertriebler.Name.ToString, ListFont, Brushes.Black, x + 300, y - 245)
    5. .DrawString(bsVertrieblerPlan.Count.ToString, ListFont, Brushes.Black, x + 150, y - 245)
    6. y += LineHeight + 10
    7. Next


    Ich bekomme den Namen und die Anzahl angezeigt. Aber jedesmal so oft wie die Anzahl der Pläne ist. Hat der Vertriebler 5 Pläne erstellt, werden 5 mal der Name und 5 mal die Anzahl "5" untereinander gedruckt.

    Irgendwie weiss ich gerade nicht wie ich es anders bewerkstelligen kann.
    Hier noch ein Bild wie der Ausdruck mit den Codes von oben ausschaut ( unabhängig vom Design...erstmal muss der Code funktionieren)


    Hat da jemand einen Tipp / Hinweis für mich?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Und Du willst was? Eine Liste von allen Vertrieblern und zu jedem die Pläne?
    Dann mein Pseudocode-Ansatz:
    For Each VT In Vertriebler
    Schreib VT-Daten
    For Each Plan
    If Plan.Vertriebler = VT Then Schreibe PlanDaten
    Next
    Next
    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.
    Ich brauche keine Plandaten, sondern die Anzahl der Pläne pro Vertriebler.
    Ich versuche es wenn ich später zuhause bin.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Ich brauche keine Plandaten, sondern die Anzahl der Pläne pro Vertriebler.
    Das ist z.B. die Anzahl Pläne des aktuell ausgewählten Vertrieblsers...

    VB.NET-Quellcode

    1. Dim rwVertriebler = DirectCast(DirectCast(bsVertriebler.Current, DataRowView).Row, VertrieblerRow)
    2. Dim cntPlan = rwVertriebler.GetPlanRows.Count - 1

    Das war der Weg den ich versucht hatte. Aber irgendwie hatte es nicht funktioniert. Intellisense hatte mir .count nicht angeboten. Nun weiß ich auch warum.

    VB.NET-Quellcode

    1. Imports System.Linq

    hat gefehlt. :(
    Danke euch für Eure Hilfe.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Erwischt. Ich bin mir grad nicht sicher und weiß auch nicht wo genau ich das finde. :(
    Wenn ich laut dem Bild richtig bin, ist es ein Object?!

    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Dein Bildle heisst zwar "ObjectBrowser", zeigt aber das LokalFenster (welches für die Fragestellung ungeeignet ist, weils Methoden nicht anzeigen kann).
    Das wäre aber wirklich besser, wenn du den ObjectBrowser kennen tätest.
    Film: VisualStudio richtig nutzen (Google ist nicht deine Mami)
    Speziell zum object-browsen im typisierten Dataset, gugge typed programming the typed Dataset, Kapitel #2 und #3

    Den Datentyp kannst du noch einfacher herausfinden, das mag ich dir aber garnet sagen, weil dann lässt du den OB ja links liegen.
    Also erst mittm OB den Datentyp rausfinden, dann sag ich wies noch einfacher geht :P

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

    Ok Bild war falsch benamt. Mein Fehler.

    Zurückgegeben wird die PlanRow, welche eine DataRow ist. Und diese ist doch vom Typ Object.

    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    guck richtig hin - was steht da?
    na, ich sag vor - da steht: GetPlanRows() As HartmantestDts.PlanRow()
    Beachte die () am Ende - ist das also eine PlanRow, oder vlt. was anneres (und wenn ja was)?

    An anderer Stelle tat ich auch den klugen Ausspruch
    Ein Integer ist kein Integer()
    und entsprechend verhält es sich auch hier.
    Wennde garnet drauf kommst, such dort nach der Zeichenfolge Integer() - da steht dann ja, worums geht.
    jo, und von Array kann man die .Length-Property abrufen, und braucht nicht mit Linq.Count() alle Elemente durchzuzählen.
    Das war (scheinbar) der langen Rede kurzer Sinn. Der tatsächliche Sinn lag aber im OB, und dann auch im richtigen Auffassen von (Array-) Deklarationen.

    Aber hier noch, wie man einen Datentyp blitzschnell zuverlässig ermittelt: Video-Tut: Welchen Datentyp hat das Objekt?

    Was natürlich kein Ersatz für den OB ist, also wennde noch was lernen willst, guck dir die Array-Klasse im OB ruhig mal an - hat ne Menge zu bieten.
    Und ich habe wie wild nach dem Datentyp gesucht. Wohl auch an der richtigen Stelle, aber den Klammern keine weitere Bedeutung geschenkt.
    Wieder was dazu gelernt.

    Ich bleibe lieber beim Objectbrowser. Wurde mit wärmstens an Herz gelegt und das wird auch so bleiben. Werde mir aber trotzdem mal die andere Art und Weise anschauen.

    Danke Dir.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.