mache aus zwei tabellen eine

  • VB.NET
  • .NET (FX) 4.0

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

    mache aus zwei tabellen eine

    Ich bräuchte hier mal einen Hint in die richtige Richtung.
    Mein DataSet sieht so aus:

    Ich würde gerne die Daten vollständig und redundant in eine einzige DataTable übertragen die die folgenden Spalten in genau dieser Reihenfolge enthält:
    keySubj, Gender, Age, keyTest, Stim, Resp

    VB.NET-Quellcode

    1. Dim dtSubjects = DeinDataSet.dtsubject.AsEnumerable()
    2. Dim dtTests = DeinDataSet.dtTests.AsEnumerable()
    3. Dim abfrage = From dtS in dtSubjects, dtT in dtTests
    4. Where dtT.keySubj = dtS.keySubj
    5. Select dtS.keySubj, dtS.Gender, dtS.Age, dtT.keyTest, dtT.Stim, dtT.Resp
    6. For each res in abfrage
    7. ....
    8. res.XX
    9. ...
    10. Next


    Jetzt ausm Kopf. Aber Stichwort Linq To DataSet, dort solltest alles dazu finden ;)
    Ich würd's so machen:

    VB.NET-Quellcode

    1. For Each rw In DeinDataSet.dtsubject
    2. Dim rwNew = DeineNeueTabelle.NewDeineNeueTabelleRow()
    3. For Each r In rw.GetdtsubjectRows
    4. rwNew.Gender = rw.Gender
    5. rwNew.Age = rw.Age
    6. rwNew.keyTest = r.keyTest
    7. rwNew.Stim = r.Stim
    8. rwnew.Resp = r.Resp
    9. DeineNeueTabelle.AddDeineNeueTabelleRow(rwNew)
    10. Next
    11. Next
    Aber warum möchtest du eine Tabelle in redundanter Form?

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VB1963“ ()

    vanao schrieb:

    Ich würde gerne die Daten vollständig und redundant in eine einzige DataTable übertragen die die folgenden Spalten in genau dieser Reihenfolge enthält:
    keySubj, Gender, Age, keyTest, Stim, Resp
    Fein, aber dazu musst du diese neue Tabelle erstmal anlegen in deim typisierten Dataset.
    Poste Screenshot, wenndes hast, dann kann man dir den Code zum Befüllen davon aufschreiben.

    Naja, vb1963s Code hat nun vorrausgesetzt, dass es eine solche Tabelle schon gebe - enthält aber auch einige Fehler.
    Also poste Screenshot des Datasets mit DeineNeueTabelle, dann kann man den korrekten Code schreiben.

    Aber wie vb1963 schon frug: Wozu brauchst du solch? Meist ist es unnütz, denn zb Databinding hält viel bessere, und v.a. redundanzfreie Möglichkeiten bereit, eine gejointe Gesamt-Tabelle zu präsentieren.

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

    Danke schonmal für die Tipps. Aber eigenlich wollte ich einen Lösungsweg, der ein bisschen flexibler ist und unabhängig von dem DataSet.
    Der Grund ist letztendlich dass ich alles exportieren will, z.B. in csv-file oder excel-spreadsheet.
    Dafür wollte ich den Zwischenschritt gehen. Erstmal alles in eine Tabelle packen, dann einfach über Spalten und Zeilen loopen. Kann auch ein Datagridview oder whatever sein. Aber am liebsten wäre mir eine DataTable.
    Das sollte auch dann noch funktionieren wenn ich Spalten zu meinem typisierten Dataset hinzufüge. Also eine Tabelle vorab zu definieren und in das Dataset einzufügen kommt nicht in Frage. Dann muss ich ja jedes mal wenn ich mein DataSet erweitere, auch diese Tabelle mit erweitern und den Code auch.

    Die Reihenfolge der Spalten sollte dabei einfach so sein wie im DataSet von Parent zu ChildTables jedoch ohne Spalten mit derselben Information doppelt zu haben.

    Ich dachte es gibt irgendweinen einfachen Kniff, den ich gerade nicht finde. Mein Gefühlt ist z.B. dass der SQL JOIN command hier hilfreich sein könnte. Aber vielleicht täusche ich mich?

    Wäre jedenfalls toll wenn ihr da noch Tipps hättet in welche Richtung ich suchen soll.

    vanao schrieb:

    Mein Gefühlt ist z.B. dass der SQL JOIN command hier hilfreich sein könnte. Aber vielleicht täusche ich mich?
    jo - täuschst dich

    Dein Problem ist nicht die Abfragerei - denn so oder so fragst du besser das Dataset typisiert ab, zB mit Linq, statt die Datenbank mit Sql abzufragen, untypisiert.

    Dein Problem ist, dass du nichts hast, wohinein du abfägst.
    Wir sind nu von einer typisierten DataTable ausgegangen, aber wenn du in iwas anneres die Abfrage-Ergebnisse ablegen willst - bitte - lass es uns wissen.
    Nur in "csv-file oder excel-spreadsheet" - damit kann man nichts anfangen.
    Weil das sind keine .Net-Objekte, und in ein "oder" kann man schon gar nicht Abfrage-Ergebnisse ablegen.

    Hier die typiserte Linq-Abfrage - das Ergebnis ist eine Auflistung anonymen Types - mach damit, was du Wolle:

    VB.NET-Quellcode

    1. Dim AnonymeResults = From rwTest In DeinTypisiertesDataset.dtTests Select Gender = rwTest.dtSubjectsRow.Gender, Age = rwTest.dtSubjectsRow.Age, Stim = rwTest.Stim, Resp = rwTest.Resp

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

    Danke Leute. Die Lösung ist nahe.

    VB.NET-Quellcode

    1. Dim OspanQuery = From rwS In dsMain.dtSubj
    2. Join rwI In dsMain.dtOsItem
    3. On rwS.keySubj Equals rwI.keySubj
    4. Join rwT In dsMain.dtOsTrial
    5. On rwI.keyItem Equals rwT.keyItem


    Funktioniert bis auf eine Kleinigkeit. Wenn die ParentRow keine ChildRows hat, dann kommt sie gar nicht rein. Logisch wegen Join On keyX = keyX. Wie kann ich also die "kinderlosen" ParentRows drin behalten?
    btw, mittlerweile hat das Datenmodell eine dritte ChildTable dazu bekommen. Die Abbildung oben ist also nicht mehr ganz korrekt.

    ErfinderDesRades schrieb:

    Left Join gibts bei Linq glaub nicht
    Stimmt.
    Das gibt ein leicht komplexeres Konstrukt.

    Aber auch das Problem hat schon mal jemand gelöst:
    msdn.microsoft.com/en-US/vstudio/ee908647.aspx#leftouterjoin
    stackoverflow.com/questions/3404975/left-outer-join-in-linq
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Fast Da.
    Habe mich hier durchgewühlt: stackoverflow.com/questions/26…multiple-left-outer-joins

    VB.NET-Quellcode

    1. Dim OspanQuery = From rwS In dsMain.dtSubj
    2. Group Join rwI In dsMain.dtOsItem On rwS.keySubj Equals rwI.keySubj Into combo1()
    3. From rwX In combo1.DefaultIfEmpty
    4. Group Join rwT In dsMain.dtOsTrial On rwX.keyItem Equals rwT.keyItem Into combo2()
    5. From rwY In combo2.DefaultIfEmpty
    6. Select rwS.ID, rwS.Age, rwS.Gender, rwS.DateOfTest, rwS.TimeOfTest, rwX.Phase, rwX.RespA, rwX.StimA

    aber es stimmt noch nicht ganz.
    1) kann ich so im Select Statement nicht auf die Variablen in rwY zugreifen
    2) hätte ich es so oder so lieber ohne Select Statement. Sondern so wie vorher.
    3) habe ich total den Knoten im Kopf

    P.S.: der Compiler mag auch das Into combo1 nicht. Macht mir klammern dahinter und sagt "method not available in this context"

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

    VB.NET-Quellcode

    1. Dim OspanQuery = From rwI In dsMain.dtOsItem
    2. Group Join rwT In dsMain.dtOsTrial
    3. On rwI.keyItem Equals rwT.keyItem
    4. Into combo1 = Group
    5. From c In combo1.DefaultIfEmpty
    6. Select _
    7. rwI.keySubj, rwI.keyItem, rwI.Phase, rwI.Testitem, rwI.StimA, rwI.RespA,
    8. c.keyTrial, c.StimB, c.RespB

    So habe ich jetzt erstmal versucht nur zwei der drei Tabellen zusammenzufügen. Ich bekomme hier eine NullReferenceExeption.
    Habe mich gerichtet nach dem was in der msdn hier steht: msdn.microsoft.com/de-de/library/bb918093.aspx
    Das hier ist der Beispielcode

    VB.NET-Quellcode

    1. ' "Flat" results.
    2. Dim petOwners = From pers In people
    3. Group Join pet In pets On pers Equals pet.Owner
    4. Into PetList = Group
    5. From pet In PetList.DefaultIfEmpty()
    6. Select pers.FirstName, pers.LastName,
    7. PetName =
    8. If(pet Is Nothing, String.Empty, pet.Name)
    9. ' Display "flat" results.
    10. output = New System.Text.StringBuilder()
    11. For Each pers In petOwners
    12. output.AppendFormat(
    13. pers.FirstName & ":" & vbTab & pers.PetName & vbCrLf)
    14. Next
    15. Console.WriteLine(output.ToString())
    16. ' This code produces the following output:
    17. '
    18. ' Magnus: Daisy
    19. ' Terry: Barley
    20. ' Terry: Boots
    21. ' Terry: Blue Moon
    22. ' Charlotte: Whiskers
    23. ' Arlene:


    Ich habe halt nicht den Part reingenommen, der äquivalent zu PetName = If(pet is Nothing, ...) ist.
    Es kann doch nicht sein dass ich das für jede Spalte aus den childtables machen muss!?