Probleme bei n:n Beziehung

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Probleme bei n:n Beziehung

    Hallo.
    Ich versuche gerade meine Datenbank zu erweitern. Es gibt eine Table mit (Mess-)Stationen, eine mit (Mess-)Zellen und eine mit K-Faktoren. Und jetzt möchte ich mittels zwei ComboBoxen die Station und Zelle wählen und die dazugehörigen Faktoren angezeigt bekommen. Ich stehe dabei wiedermal auf dem Schlauch... Ich habe dafür, wie auf dem Screenshot (NzuN) zu sehen, eine N:N Beziehung erstellt.
    Ich habe jetzt alle verknüpfungen durch, die mir logisch erschienen. Im Moment ist die Datenquelle des Datagrid, die Beziehung zwischen Station und K-Faktor Table, was schon mal dazu führt das die ID der Station in die DGV geschrieben wird, aber logischerweise nicht die der Zelle. Wie könnte ich das am einfachsten umsetzen? Nur "manuel" per codezeile...?

    Ich hoffe es ist verständlich genug und nicht all zu trivial. Ist ja nicht meine erste Datenbank, aber momentan verbrate ich nur Zeit um auf die Lösung zu kommen. Ein Denkanstoß wäre also Top von euch.

    Vielen Dank
    Schöne Grüße!!
    Bilder
    • Form.JPG

      26,56 kB, 574×360, 43 mal angesehen
    • NzuN.JPG

      39,1 kB, 201×737, 43 mal angesehen
    So ein ähnliches Ding hatten wir neulich schon mal. Geht nicht ohne Zusatzcode. Ohne wäre es der m:n-View vom EdR.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    ich find was du verlinkst nicht wirklich ähnlich. Auch finde ich da keine Lösung, sondern der TE dort scheint einfach das Interesse verloren zu haben.

    Hier würde ich sagen, geht es darum, einen Filter auf die K-Faktor-Tabelle zu setzen, der nach gewählter ZelleID und StationID filtert.
    Wie du sagst: Geht nicht ohne Zusatz-Code.
    Ist nicht ganz einfach, aber auch nicht soo schwierig mit DataExpressions.
    DataExpressions: Filter und berechnete Spalten im Dataset

    Hallo.
    Vielen Dank für eure Antworten! Also wenn ich das richtig verstehe, ist eine N:N in diesem Fall schon richtig?
    Ok. Ich muss dazu sagen, meine Aktuelle Problematik bezieht sich speziell erstmal auf das Erstellen von Einträgen in der K-Faktor Tabelle. Also dass die ID der Zelle und Station beim erstellen eines neuen Eintrags übernommen wird. Hätte ich gestern erwähnen müssen, war aber absolut nicht mein Tag.
    @ErfinderDesRades, deine DataExpressions hatte ich auch schon an anderer Stelle verwendet. Aber in dem Fall doch nur Hilfreich wenn ich eine reine Abfrage haben möchte, oder?

    Und was das Desinteresse betrifft, ich glaube das scheint nur so. Ich möchte nur nicht wieder den "Aufwändigsten" Weg einschlagen und erst nach Stunden/Tage/Wochen feststellen das es eine viel einfachere oder logischere Lösung gibt. Beispiel Typisiertes und Untypisiertes Dataset. Hätte ich davon nocht vorher schon gelesen..... Gar nicht auszumalen!
    Soviel dazu...

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

    ludl8615 schrieb:

    Und was das Desinteresse betrifft, ich glaube das scheint nur so.
    EdR bezieht sich da wohl auf den Thread, den ich verlinkt habe. Da war der TE nicht mehr aktiv.

    ErfinderDesRades schrieb:

    ich find was du verlinkst nicht wirklich ähnlich.
    In meinen Gedanken war das schon der richtige Thread, da es ja darum ging, dass man einen Ort wählt, eine Person und daraufhin den Erfahrungstext angezeigt bekommt, also den Eintrag aus der Zwischentabelle, genau wie hier. Da der dortige TE sich allerdings nicht geäußert hat, ob er in nem DGV arbeiten will oder mit ComboBox, TextBox und Co., lässt sich das aber auch nicht feststellen, wie es hätte sein können. Lirum larum. Ist ja grad nicht mehr zielführend, was ich schreibe.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    VaporiZed schrieb:

    EdR bezieht sich da wohl auf den Thread, den ich verlinkt habe. Da war der TE nicht mehr aktiv.


    Ja, Ok.. Hatte ich tatsächlich missverstanden, da ich den Thread nur überflogen hatte und mir direkt das Video zu gemüte geführt habe. Ich schau jetzt doch nochmal genauer rein.

    Aktuell Bastel ich hiermit (gerade erst angefangen):

    Quellcode

    1. Partial Public Class Standard
    2. Partial Public Class K_FaktorDataTable
    3. Private Sub K_FaktorDataTable_K_FaktorRowChanging(sender As Object, e As K_FaktorRowChangeEvent) Handles Me.K_FaktorRowChanging
    4. Me.FindByID(e.Row.ID).ZelleID = CInt(Eigenschaften.Zelle_CB.SelectedValue)
    5. End Sub
    6. End Class
    7. End Class


    Standard ist das DataSet
    Wie gesagt, es geht erstmal um das Anlegen der Einträge. Anzeigen/Filtern (abhängig der ComboBox "Zelle" und "Station") ist der nächste schritt...

    Edit:

    Quellcode

    1. Handles Me.K_FaktorRowChanging

    gegen

    Quellcode

    1. Handles Me.K_FaktorRowChanged

    ersetzt, -> führt zu StackOverFlow

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „ludl8615“ ()

    Also, ich bekomm es nicht gebacken. Ich bekomme zwar eine ID der Zeile zurück, kann in diese aber nicht schreiben, da "FindByID" die Zeile mit der ID nicht finden kann. Sie ist wohl noch nicht wirklich angelegt.

    Jetzt hatte ich das ganze in Form verlagert, das Event der Bindingsource abgegriffen und versucht mit Directcast zu arbeiten, da mir gerade die Ideen ausgehen. Aber dabei wird die Form einfach geschlossen.

    Quellcode

    1. Private Sub K_FaktAdd(sender As Object, e As ComponentModel.AddingNewEventArgs) Handles FKStationenKFaktorBindingSource.AddingNew
    2. Dim KFakt_Row = DirectCast(DirectCast(KFaktorBindingSource(KFaktorBindingSource.Position), DataRowView).Row, Standard.K_FaktorRow)
    3. MsgBox(KFakt_Row.id)
    4. End Sub


    Komme so nicht weiter. Vielleicht findet sich ja noch jemand der mich auf die richtige Fährte lockt. Vielleicht hat @ErfinderDesRades ja och einen Ansatz für mich. Mal abwarten...

    ludl8615 schrieb:

    Me.FindByID(e.Row.ID).ZelleID = CInt(Eigenschaften.Zelle_CB.SelectedValue)
    Eh, wiewas? Machst Du da eine partielle tDS-Klassendefinition mit Deinen CEs (ComboBox?) Das ginge etwas in die falsche Richtung. Die tDS-Klassendefinition sollte nix davon wissen, was mit ihm auf irgendeinem Formular gemacht wird. Meines Erachtens.
    Ich versuch mal was zu basteln. Weiß aber nicht, ob das heute noch was wird.

    btw: Bitte nicht den <>-Allgemein-CodeTag verwenden, sondern den spezifischeren VB.Net-CodeTag.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    wie gesagt: Die Lösung liegt in DataExpressions.
    Du kannst der KFaktorBindingSource eine Expression verpassen wie

    SQL-Abfrage

    1. ZelleId=3 And StationId=5


    Weiters das KFaktorBindingSource_AddingNew-Event behandeln, und im Datensatz, der dir da übermittelt wird, die ForeignKeys entsprechend setzen (nämlich auf 3 und 5.
    Wenn du dann einen neuen KFaktor ins Grid einträgst, bekommt der automatisch die erforderlicchen ForeignKeys.
    Wenn du hingegen über andere Kanäle als das DGV KFaktoren zufügst, sind vlt. annere Wege auch die besseren.
    Ach, jetzt weiß ich endlich, was Du meinst, worauf es hinaus läuft. Mit

    ErfinderDesRades schrieb:

    der KFaktorBindingSource eine Expression verpassen
    geht es darum, die Filter-Property der BS zu setzen 8-)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Ja vielen Dank schon mal!
    Da muss ich jetzt mal mein Gehirnkästchen ordentlich ankurbeln um das Ganze umzusetzen. So ganz schlau macht es mich auf Anhieb noch nicht, aber mal sehen. Vielleicht steig ich ja noch mit etwas probieren und Nachdenken ein!
    Ich melde mich dann sobald ich soweit bin (oder nicht weiter kommen sollte).
    Nochmals Vielen Dank für eure Hilfe!!
    Ich hab doch noch direkt Fragen.

    1. Bleibt es bei der Relation wie bei dem Bild im Anhang???
    2. Wenn ja, dann gibt es doch gar keine

    VB.NET-Quellcode

    1. KFaktorBindingSource
    , sondern

    VB.NET-Quellcode

    1. FKStationenKFaktorBindingSource
    und/oder

    VB.NET-Quellcode

    1. FKZelleKFaktorBindingSource


    3. Kann ich

    ErfinderDesRades schrieb:

    SQL-Abfrage
    ZelleId=3 And StationId=5
    wörtlich nehmen?

    4.

    VB.NET-Quellcode

    1. Private Sub FKStationenKFaktorBindingSource_CurrentChanged(sender As Object, e As EventArgs) Handles FKStationenKFaktorBindingSource.AddingNew
    wäre mein Ansatz (abhängig der richtigen BindingSource), wie kann ich die ForeignKeys der übermittelten Daten anpassen??

    Wahrscheinlich ist alles nicht so schwierig, aber es hält mich ziemlich auf und ich komme nicht wirklich auf einen grünen Zweig. Wäre echt Top wenn ihr mir doch nochmal unter die Arme greifen könntet.

    Vielen Dank!!!
    Bilder
    • Relation.JPG

      39,1 kB, 201×737, 25 mal angesehen
    Zu 1.: Das müsstest Du doch wissen, ob es Dir so passt. Oder geht an uns die Frage, ob es anders sinnvoller wäre?
    Zu 2.: Warum sollte es keine K_FaktorBindingSource geben? Du kannst aus dem Datenquellenfenster die von den anderen Tabellen abhängigen KFaktoren auf Dein Form hauen, wodurch sich die abhängigen KFaktoren ergeben. Oder Du ziehst nur ein DGV auf Dein Form, welches die KFaktoren als Tabelle enthält. Als Beispiel:

    Oben findest Du im A-Zweig die von A abhängigen C-Tabellenzeilen und im B-Zweig die von B abhängigen C-Tabellenzeilen. Und unten, als C-Zweig eben alle C-Tabellenzeilen - unabhängig von anderen BindingSource-Currents.
    Zu 3. kann ich nix sagen.
    Zu 4.: Der Sub-Name passt nicht zum Event, welches sie behandelt. Aber das ändert ja nix an der Funktionalität. ForeignKeys anpassen: Indem Du die DoppelCast-Currents der SupTables hernimmst. So würde ich es machen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    zu 3:
    Du solltest dich wirklich mit dem DataExpression-Tut vertraut machen.
    Also hier etwas zum wörtlich nehmen:

    VB.NET-Quellcode

    1. K_FaktorBindingSource.Filter = "ZelleId=3 And StationId=5"
    Du wirst einwenden: "aber das setzt ja vorraus, dass es eine K_FaktorBindingSource gibt."
    Ja, tut es.
    Und wenn es K_Faktor-Datensätze gibt mit ZelleId=3 und StationId=5, so werden sie im daran angebundenen DGV angezeigt - die anderen nicht.
    Und dann mach zur Abwechslung

    VB.NET-Quellcode

    1. K_FaktorBindingSource.Filter = ""
    und schau, was dann angezeigt wird.
    Und dann noch

    VB.NET-Quellcode

    1. K_FaktorBindingSource.Filter = "ZelleId=1 And StationId=2"

    Und jetzt die Preisfrage:
    Was musst du machen, wenn du alle K_FaktorRows sehen willst mit ZelleId=9 und StationId=2 ?
    Hallo.
    Also

    ludl8615 schrieb:

    Bleibt es bei der Relation wie bei dem Bild im Anhang???

    war tatsächlich nur eine Frage ob es Sinnvoller geht oder ob ihr es ganauso gemacht hättet.

    Punkt 2 war ein Denkfehler. Logisch geht das...

    ludl8615 schrieb:

    3. Kann ich

    ErfinderDesRades schrieb:
    SQL-Abfrage
    ZelleId=3 And StationId=5

    wörtlich nehmen?

    War nur um sicherzugehen das hier nichts umschrieben wird.

    VaporiZed schrieb:

    Zu 4.: Der Sub-Name passt nicht zum Event

    Jou, stimmt. War auch nur eine Verständnissfrage. Aber danke für die Info! ;) :)

    Edit:
    Ich schau mal wie weit ich damit komme. Arbeite mich mal in das Tutorium ein und probiere paralell aus.

    Vielen Dank schon mal!!

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ludl8615“ ()

    So, ich hab das ganze jetzt mal so umgesetzt:

    VB.NET-Quellcode

    1. '#################################
    2. '# K_Faktor Add
    3. '#################################
    4. Private Sub K_FaktorBindingSource_Add(sender As Object, e As ComponentModel.AddingNewEventArgs) Handles K_FaktorBindingSource.AddingNew
    5. Try
    6. ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    7. Dim CurrentZelleRow = DirectCast(DirectCast(ZelleBindingSource1.Current, DataRowView).Row, Standard.ZelleRow)
    8. Dim CurrentStationRow = DirectCast(DirectCast(StationenBindingSource1.Current, DataRowView).Row, Standard.StationenRow)
    9. Dim KF_Daten As DataRowView = DirectCast(K_FaktorBindingSource.List, DataView).AddNew()
    10. KF_Daten.Row.Item(1) = CurrentZelleRow.ID
    11. KF_Daten.Row.Item(2) = CurrentStationRow.ID
    12. e.NewObject = KF_Daten
    13. Catch ex As Exception
    14. End Try
    15. End Sub
    16. '#################################
    17. '# K_Faktor Sortieren
    18. '#################################
    19. Private Sub Stat_Zell_BS_CurrentChanged(sender As Object, e As EventArgs) Handles StationenBindingSource1.CurrentChanged, ZelleBindingSource1.CurrentChanged
    20. Try
    21. ' StationenBindingSource1 und ZelleBindingSource1 wurde erstellt um speziell auf dieses Event zu reagieren
    22. Dim CurrentZelleRow = DirectCast(DirectCast(ZelleBindingSource1.Current, DataRowView).Row, Standard.ZelleRow)
    23. Dim CurrentStationRow = DirectCast(DirectCast(StationenBindingSource1.Current, DataRowView).Row, Standard.StationenRow)
    24. K_FaktorBindingSource.FilterX("ZelleID = ? AND StationsID = ?", CurrentZelleRow.ID, CurrentStationRow.ID)
    25. Catch ex As Exception
    26. MsgBox(ex.Message)
    27. End Try
    28. End Sub

    Grundsätzlich funktioniert es ja. Es gibt aber noch zwei störende Geschichten, wobei erstes noch durch löschen der MsgBox(ex.Message) unsichtbar wird. Aber vielleicht (bin mir fast sicher) gibt es eine elegantere Lösung und ihr könnt mir diese verraten.

    1. Beim debuggen erscheint eine Fehlermeldung die durch das StationenBindingSource1_Event ausgelöst wird. Fehlermeldung lautet: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt, und kommt von der Zeile:

    VB.NET-Quellcode

    1. Dim CurrentStationRow = DirectCast(DirectCast(StationenBindingSource1.Current, DataRowView).Row, Standard.StationenRow)
    Aber wie schon erwähnt, nur beim Aufrufen der Form (im folgenden Video auch kurz zu sehen).

    2. Für die zweite Problembeschreibung, habe ich - wie schon erwähnt - ein kurzes Video erstellt:

    https://youtu.be/mEOc_e5STig
    Die Comboboxen zeigen nicht immer den anzuzeigenden Member an, sodern auch zwischendurch die ID oder gar nichts. Meistens nach dem klicken ins K-Faktor-DGV. Das Dropdown lässt sich auch nicht immer öffnen.
    Ich habe Daten mit der ID von "Station1 und Variabel 70" sowie in "Station3 und Standardzelle 70mm", der rest ist noch leer.

    Irgend ein Tip?? Ich hoffe ich hab nicht Grundsätzlich was falsch gemacht/verstanden..

    Schöne Grüße und ein schönes Wochenende!! :)
    Das CurrentChanged-Event wird ganz zum Anfang gefeuert, richtig. Einfach abfangbar mit If StationenBindingSource1.Current Is Nothing Then Exit Sub und Co.. Ob's immer sinnvoll ist, musst Du ausprobieren.
    Zum Video: Leider nicht verfügbar. Ggf. Screenshots?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Puh. So viele BindingSources. StationsBindingSource, StationsBindingSource1, ... Letztenendes müssten wir wissen, wie die Einstellungen für die ComboBox-assoziierten BindingSources sind. Am einfachsten wäre es, wenn Du Dir ein neues Formular machst, dort 2 leere ComboBoxen und ein ungebundenes DGV draufpackst, Dein tDS zur Laufzeit an das Formular weitergibst und die ComboBoxen und das DGV manuell Schritt für Schritt verknüpfst. Denn korrekt gebunden und ohne Code beeinflusst wechseln die BindingSources nicht einfach so ihre Currents.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.