Frage 1==>n Beziehung?

  • VB.NET

Es gibt 62 Antworten in diesem Thema. Der letzte Beitrag () ist von rrobbyy.

    Frage 1==>n Beziehung?

    Hallo

    Habe nun wieder viel gelesen etc und nun folgendes erarbeitet:

    Ich möchte jedem Kunden z.B. zwei Adressen zuweisen können und jeder Kunde soll x-Angebote bekommen können.
    Ist das dann so richtig?

    Spoiler anzeigen

    SQL-Abfrage

    1. CREATE TABLE [dbo].[Kunden] (
    2. [Id] INT IDENTITY (1, 1) NOT NULL,
    3. [KundenNr] NVARCHAR (50) NULL,
    4. [Vorname] NVARCHAR (50) NULL,
    5. [Nachname] NVARCHAR (50) NULL,
    6. [Telefon] NVARCHAR (50) NULL,
    7. [eMail] NVARCHAR (50) NULL,
    8. [Instagram] NVARCHAR (50) NULL,
    9. [Geschlecht] NVARCHAR (20) NULL,
    10. PRIMARY KEY CLUSTERED ([Id] ASC)
    11. );


    SQL-Abfrage

    1. CREATE TABLE [dbo].[Adressen] (
    2. [Id] INT IDENTITY (1, 1) NOT NULL,
    3. [ADKUID] INT NULL,
    4. [PLZ] NVARCHAR (50) NULL,
    5. [Stadt] NVARCHAR (50) NULL,
    6. [Strasse] NVARCHAR (50) NULL,
    7. [Nr] NVARCHAR (50) NULL,
    8. PRIMARY KEY CLUSTERED ([Id] ASC),
    9. CONSTRAINT [FK_Adressen] FOREIGN KEY ([ADKUID]) REFERENCES [dbo].[Kunden] ([Id])
    10. );


    SQL-Abfrage

    1. CREATE TABLE [dbo].[Angebote] (
    2. [Id] INT IDENTITY (1, 1) NOT NULL,
    3. [AGKUID] INT NULL,
    4. [AngebotNr] NVARCHAR (50) NULL,
    5. [Datum] DATE NULL,
    6. [Vorgang] NVARCHAR (50) NULL,
    7. PRIMARY KEY CLUSTERED ([Id] ASC),
    8. CONSTRAINT [FK_Angebote] FOREIGN KEY ([AGKUID]) REFERENCES [dbo].[Kunden] ([Id])
    9. );

    korrekt so. (du meinst sicher 1:n :) )

    auch wenn ich inhaltlich Angebote nicht als Tabelle sehen würde, sondern eher Aufträge, die Angebote, Lieferscheine, Rechnungen sein können


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

    korrekt so.

    Da bin ich anderer Meinung.

    Mit diesem Datenmodel wäre es nur dann korrekt, wenn pro Adresse nur 'EINE' Person leben dürfte, was in der Realität doch ein wenig anders aussieht.

    Wenn z.B. Hr. und Fr. Müller, zwei von einander unabhängige Kunden in der Kundentabelle, an der selben, bzw. den selben Wohnadressen wohnen würden, hätten wir Redundanzen.

    ... ergo, wie schon einmal im anderen Thread erwähnt, wirst du an einer Zwischentabelle (m:n) nicht rum kommen.

    Die 1:n Beziehung wäre bei deinen Angeboten richtig, aber auch nur dann, wenn jeder Kunde nur absolut persönlich Zugeschnittene Angebote von dir bekommt.
    Ab den Moment wo du denkst, dass ein anderer Kunde ebenso ein bereits vorhandenes Angebot bekommen sollte -> m:n.

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

    Ich habe das gerade ausprobiert. Das funktioniert sauber.

    Es gibt unendlich viele Kunden. Namen müssen redundant sein.
    Ein Kunde kann x Adressen haben. Bspw. Rechnungsadressen, Lieferadresse, abweichende Rechnungsadresse, etc.

    Die Adresse ist natürlich reduntant, was ja logisch ist. Ein Mietshaus mit mehreren Bewohnern hat immer dieselbe Adresse. Man führt nicht die Adressen als einzigartige Entität. Jedenfalls hier nicht. Bei der PLZ und dem Ort würde ich einen Kompromiss eingehen.

    Das müsste sogar noch genauer sein. Der Auftrag muss ebenfalls die Rechnungsadresse beinhalten, da eine Rechnung nachträglich nicht verändert werden darf. In diesem Modell kann man einen Auftrag zum 01.02.2021 anlegen mit Adresse x. Kunde zieht jetzt um, Adresse x muss angepasst werden. Darf aber nicht, da dadurch die Grundlage der Rechnung verändert wird, was mittlerweile nicht mehr erlaubt ist.

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

    das normalisieren darf nicht übertrieben werden. gerade bei adressen in solcher ein anwendung braucht man meiner meinung nicht auf redundanzen achten.

    man könnte aber durch aus überlegen - wie bereits erwähnt - dass man die verbindung PLZ ORT als extra tabelle anlegt. auch das land könnte man als tabelle anlegen. aber die ganze adresse ist dann wohl doch to much.
    Ich denke wir reden aneinander vorbei.

    Ich meine nicht, dass PLZ, Ort und Land in eigene Tabellen gehören. (Obwohl ich es so machen würde)

    Beispiel: Wir nehmen die Familie Müller. (Vater, Mutter, Sohn und Tochter)
    Alle vier haben ein separates Kundenkonto. Das heißt in der Tabelle Kunde sind 4 Datensätze vorhanden.
    Alle wohnen gemeinsam im selben Haus (An der SELBEN Wohnadresse). Also bekommen alle in der Tabelle Adresse in allen Attributen außer im FK die selben Werte.
    Das heißt wir haben 4 Datensätze in der Tabelle Adresse für eine vierköpfige Familie die alle am SELBEN Ort wohnen.

    Ab jetzt haben wir Redundanzen. Wir haben einen oder mehrere Werte eines Datensatzes an mindestens zwei oder mehreren Orten in der DB stehen.

    Jetzt sagt die Mutter, dass Sie die Adresse ihres Arbeitsplatzes als Lieferadresse für alle eintragen möchte, da dort die Pakete am einfachsten für sie und alle anderen Familienmitglieder entgegen zu nehmen sind.

    Es kommen weitere vier Datensätze in der Tabelle Adresse hinzu, obwohl diese eine Lieferadresse für alle vier Familienmitglieder gilt.
    Wir haben jetzt bereits acht Datensätze in der Tabelle Adresse, obwohl wir mit zwei Datensätzen auskommen würden, wenn das Datenmodel korrekt wäre.

    Zwei Jahre später meldet sich Fr. Müller und gibt eine neue Lieferadresse, wegen eines Jobwechsels bekannt. Die Wohnadresse bleibt gleich.
    Irgendwer muss das in der Datenbank ändern. Und derjenige weiß es nicht, oder hat es vergessen, dass Fr. Müller verheiratet ist und einen Sohn und eine Tochter hat.
    Er ändert nur die Lieferadresse bei Fr. Müller.

    Ein paar Tage später bestellt die Tochter etwas. Wohin wird das wohl geliefert werden??? Definitiv nicht an die neue Lieferadresse.

    das normalisieren darf nicht übertrieben werden

    Ich finde es nicht übertrieben, bis in die dritte Normalform zu gehen. Zumindest vermeidet man damit leicht entstehende Redundanzen die in diesem Datenmodel schon vorbestimmt sind.
    Hey zusammen

    Irgendwie kling das für mich als wenn hier jedes Model seine Berechtigung hat.
    Klar ist das man "Datenmodell" richtig anlegen sollte aber man sollte auch die Kirche im Dorf lassen oder? ;)

    Die Wahrscheinlichkeit das solche Extremfälle in meinem kleinen Projekt auftreten ist extrem gering also könnte ich auch mit kleinen Redundanzen??? ( hoffe hab das richtig verstanden ) leben.

    Ich tüftel mal weiter und habe bestimmt noch viele Fragen, wo ich Eure Hilfe brauche. ;)

    Danke
    @Maffi
    @rrobbyy
    @ErfinderDesRades

    Ich bin nun schon ein Stück weit gekommen. Im Moment versuche ich mich mit SQL Abfragen.
    Der Code funktioniert soweit nur Frage ich mich, wie kann ich das zusammenfassen ohne X-Mal eine Anfrage zu senden?
    Weil das wird noch erweitert um Datumsauswahl. Beispiel: alles nur vom 12.2021 oder so ähnlich...

    Ich habe schon mit UNION oder 2Mal mit WHERE versucht komme aber nicht weiter. Bin für jede Hilfe dankbar. ;)


    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'Berechenungen
    2. Public Sub aktlrech()
    3. GetSQLrech("SELECT SUM(Preis) AS PreisGes FROM EATab")
    4. 'GetSQLrech("SELECT SUM(Preis) AS PreisEin, EinAus FROM EATab WHERE (EinAus ='Einnahmen') GROUP BY EinAus")
    5. 'GetSQLrech("SELECT SUM(Preis) AS PreisAus, EinAus FROM EATab WHERE (EinAus ='Ausgaben') GROUP BY EinAus")
    6. End Sub
    7. Public Sub GetSQLrech(ByVal SQL As String)
    8. Try
    9. Dim conn As New SqlConnection
    10. Dim cmd As New SqlCommand
    11. conn.ConnectionString = constring
    12. cmd.Connection = conn
    13. cmd.CommandText = SQL
    14. Dim da As New SqlDataAdapter(cmd)
    15. Dim dt As New DataTable
    16. conn.Open()
    17. da.Fill(dt)
    18. frm_earRechnung.lbl_diff.Text = dt.Rows(0)("PreisGes").ToString()
    19. 'frm_earRechnung.lbl_einnahmen.Text = dt.Rows(0)("PreisEin").ToString()
    20. 'frm_earRechnung.lbl_ausgaben.Text = dt.Rows(0)("PreisAus").ToString()
    21. conn.Close()
    22. Catch ex As Exception
    23. MessageBox.Show(ex.Message)
    24. End Try
    25. End Sub

    Naja, die Arbeit ohne typDataset und Databinding ist höchst umständlich, aufwändig, ineffizient, fehleranfällig, unwartbar.
    Die Probleme beim zurückspeichern ... und dann den neuen, aktuellen Stand anzeigen... - sind ja noch nichtmal ins Gesichtsfeld gekommen.

    Ich halte es nicht für so sinnvoll, dir bei diesem Ansatz zu helfen.

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

    @ErfinderDesRades

    Zum einpflegen der ganzen Daten habe ich ja das Dataset und das klappt ja soweit wie ich mir das vorstellte.
    Ich weiß zum jetzigen Zeitpunkt aber nicht wie ich sonst an diese Werte kommen soll?
    Oder soll ich das aus den einzelnen DGV.Cells auslesen und berechenen usw????
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    Sorry das hilft mir nun nicht weiter.....


    Edit:
    Habs hinbekommen.. bestimmt keine saubere Lösung aber es funktioniert.

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

    Hilfe, habe ein knick im Hirn. ;( .. finde die Lösung nicht.
    Irgendwo bin ich im If Else auf dem Holzweg....???
    Es solle die beiden Textboxen geprüft werden ob Einträge enthalten und ob einer der RadioButtons ausgewählt wurde.
    Die Fehlermeldungen lasse ich im Label anstatt von Messageboxen ausgeben.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub inputcheck()
    2. Dim MwSt1 As Integer
    3. Dim MwSt2 As Integer
    4. Dim result1 As Boolean = String.IsNullOrWhiteSpace(SummeTextBox.Text)
    5. Dim result2 As Boolean = String.IsNullOrWhiteSpace(BeschreibungTextBox.Text)
    6. If MwSt1RadioButton.Checked = True Then
    7. MwSt1 = 0 : MwSt2 = 1
    8. ElseIf MwSt2RadioButton.Checked = True Then
    9. MwSt2 = 0 : MwSt1 = 1
    10. Elseif
    11. EAklasse.efehler("mwst") '<=========Fehlermeldung das kein RB gewählt
    12. ElseIf result1 = True Or result2 = True Then
    13. EAklasse.efehler("default") '<========Fehlermeldung das Textbox leer
    14. Else
    15. 'Me.Validate()
    16. 'Me.EATableBindingSource.EndEdit()
    17. 'Me.TableAdapterManager.UpdateAll(Me.EaDBDataSet)
    18. btn_save.Enabled = False
    19. EAklasse.efehler("ok") '<=========Meldung das gespeichert
    20. End If
    21. End Sub

    @ErfinderDesRades

    Hey
    Nein Strict ON <== Ist fest eingestellt ;-)
    Fehler weiß ich nicht mehr ( vergessen zu notieren ) Habe nun umgebaut aber es klappt nicht.
    Entweder werden die Textboxen nicht geprüft oder die RB...
    Der letzte Versuch war das zwar alles geprüft wird aber das bei Fehlern trotzdem bis zum letzten "else" läuft was ja nicht darf.

    Irgendwie blicke ich heute nicht durch die abfragen...
    Dassis widersprüchlich

    ErfinderDesRades schrieb:

    post#15, snippet zeile #12 darf jdfs nicht kompilieren.

    Amelie schrieb:

    Hat es ja auch nicht..

    Amelie schrieb:

    Der letzte Versuch war das zwar alles geprüft wird aber das bei Fehlern trotzdem bis zum letzten "else" läuft

    Wie kann es bis zum letzten "else" laufen, wenn es garnet kompiliert?
    In meiner Welt, wenn etwas nicht kompiliert, dann läuft es überhaupt nicht.
    Wenn da was anneres behauptet wird, neige ich dazu, mich veräppelt zu fühlen.
    Zu helfen eher unmöglich, wenn bei dir Dinge passieren, die garnet sein können?