Verständnisproblem bei den Beziehungen

  • VB.NET

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

    Verständnisproblem bei den Beziehungen

    Hallo,

    ich habe glaube ich ein Verständnisproblem was die Beziehungen angeht.

    In einem Dataset liegen die Tabellen wie im Anhang gezeigt.

    Ich habe im Designer Relationen hinzugefügt zwischen den Schlüsselfeldern.
    Angelegt sind in der Richtung (nennt man es so?), das Schlüsselfeld z.B.
    in Tabelle "Herkunft" die HerkunftID ist und Fremdschlüssel in "Personen"
    die HerkunftID. So habe ich das bisher überall gelesen.

    Dann habe ich ich ein BindingSource mit dem DataSet als DataSource, Member ist nicht vergeben.

    Im Form sind dann noch 4 Textfelder die ich wie folgt fülle.

    VB.NET-Quellcode

    1. tbVorname.DataBindings.Add("Text", BindingSource1, "tblPersonen.Vorname")
    2. tbName.DataBindings.Add("Text", BindingSource1, "tblPersonen.Name")
    3. tbBeruf.DataBindings.Add("Text", BindingSource1, "tblBerufe.Beruf")
    4. tbHerkunft.DataBindings.Add("Text", BindingSource1, "tblHerkunft.Herkunft")
    5. tbAusbildung.DataBindings.Add("Text", BindingSource1, "tblAusbildung.Ausbildung")


    Ich bekomme nun auch die richtigen werte in den Feldern angezeigt.

    Problem ist nun, dass z.B. die Methode

    VB.NET-Quellcode

    1. BindingSource.MoveNext
    nicht funktioniert.

    Ich vermute mal, dass hat was mit den Relationen im Zusammenhang mit der BindungSource zu tun. Die weiss wohl nicht, an welche Tabelle sie sich halten soll beim blättern.

    Ich hatte es in einem anderen Programm mal nach diesem Beispiel hier versucht.

    msdn.microsoft.com/de-de/library/c12c1kx4.aspx

    Hier sieht es mir so aus, dass in der Relation der Schlüssel und Fremdschlüssel anders rum vertüddelt ist wie es bei mir ist.

    Dann kann man auch in der 2. BindungSource als DataMebmber die relation wählen. Das geht bei meinem derzeitigen test leider nicht.

    Kann mir das jemand erklären?

    Danke und Gruß
    Bilder
    • dataset.jpg

      111,71 kB, 522×555, 155 mal angesehen
    naja - aufschlussreicher wäre ein Screenshot vom DatasetDesigner - weil aus dem Bildle mitte DatagridViews gehen die Beziehungen zw. den Tabellen ja nicht hervor.

    Mir scheint, du machst das garnet im Designer - im Code isses natürlich schwieriger, weil man hat alle Freiheiten alles mögliche falsch zu machen.
    guggemol "DatasetOnly" auf Movie-Tuts, wie man Relationen und Bindings und Zeugs sich zusammenklickst.

    Deine Verwendung der BindingSource ist auch extrem eigentümlich.
    Normalerweise kriegt eine bs immer einen Datamember, und damit ist klar, für welche Tabelle diese bs steht. Der Designer vergibt dabei sogar sprechende Namen.
    Und wenn die Tabelle klar ist, dann funzt auch bindingSource.MoveNext().
    Hi,

    anbei mal Screenshots von den Beziehungen. Hatte ja geschrieben das die alle im Designer gemacht sind.

    Ich kann der jetzt vorhandenen BindingSource ja eine Tabelle als Member geben, bekomme dann auch Daten rein wenn ich die Bindung an die Textbox so anpassen. Also aus "tblPersonen.Vorname" wird "Vorname"

    VB.NET-Quellcode

    1. tbVorname.DataBindings.Add("Text", BindingSource1, "Vorname")


    Aber bei den anderen Boxen mit Daten aus anderen Tabellen kommt nix.

    Ich habe das mit dem Beziehungen so verstanden, dass die übergeordnete Tabelle die Tabelle ist, welche den Primärschlüssel der jeweiligen Beziehung besitzt. Also in der Beziehung Person-Herkunft ist Herkunft die übergeordnete Tabelle, weil in der Beziehung hier auf den Primärschlüssel verwiesen wird.

    Bei dem von mir verlinktem Beispiel ist das jedoch verdreht wenn ich das richtig sehe und das verstehe ich irgendwie nicht.
    Bilder
    • beziehungen.jpg

      68,59 kB, 537×310, 140 mal angesehen
    • beziehungen2.jpg

      154,09 kB, 688×729, 118 mal angesehen
    Eine Beziehung bedeutet immer eins zu viele - jedenfalls im Dataset ist das so.
    Also ein Staat hat viele Regierungsbezierke, ein REgierungsbezirk hat viele Städte, eine Stadt hat viele Stadtteile , ein Stadtteil hat viele Straßen , eine Straße hat viele Häuser, bis hin zu Bewohnern, Kindern, Spielsachen (ein Kind hat viele Spielsachen, Bauteilen von Spielsachen usw.
    Eine Stadt hat aber auch viele Schwimmbäder, und ein Schwimmbad hat viele Angestellte (tja, und die haben auch Kinder mit Spielsachen, und da kanns verzwackt werden).

    Du kannst dir eine Beziehung vorstellen, als hätte der Parent eine Auflistung von Children, und heraus käme eine sich immer weiter verzweigende Baumstruktur. Das ist OOP-Denke, wo was hier als Beziehung bezeichnet wird, mit eingeschachtelten AUFLIstungen modelliert würde.

    Relationale Denke ist auch OOP, geht aber darüber hinaus, indem sie Verschachtelung simuliert - das eröffnet ganz neue Möglichkeiten, siehe die relationale GrundIdee.

    so, nun versuchma einen Sinn in deim Datenmodell zu finden:
    Eine tblAusbildung hat viele tblBerufe. - Was ist das überhaupt - ein tblAusbildung? Warum heißt das nicht einfach Ausbildung - könnteman leichter aussprechen.
    Aber der Sinn! Stimmt das, dass eine Ausbildung viele Berufe hat?
    Jedenfalls mit einer Maurer-Ausbildung wird man kein Bäcker.

    Ein Beruf hat viele Personen - ja dassis richtig, es gibt viele Polizisten, und die haben alle denselben Beruf - sehr gut.

    Eine Herkunft hat viele Personen? Wassn eine Herkunft? Ausländer? Unterschicht? Jude?
    Naja - kann mir ja egal sein - vom Datenmodell her ist das jdfs plausibel.

    nu guck noch Benamungs-Schema für DB-Entitäten, da steht inzwischen viel mehr als nur Benamungsrichtlinien (Singular, keine Sonderzeichen, keine Prefixe, Primkeys einfach "ID", ForeignKeys "ParentID", Beziehungs-Regeln), also das Schema kannich sehr empfehlen, das führt zu einem kohärenten und transparenten Design.

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

    Schon mal Danke für deine Mühe. Habe nun mal einiges umgesetzt bzw. das ganze einfach nochmal neu gemacht. Das ist alles rein fikitv, auch wenn ich die Herkunft nun etwas angepasst habe :)

    Ich habe nun auch wirklich mal alles zusammengeklickt.

    DataSet nochmal im Anhang. Die Beziehungen sind genauso eingebaut wie in dem Tutorial DataSet-Only.

    Auch habe ich den Fehler mit der Tabelle Ausbilung gemerkt. Diese ist nun an die Person gebunden. Realistisch kann eine Person ja mehrere Berufe haben, aber in meinem Modell ist festgelegt, dass eine Person nur einen Beruf und Ausbildung bzw. keine Ausbildung haben kann. Ich Denke mal, das Modell sollte so in Ordnung sein.

    Jetzt habe ich mit in einem anderen Formular TextBoxen reingeklickt aus dem Datenquellen-Fenster. Und zwar.

    Name
    Vorname
    Beruf
    Herkunft
    Ausbildung

    Code ist lediglich das readXML für das DataSet.

    Entsprechend dem geklicke gibt es nun auch 4 BindingSourcen. Alle haben die DataSource = DataSet und jede einzelne für sich den Member der jeweiligen Tabelle. Soweit so gut. BindingSource.MoveNext oder so geht ja jetzt nur bein den Daten der jeweiligen Member. Und da hänge ich auch nun schon wieder. Wie ginge es nun weiter, dass ich die richtigen Datensätze entsprechend der relation angezeigt bekomme?

    Bei den ganzen Tuts finde ich da irgendiwe keine Lösung oder einen Ansatz.

    Oder muss man tatsächlich alle Beziehungen umdrehen wie in diesem MSDN Beispiel? Dann eine BindingSource mit Member Person. 3 weiter mit Source = BindingSource(Person) und Member die Beziehungen?

    Ich blicke nicht mehr durch... ?(
    Bilder
    • beziehungen.jpg

      62,63 kB, 413×289, 111 mal angesehen

    Frettchen1982 schrieb:

    Wie ginge es nun weiter, dass ich die richtigen Datensätze entsprechend der relation angezeigt bekomme?
    keine Ahnung, was du meinst.

    Definiere "richtige Datensätze entsprechend der relation" versus "falsche Datensätze entsprechend der relation"

    welcher Relation? - es sind deren 3
    keine Ahnung, was du meinst.



    Definiere "richtige Datensätze entsprechend der relation" versus "falsche Datensätze entsprechend der relation"



    welcher Relation? - es sind deren 3
    Also im Anhang einfach nochmal die Daten der Tabellen.

    Jetzt habe ich 5 Textboxen aus dem Fenster Datenquellen in ein Formular gezogen. Für jede Tabelle hat sich nun eine BindingSource erstellt. DataSource ist das DataSet und Member jeweils die Tabelle.

    Die TextBoxen sollten nun z.b. so gefüllt sein beim Start:

    Vorname: "Michael"
    Name: "Kölner"
    Beruf: "Schlosser"
    Herkunft: "Köln"
    Ausbildung: "mit Abschloss"

    Nun sollte es noch möglich sein, mit MoveNext oder Last die Personen zu wechseln.
    Bilder
    • dataset.jpg

      101,21 kB, 618×475, 113 mal angesehen
    jo, dassis ein DetailView mit Joining.
    Detailview weißt du? - sonst gugge "Detailview" auf Movie-Tuts

    Zu JoiiningView gibts da auch ein Tut, aber mit den dir verhassten DatagridViews (die hier ja auch praktischer wären).
    Aber auch Filmchen für dich - gugge Viele DbSamples - geht zwar nicht direkt darum, aber so nebenbei wird da auch eine JoiningView-Combobox eingerichtet.

    Dassis halt das Wesen von Joiningview-Feldern: sie werden nicht mit Textboxen präsentiert, sondern mit Combos.
    Betrifft bei dir Herkunft, Beruf, Ausbildung.