Linq - Group Join - Synatax Probleme

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

Es gibt 160 Antworten in diesem Thema. Der letzte Beitrag () ist von StGo.

    ErfinderDesRades schrieb:

    ups - übersehen!

    aber nützt nix - bei mir failt schon die Connection. Erstmal eh, denn LocalDb kennt mein System nicht als DB-Server, aber auch bei angepasst auf mein System erhalte ich:


    Wie gesagt, bei mir funktioniert dein Projekt schon.
    Und ich verstehe jetzt auch was du machen möchtest.

    Du möchtest im Prinzip alle Datensätze in eine Tabelle bekommen mit Details der jeweiligen XLS oder PDF Tabelle.

    Ich habe dein Projekt 1 mal ganz minimal angepasst, so erhält man wenigstens die Daten aus der DB im DataSet.
    Dateien
    Ich würde sagen das es an dem Pfad liegt oder es ist das falsche Projekt aktiv. Im Projekt TypisiertesDataSetTest1 muss der Pfad auf ~TypisiertesDataSet\TypisiertesDataSetTest1\StammdatenDB.mdf zeigen. Dann sollte das gehen. In den anderen Projekten kann es sein das der Pfad nicht agepasst ist weil ich die DB heute Morgen zum Hochladen in das Projekt kopiert habe.
    wie gesagt: ich keine Ahnung. Die Datei scheint er ja zu finden, nur denkt er iwie, dasses die DB bereits gibt - k.A., wie er drauf kommt.

    Ich hab auch nur vb2010.

    Ich sag ja immer: DBs entwicklen DatasetOnly: Das ist einfach, flexibel, portabel. An AliveDevils Lsg konnte ich sofort dran rumfrickeln.

    ErfinderDesRades schrieb:


    Ich sag ja immer: DBs entwicklen DatasetOnly: Das ist einfach, flexibel, portabel. An AliveDevils Lsg konnte ich sofort dran rumfrickeln.


    Hier habs für dich mal DS Only gemacht, damit du daran rumfrickeln kannst ;)
    Dateien
    Für dieses spezielle Problem - Daten aus entweder der einen oder der anderen Tabelle zu nehmen - fällt mir nur die Variante einer zusätzlichen Methode zur Erzeugung ein:

    VB.NET-Quellcode

    1. Public Iterator Function enumerateCells(dataset As DataSetStammdatenDB) As IEnumerable(Of Cell)
    2. For Each item In dataset.Stammdaten
    3. For Each pdf In (From p In dataset.PDF
    4. Where p.IdStammdaten = item.Id
    5. Select p)
    6. Yield New Cell() With {.Id = item.Id, .Eingabepfad = item.Eingabepfad, .Ausgebapfad = item.Ausgabepfad, .Bereich = pdf.Bereich, .Sheet = "-", .Zelle = "-"}
    7. Next
    8. For Each xls In (From p In dataset.XLS
    9. Where p.IdStammdaten = item.Id
    10. Select p)
    11. Yield New Cell() With {.Id = item.Id, .Eingabepfad = item.Eingabepfad, .Ausgebapfad = item.Ausgabepfad, .Sheet = xls.Sheet, .Zelle = xls.Zelle, .Bereich = "-"}
    12. Next
    13. Next
    14. End Function
    15. Public Structure Cell
    16. Public Property Id As Integer
    17. Public Property Eingabepfad As String
    18. Public Property Ausgebapfad As String
    19. Public Property Sheet As String
    20. Public Property Zelle As String
    21. Public Property Bereich As String
    22. End Structure

    Damit wird hoffentlich das erzeugt, was du brauchst.

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

    Ja genau, so ähnlich habe ich es jetzt auch gemacht.

    VB.NET-Quellcode

    1. Dim joinPDF = From s In dsStammdaten.Stammdaten
    2. Join p In dsStammdaten.PDF _
    3. On s.Id Equals p.IdStammdaten
    4. Select New With { _
    5. .sID = s.Id, _
    6. .sEingabepfad = s.Eingabepfad, _
    7. .sAusgabepfad = s.Ausgabepfad, _
    8. .sDateiTyp = s.DateiTyp, _
    9. .pBereich = p.Bereich}
    10. Dim joinXLS = From s In dsStammdaten.Stammdaten
    11. Join x In dsStammdaten.XLS _
    12. On s.Id Equals x.IdStammdaten
    13. Select New With { _
    14. .sID = s.Id, _
    15. .sEingabepfad = s.Eingabepfad, _
    16. .sAusgabepfad = s.Ausgabepfad, _
    17. .sDateiTyp = s.DateiTyp, _
    18. .xSheet = x.Sheet, _
    19. .xZelle = x.Zelle}
    20. Dim dsNew As New DataSet
    21. dsNew.Tables.Add("Tabelle1")
    22. With dsNew.Tables("Tabelle1").Columns
    23. .Add("ID")
    24. .Add("Eingabepfad")
    25. .Add("Ausgabepfad")
    26. .Add("DateiTyp")
    27. .Add("Bereich")
    28. .Add("Sheet")
    29. .Add("Zelle")
    30. End With
    31. For Each res In joinPDF
    32. Dim addingRow() = {res.sID, res.sEingabepfad, res.sAusgabepfad, res.sDateiTyp, res.pBereich}
    33. dsNew.Tables("Tabelle1").Rows.Add(addingRow)
    34. Next
    35. For Each res In joinXLS
    36. Dim addingRow() = {res.sID, res.sEingabepfad, res.sAusgabepfad, res.sDateiTyp, "", res.xSheet, res.xZelle}
    37. dsNew.Tables("Tabelle1").Rows.Add(addingRow)
    38. Next
    39. DataGridView1.DataSource = dsNew.Tables("Tabelle1")


    Du kannst die neue Datatable natürlich auch erst im Designer erstellen.
    Aber eine andere Möglichkeit 2 KOMPLETT verschiedene Tabellen zu einer zu erstellen, kenn ich nicht.

    Wären beide gleich könnte man dies mit Union realisieren aber so, no way glaube ich.
    ne? Da hab ich dir offsichtlich was voraus :P
    (und nicht zu vergessen die SplitContainer)

    Aber jetzt hab ich mal die Queries ganz anners gemacht - so kommt iwie was bei raus, was man sich evtl. als sinnvoll vorstellen kann:

    VB.NET-Quellcode

    1. Public Class mrfTest1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim dsStammdaten = DataSetStammdatenDB
    4. dsStammdaten.ReadXml("ds4EDR.xml")
    5. Me.DataGridView1.AutoGenerateColumns = True
    6. Dim q2 = From x In dsStammdaten.XLS Let s = x.StammdatenRow _
    7. Select s.Id, s.Eingabepfad, s.Ausgabepfad, s.DateiTyp, x.Sheet, x.Zelle, Bereich = ""
    8. Dim q3 = From p In dsStammdaten.PDF Let s = p.StammdatenRow _
    9. Select s.Id, s.Eingabepfad, s.Ausgabepfad, s.DateiTyp, Sheet = -1, Zelle = "", p.Bereich
    10. Me.DataGridView1.DataSource = q2.Concat(q3).ToList
    11. End Sub
    12. End Class

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

    Interessante Lösung EDR :) Ganz ohne Join. Sehe ich das richtig das du die Tabellen nur zusammenfügst oder verstehe ich das Union falsch? Muss ich nicht Joinen bevor ich daten zurückschreiben kann? Ist damit eine neue Tablle im DataSet entstanden? Wie kann ich mir das vorstellen?

    Gruß
    Hast du's denn mal laufen lassen?

    Das Union war übrigens unangemessen - hab ich jetzt durch .Concat ersetzt

    joins kannst du niemals bearbeiten und zurückschreiben - naja, bearbeiten schon, aber da's nicht zurückzuschreiben geht ist bearbeiten nicht sehr sinnvoll.

    Grund ist, dass dabei mehrere Tabellen zusammengerührt werden, aber im Dataset (jdfs. im typisierten) gibts keine zusammengerührten Tabellen.
    Und in einer DB erst recht nicht.

    Hier das Problem ist fast noch schlimmer: es wird mit anonymen Typen gearbeitet, und die sind nur lokal, und sonst zu absolut garnix zu gebrauchen. Einen anonymen Typ kannst du nicht mal an eine annere Methode übergeben, denn du kannst keine anonymen Parameter für die Methode deklarieren.

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

    Habe ich laufen lassen. Klar warum nicht. Die Anzeige stimmt überein mit dem was gewollt war. Ausnahme ist Zeile 4 Spalte Sheet. Aber genau an der Stelle kam mir die Frage ob das alles so funktioniert wie ich es mir vorgestellt habe. Da Ihr ja jetzt die Idee kennt wie würdet ihr die Datenbank bzw das View aufbauen?

    Mir fehlt einfach die Erfahrung. Und graue Theorie aus Vorlesungen nützt mir momentan eher wenig
    Klar kann ich machen:

    Grundsatz:
    Eine Datenbank die Dokumente (verschiedene Formate) mit ihrem Eingabepfad (Pfad wo das Dokument zu finden ist) und einem Ausgabepfad speichert. Dazu gesellen sich Informationen welche Stelle im Dokument verarbeitet werden muss.

    Daraus enstand die Idee einen Stammdatentablle zu erstellen die die Gemeinsamkeiten speichert und eine Tabelle für jeden Dateityp die die Dokumentspezifischen Eigenschaften speichert.

    Beispiel:
    Ein XLS Dokument hat einen Pfad. Es bekommt einen Pfad wo die Ausgabe später abgelegt wird. Dazu brauche ich die Informationen auf welchem Sheet und welcher Zelle ich die Datei auslese.
    Ein PDF Dokumnet hat einen Pfad und einen Bereich der ausgelesen wird.

    Erweiterbar:
    Wenn jetzt ein Dateityp hinzu kommt dachte ich das man eine weiter Kindtabelle hinzufüge und das Schema beibehalten kann: Ein DOC Dokument hat einen Pfad und wird an der Stelle xxx ausgelesen

    Ich dachte, dass eine flache Tabelle eine schlechte Idee ist da ich das Erweitern für schwieriger hielt. Ausserdem war ich der Meinung das es unprofessioneller ist. Inzwischen denke ich das alles hin zu schmeissen und eine simple flache Tabelle zu machen die ohne irgendwelche DataSets usw auslese.
    Denn auch die GUI macht mir schwierigkeiten wie man hier im Thread sieht. Falls jemand als eine zündende Idee hat wie ich das am besten gestalte freue ich mich über Feedback.

    Danke
    Was macht dir denn in deinem Fall GUI schwierigkeiten?

    Eventuell solltest du auch nicht gleich mit einer DB anfangen sonderst erst ein wenig mit DataSet, BindingSource rumspielen.

    Du bist auch gleich richtung Linq, was eventuell auch nicht gerade sinnvoll am anfang ist :D


    Ansich war dein Projekt ja "ok", zum Üben! Relationale Grundideen sind nie verkehrt. Mach es dir lieber etwas komplizierter als einfach eine flache Tabelle zu nutzen.
    Ja ich dachte das sei auch ganz OK. Aber ich suche nach einer vernünftigen Idee es für einen User aufzubereiten. Evwntuell wäre ein Master Detail View eine Möglichkeit?

    Die Datenbank macht mir weniger Schwierigkeiten. DataSet und typisierteDataSets machen mir Schwierigkeiten. Und wenn ich ehrlich bin frage ich mich auch wo der Vorteil ist ein DataSet ohne DB zu nutzen? Ob das DataSet in die DB updated oder in ein XML File.

    Sorry, ich verstehe gerade dein Problem nicht. Was willst du eigentlich von uns?


    verfolg doch den Thread! Von dir speziell gar nichts. Danke

    Das Ursprüngliche Problem ist gelößt. EDR hat die Anzeige durch einen Umweg hin bekommen. Die Lösung zeigt weiterhin, dass meine Übungsanwendung nicht zu gebrauchen ist. Sie erfüllt nicht das Ziel. Was auch OK ist da es eine Übung ist.

    Danach habe ich nach einer Alternativ-Idee gesucht auf Basis dieses Threads.

    Ich will also gar nichts. Wenn jemand eine Idee hat freu ich mich und arbeite in eine andere Richtung. Wenn keine Idee kommt dann ist es auch OK.