Tabellenbeziehungen

  • VB.NET
  • .NET 4.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von AKP.

    Tabellenbeziehungen

    Neu

    Hallo Leute

    Ich stehe hier zur Zeit ziemlich auf dem Schlauch. Ich habe dank der Videos "die vier Views" zwei Tabellen mit einer Beziehung erstellen können. Somit kann ich in der Tabelle Streamfiles auf die Ländernamen der Countrytabelle zugreifen. Ich will aber dabei gleichzeitig den ISO-Wert des ausgewählten Landes haben. Wenn ich nur die ISO-Spalte zur Streamfilestabelle hinzufüge, kann ich ja irgendein ISO-Wert auswählen, ich brauche aber den ISO-Wert des ausgewählten Landes in der Landspalte. Geht das nur mit viel Handarbeit, oder müssen die ISO-Werte in eine dritte Tabelle? Ich hoffe, ich habe mich einigermassen verständlich ausgedrückt.

    Besten Dank für euren Input.
    Bilder
    • Dataset.jpg

      15,97 kB, 414×181, 6 mal angesehen

    Neu

    zunächstmal würde ich StreamFiles singular benamen, denn ein solcher Datensatz stellt ein StreamFile dar, nicht mehrere.
    Dann verstehe ich nicht, warum sowohl StreamFile als auch Country eine Spalte Land aufweisen.
    Folglich weiss ich nicht, welches Land du meinst, wenn du vom "ausgewählten Land" sprichst.
    (tatsächlich verstehe ich auch den Unterschied zw. Country und Land nicht, ausser dass die Worte verschiedenen Sprachen entliehen sind)

    Und zuguterletzt weiss ich nicht, was das ganze bedeuten soll. Also was du modelliert hast ist:
    "Ein StreamFile hat mehrere Countries."
    Stimmt das mit den Verhältnissen, die du haben willst, überein, oder wäre es andersrum logischer:
    "Ein Country hat mehrere StreamFiles"
    ?

    Neu

    Warum vermischst Du Deutsch mit Englisch? Wäre Name statt Land nicht eine bessere Spaltenbezeichnung? Was ist ISO logisch gesehen, unabhängig von Deinen jetzigen Tabellen? Eine StreamFile-Eigenschaft oder eine Landeseigenschaft? Wenn Landeseigenschaft: Warum muss dann StreamFile diese Deiner Beschreibung nach auch enthalten, wenn eine StreamFile diese problemlos beziehen kann bzw. man im Code darauf zugreifen kann?
    Aber irgendwas stimmt bei dem Datenmodell nicht. Laut dem kann eine StreamFile zu vielen Ländern gehören, aber ein Land kann immer nur eine StreamFile haben. Ist das richtig? Oder sollte es andersrum sein? Oder sollte es gar so sein, dass die beiden effektiv unabhängig voneinander sind, sodass dort eine Zwischentabelle fehlt, die besagt, welche StreamFile-Instanz/Zeile und welche Country-Instanz/Zeile zusammen gehören können.
    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.

    Neu

    Also eigentlich sollte es anders herum sein: Ein Country hat mehrere StreamFiles.
    Im Feld ISO wird der Landcode (DE, AT, UK,..) des entsprechenden Landes gespeichert.

    Ich will eigentlich einfach eine StreamFile mit einem zugehörigen Land samt Landcode verknüpfen.

    Neu

    Dann musst Du die Beziehung umdrehen. StreamFiles braucht ne CountryID. Denn damit sagst Du dem tDS-Designer und später dem Compiler: »Diese StreamFile gehört zu dem Country mit der ID …«
    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.

    Neu

    Also. Ich habe nun die Beziehung geändert und es scheint soweit nun auch zu funktionieren. Wie kann ich denn nun einen Datensatz hinzufügen (gem. Anhang) und dabei die CountryID speichern. Ich habe die CountryID im Beispiel als Combobox hinzugefügt und lese deren Text aus; schlussendlich sollte es aber auch ohne dem gehen (CountryBindingSource.DisplayMember funzt nicht).
    Dateien
    • WindowsApp2.zip

      (134,73 kB, 1 mal heruntergeladen, zuletzt: )

    Neu

    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort Option Strict On projektweit setzen, alle Regler auf Fehler stellen, VB6-Namespace rauswerfen.

    Dann ist das hier ein Unding:

    VB.NET-Quellcode

    1. Dim newCustomersRow As DataRow = DataSetStream.StreamFile.NewStreamFileRow()
    2. newCustomersRow("Sender") = SenderTextBox.Text

    so geht's vernünftig:

    VB.NET-Quellcode

    1. Dim newCustomersRow = DataSetStream.StreamFile.NewStreamFileRow()
    2. newCustomersRow.Sender = SenderTextBox.Text


    Ne BindingSource hat keinen DisplayMember. Ne ListBox oder ComboBox hat einen. Aber was Du willst, ist was anderes: Du willst das, was man in der ComboBox (oder in der ListBox?) ausgewählt hat, als Country hernehmen. Aber nicht das, was angezeigt wird, ist das ausgewählte Country (das ist nur die Land- oder ID- oder ISO-Property), sondern das, was ausgewählt wurde, ist das ausgewählte Country. Hä? Im Current der CountryBindingSource steckt der ausgewählte Country-Eintrag. Die ComboBoxen zeigen nur Teile des ausgewählten Country-Eintrags an. Und wie kommt man jetzt vom BindingSource-Current auf das ausgewählte Country, was da drinne steckt? Such mal im Forum nach Doppelcast. Wenn Du den erfolgreich eingebaut hast und irgendwann sicher beherrschst, kannste Dir auch meine typisierte BindingSource antun. Aber das ist Zukunftsmusik.

    btw: Beim nächsten Mal bitte das Projekt bereinigt (außerdem ohne bin-, obj-, .vs- und .git-Ordner) hochladen.
    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.