Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von TheQPat
Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von Abt
Das glaube ich noch nicht so ganz :-)
Du versuchst ja immer noch den SQL Query direkt an das DataGrid als Source zu hängen. Das funktioniert aber nur in den aller, aller, aller simpelsten Fällen; hier nicht mehr.

Jop, das war der bestands code denn ich gepostet hatte.

Zitat von Abt
Richtig. Du überspringst den zweiten Punkt; brauchst ihn aber in diesem Fall.

Genau. Ich kann denn Punkt nicht umsetzen. Das ist mein Grundproblem das ich seit erstellen des Beitrags habe ...

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von Abt
Das einzig verwirrende ist die "DayId", weil "Id" eigentlich eine andere Referenz meint; Du aber ja einfach die Ziffern 1-7 für den Wochentag.
Und die FKs dürfen halt eigentlich nicht NULLable sein.
also:
NULLable raus
Id raus
und DayId durch DayNumber ersetzen?


Zitat von Abt
Ja, und das ist eben, weil Dir bisschen die Grundlagen fehlen. Du denkst auch glaube ich immer noch, dass man Daten direkt so anzeigen kann wie man sie speichert oder abfragt; und das ist halt leider nicht / aller aller meistens nicht der Fall. Man muss in 99% Query-Resultate aufarbeiten; vor allem Joins.
Grundlagen vermitteln ist in einem Forum aber sehr schwer; das ist nicht unbedingt das perfekte Medium.
Ein Forum kann sehr sehr gut bei konkreten Probleme helfen - aber wir können es Dir halt nicht abnehmen, dass Du die Grundlagen lernen musst.


Ich glaube zu wissen wie man es macht, aber ich kann den code nicht zusammen stückeln.

Ich habe früher sachen mit WinForms erstellt, dort konnte man es direkt in ein Grid Packen.

Vom Prinzip her meint ihr glaub ich: Datenbank lesen -> Daten aufbereiten -> Daten ausgeben (wpf). Das Verwirrende ist aber die ganze Verknüpfung und verwürfele und da steige ich irgendwie aus.

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von T-Virus
Deine Mapping Tabelle macht so keinen Sinn.
In einer Mapping Tabelle bilden i.d.R. die PKs aus den jeweiligen Tabellen, die du mappen willst, den eigentlichen PK und damit auch den Eintrag selbst ab.

Oben hab ichs geschrieben dann heißt es es passt so, was denn jetzt?
Zitat von T-Virus
Du hast hier aber eine eigene ID Spalten als Identity angelegt, die hat in der Tabelle nichts zu suchen.
Eigentlich sollten hier nur die Spalten für den Mitarbeiter PK, Tag und Baustellen PK drin stehen.
Diese sollten auch nicht NULL sein, was dem Sinn der Mapping Tabelle wiedespricht.

Da hast du recht, ergibt keinen sinn, aber wenn ich die Tabelle nicht auslesse etc. stört sich auch nicht?
Zitat von T-Virus
Wenn es kein Mapping für einen Fall geben soll, dann gibt es in der Tabelle auch keinen Eintrag.


genau so ist es, und somit gibt es ja auch keinen NULL wert? Weill kein Eintrag in der Datenbank ist.




Zitat von T-Virus
Auch macht deine Bezeichnung der Tabellen so keinen Sinn.
Du musst nicht nochmal als Prefix Table* angeben.
Hier wäre es sinnvoller die Tabellen direkt und knapp zu bezeichnen wie ebn Mitarbeiter, Baustellen etc.
Die Mapping Tabelle würde ich z.B. als MitarbeiterBaustellenMapping anlegen, da es auch andere Mappings in der Datenbank geben könnte.

Dient zur übersichtlichkeit, zum Besseren Verständnis JA, ändert aber nichts am eigentlich Problem. Es ist ein bestehendes Programm das ich vor langer Zeit Progammiert hatte und auch lauffähig war. Dies soll nur erweitert werden.

Zitat von T-Virus
Dein aktueller Ansatz geht auch wieder in die falsche Richtung.
Du sollst doch die Daten wie beim Beispeil von Abt auslesen und dann parsen.
Jetzt haust du einfach ein DataTable in dein Grid, was die Anzeige auch nicht wie von dir gewünscht haben kann.

Jop, so einfach hatte ich es bisher.

Zitat von T-Virus
Ich habe irgendwie Zweifel, dass du recht verstehst was du machen solltest obwohl es klar geschrieben steht.

für jemanden der das Täglich macht, mag das zutreffen. Mein Problem ist von anfang an die Daten in das DataGrid zu bekommen.

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Die Datenbank Struktur ist bereit geändert. Steht ja oben wie sie jetzt ist.

Ich Arbeite mit einer Localen Datenbank aus Visual Studio.

CREATE TABLE [dbo].[TableBauvorhaben] (
    [BauvorhabenID] INT        IDENTITY (1, 1) NOT NULL,
    [Name]          NCHAR (20) NOT NULL,
    [Ort]           NCHAR (20) NOT NULL,
    [Abfahrt]       NCHAR (10) NOT NULL,
    PRIMARY KEY CLUSTERED ([BauvorhabenID] ASC)
);
CREATE TABLE [dbo].[TableMapping] (
    [Id]            INT IDENTITY (1, 1) NOT NULL,
    [MitarbeiterID] INT NULL,
    [BauvorhabenID] INT NULL,
    [DayID]         INT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);
CREATE TABLE [dbo].[TablePersonal] (
    [Id]                INT          IDENTITY (1, 1) NOT NULL,
    [Vorname]           VARCHAR (16) NOT NULL,
    [Nachname]          VARCHAR (16) NOT NULL,
    [Vorarbeiter]       BIT          DEFAULT ((0)) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC)
);


hab denn Code an meine Daten angepasst:


        public class MitarbeiterBaustellenRelation
        {
            public string Name { get; set; }

            public int Tag { get; set; }

            public string Bauvorhaben { get; set; }
        }

        // Verarbeitet die Liste der Relationen und liefert Dummy Mitarbeiter Objekte
        public List<Mitarbeiter> ParseMitarbeiterBaustellenRelationen(List<MitarbeiterBaustellenRelation> relationen)
        {
            Dictionary<string, Mitarbeiter> bekannteMitarbeiter = new Dictionary<string, Mitarbeiter>();

            foreach (var relation in relationen)
            {
                // Mitarbeiter über den Namen suchen
                if (!bekannteMitarbeiter.TryGetValue(relation.Name, out var mitarbeiter))
                {
                    mitarbeiter = new Mitarbeiter();
                    mitarbeiter.Name = relation.Name;
                    bekannteMitarbeiter[mitarbeiter.Name] = mitarbeiter;
                }

                switch (relation.Tag)
                {
                    case 1:
                        mitarbeiter.BaustelleMo = relation.Bauvorhaben;
                        break;

                    case 2:
                        mitarbeiter.BaustelleTue = relation.Bauvorhaben;
                        break;
                }
            }

            return new List<Mitarbeiter>(bekannteMitarbeiter.Values);
            
        }

konnte ich aber noch nicht teste.

Ich frage meine Daten ab und lege Sie ins DataGridView1.
string sSQL_TableCombine = "SELECT M.Id, M.Vorname, Map.DayID, B.Name FROM TablePersonal M INNER JOIN TableMapping Map ON Map.MitarbeiterId = M.Id INNER JOIN TableBauvorhaben B ON Map.BauvorhabenID = B.BauvorhabenID";
DataGridView1.ItemsSource = clsDB.Get_DataTable(sSQL_TableCombine).DefaultView;

Ich erinnere mich an meine alten Zeiten aus PHP, da war das nicht so umständlich.

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von T-Virus
Für die Anzeige hättest du doch alle Daten über die SQL Anweisung erhalten.
Wie meinst du das, bzw auf was beziehst du dich?

Zitat von T-Virus
Du müsstest jetzt nur noch hingehen und pro Mitarbeiter (Name) ein Objekt anlegen für die Anzeige.
Du Meinst aus der Mitarbeiter Tabelle ein Objekt erstellen?

Langsam bin ich am verzweifel :(

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von Abt
Mergen machste im Programmcode.

Und wie soll das bitte funktionieren? Jetzt hast du mich total verwirrt

Ich muss jetzt die Zeilen in eine Spalte schieben?

Edit: hab nochmal ein Bild angehängt wie es aussehen soll

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Das ist noch nicht ganz das was ich mir vorstelle, ich bekomme ja jetzt pro Mitarbeiter und Wochentag eine Zeile

"SELECT M.Vorname, Map.DayID,  B.Name FROM TablePersonal M INNER JOIN TableMapping Map ON Map.MitarbeiterId = M.Id INNER JOIN TableBauvorhaben B ON Map.BauvorhabenID = B.BauvorhabenID"

<DataGrid x:Name="DataGridView1" AutoGenerateColumns="false" Margin="10,11,10,10" ItemsSource="{Binding}" SelectedItem="{Binding SelectedItem}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="Vorname" Binding="{Binding Vorname}" Header="Vorname"/>
        <DataGridTextColumn x:Name="BaustelleMon" Binding="{Binding BaustelleMontag}" Header="Montag"/>
        <DataGridTextColumn x:Name="BaustelleTue" Binding="{Binding BaustelleDienstag}" Header="Dienstag"/>
        <DataGridTextColumn x:Name="BaustelleWed" Binding="{Binding BaustelleMittwoch}" Header="Mittwoch"/>
        <DataGridTextColumn x:Name="BaustelleThu" Binding="{Binding BaustelleDonnerstag}" Header="Donnerstag"/>
        <DataGridTextColumn x:Name="BaustelleFri" Binding="{Binding BaustelleFreitag}" Header="Freitag"/>
        <DataGridTextColumn x:Name="BaustelleSat" Binding="{Binding BaustelleSamstag}" Header="Samstag"/>
    </DataGrid.Columns>
/DataGrid>

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

kannst du mir in etwa verraten wie das SQL Query aussehen müste?

ich glaube mit

SELECT * FROM TableMapping LEFT JOIN TablePersonal ON TableMapping.BauvorhabenID = TablePersonal.BauvorhabenID LEFT JOIN TableBauvorhaben ON TableMapping.BauvorhabenID = TableBauvorhaben.BauvorhabenID
bin ich voll daneben

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Ich bin gerade dabei euren Ratschlag zu befolgen.

TableBauvorhaben:
ID | NAME
1 | Bauvorhaben Berlin
2 | Bauvorhaben München
3 | Bauvorhaben Hamburg
4 | Bauvorhaben Stuttgart

TableMitarbeiter:
ID | NAME
1 | Hans
2 | Josef
3 | Sepp
4 | Werner

TableHilfstabelle:
ID | BauvorhabenID | MitarbeiterID | DayID
1 | 1 | 1 | 1
2 | 4 | 1 | 2
3 | 2 | 1 | 3
4 | 1 | 1 | 4
5 | 1 | 1 | 5
6 | 2 | 1 | 6
7 | 3 | 2 | 1
8 | 1 | 2 | 2
9 | 2 | 2 | 3
10 | 1 | 2 | 4
11 | 4 | 2 | 5
12 | 3 | 2 | 6

Wie bekomme ich das jetzt sauber in ein DataGrid damit folgende Zeile pro Mitarbeiter ausgegeben wird:


Mitarbeiter Name | Bauvorhaben Name am Montag | Bauvorhaben Name am Dienstag | Bauvorhaben Name am Mittwoch | Bauvorhaben Name am Donnerstag ......

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

In meinem ersten Beitrag hatte ich ja meinen Code gepostet

SELECT * FROM TablePersonal LEFT JOIN TableBauvorhaben ON TablePersonal.BauvorhabenID_Mon = TableBauvorhaben.BauvorhabenID AND TablePersonal.BauvorhabenID_Tue = TableBauvorhaben.BauvorhabenID AND TablePersonal.BauvorhabenID_Wed = TableBauvorhaben.BauvorhabenID";

das ganze umbauen auf ein , würde auch nicht helfen?

wenn ich nur das probiere funktioniert es ja:
SELECT * FROM TablePersonal LEFT JOIN TableBauvorhaben ON TablePersonal.BauvorhabenID_Mon = TableBauvorhaben.BauvorhabenID

und ich bekomme meine daten mit
{Binding Name}
Name stammt aus der TableBauvorhaben

Umständliche Tabellen Struktur?
2 Tabellen davon einmal mit 2 Spalten und einmal mit 8 Spalten

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Sorry aber wir reden hier komplett aneinander vorbei.



Zitat von Abt
Hä, Du hast für jeden Tag eine eigene Spalte? :baby:
Dann hast Du keine N:M Relation, sondern einfach ein dicken Fehler im Sinne der Datenbank-Normalisierung ;-)
Weil man das auch nicht macht haben wir hier auch diese Darstellung nicht verstanden. Wie es richtig geht haben wir Dir nun (mehrfach) gesagt.
Aber nun gut; akzeptieren musst es wie gesagt selbst.


Warum darf ich nicht für jeden Tag eine Spalte haben? es geht um 6 Tage. Es ist nur eine Wocheneinteilung, es geht hier um geringe Datenmengen!

drum habe ich es ja auch ins WPF Forum geschrieben da es um ein Binding geht, nicht um Datenbanken Strukturierung etc.


Zitat von Abt
Den Wochentag kann man simpel über eine Enum-Darstellung als Ziffer in der DB abspeichern.

Im Code haste dann einfach das Enum und kannst in der UI einfach das Enum mit Hilfe von DateTimeFormatInfo.CurrentInfo.GetDayName( DB-Wert hier ) in einen lokalisierten Text (Deutsch Englisch... was auch immer) übersetzen und anzeigen.

auch nichts neues, wie jetzt schon öfters geschrieben mach ich das doch.


Zitat von Abt
Willst Du ohne Enum sondern nur mit Int-Ziffern arbeiten, dann musst das halt selbst umsetzen; in WPF und dem DataGrid zB über einen ValueConverter.

Ich will einfach NUR meinen Baustellennamen zur passenen Ziffer wissen. (siehe meine SQL abfrage). Aber jetzt zum eigentlichen Problem. Wie krieg ichs ins DataGrid?

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

ich glaube wir reden total aneinander vorbei

Tabelle Baustellen sieht so aus:

1 | Berlin
2 | München
3 | Hamburg
4 | Stuttgart


die Mitarbeiter Tabelle sieht so aus (oder nennen wir sie meinentwegen Zuordnungs Tabelle)

Hans | 1 | 3 | 2 | 5 | 3 | 2 | 5 |
Sepp | 3 | 2 | 2 | 3 | 2 | 5 | 3 |
Franz | 3 | 2 | 4 | 3 | 2 | 5 | 2 |


diese Tabelle soll in ein DataGrid blos eben nicht als Zahl sondern als Text.

Ist so etwas wirklich so schwer in C# und WPF zu realisieren?

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Mitarbeiter Tag 1 ------ Baustelle1
Mitarbeiter Tag 2 ------ Baustelle1
Mitarbeiter Tag 3 ------ Baustelle3



Jeder Mitarbeiter hat jeden Wochentage Eine Feste Baustelle. Die Baustelle ist fest an einen Mitarbeiter gebunden.

im eigentlichen sinne geht es ja (ob es jetzt logisch ist oder nicht) nur darum aus der Mitarbeiter Tabelle in der auch die BaustellenID pro Wochentag drin ist aus der ID den Namen zu Hohlen und das in ein DataGrid zu schmeißen.

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Meiner Ansicht nach habe ich das nicht



Ein Mitarbeiter hat Montag und Dienstag und Mittwoch .... eine Baustellen ID

Tabelle: Sepp | 1 | 3 | 2 | .... jetzt will ich doch nur wissen wie der Name der Baustelle am Montag, Dienstag und am Mittwoch etc ist ... drum nur einen JOIN in die Tabelle mit den Baustellen.

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Soweit habe ich das Verstanden wie ihr das meint, aber ich verstehen denn Sinn nicht für max. 6 zusätzliche werte eine Hilfstabelle anzulegen blos weil ich durch das JOIN nicht weiß und es nicht hinbekomme die ausgabe in ein DataGrid (wpf) auszugeben (der zusätzliche daten aus JOIN) ? ohne JOIN spreche ich den Namen ja direkt an durch das JOIN weiß ich aber nicht wie.

bei einem einfachen JOIN klappt es ja nur bei mehren JOIN nicht. Gibt es dafür eine Lösung oder wollt ihr mir sagen das dies nicht möglich ist und man mit einer Hilfstabelle arbeiten muss?

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von Th69
Du arbeitest mit Datenbanken und kennst nicht die verschiedenen Arten von Kardinalität (Datenbankmodellierung)?

Die arten waren mir bekannt nur die Bezeichnung nicht.

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Zitat von FZelle
Wie Th69 schon sagte, Grundlagen sind wichtig.
Da gebe ich dir voll und ganz recht, mit diesen binding zeug komme ich einfach nicht klar!
Zitat von FZelle
In deinem Fall gäbe es eine Tabelle mit Personal, Bauvorhaben und eine mit der Beziehung dazwischen.

Das mache ich doch mit JOIN?
Zitat von FZelle
Was machst du z.b. wenn eine Person morgens auf Baustelle A ist und nachmittags auf B, oder wenn sie 3-4 am Tag machen?

Super Idee, aber nicht notwendig für mein Einsatzgebiet ;)
Zitat von FZelle
Mit der Mappingtabelle kannst du das alles abfrühstücken.

Wie sieht eine Mappingtabelle aus? wo liegt darin der nutzen?

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Wie solte die Architektur denn sonst aussehen wenn ich für jeden Wochentag einen andere Baustelle zuweißen möchte?

ich weiß das Select * keine gute wahl ist, funktioniert aber auch nicht wenn ich alle selects angebe


was ist N:M???

Thema: Binding aus mehreren JOIN
Am im Forum: Datentechnologien

Hallo

Ich habe ein Problem mit JOIN und Binding.

Datenbank sieht so aus

TablePersonal :
Vorname | BauvorhabenID_Mon | BauvorhabenID_Tue | BauvorhabenID_Wed | ...
Hans | 1 | 2 | 1 | ...
Sepp | 2 | 1 | 3 | ...


TableBauvorhaben:
BauvorhabenID | Name
1 | Berlin
2 | München
3 | Hamburg


SQL:

"SELECT * FROM TablePersonal LEFT JOIN TableBauvorhaben ON TablePersonal.BauvorhabenID_Mon = TableBauvorhaben.BauvorhabenID AND TablePersonal.BauvorhabenID_Tue = TableBauvorhaben.BauvorhabenID AND TablePersonal.BauvorhabenID_Wed = TableBauvorhaben.BauvorhabenID";


<DataGridTextColumn x:Name="BaustelleMon" Binding="{Binding Name}" Header="Montag"/>
<DataGridTextColumn x:Name="BaustelleTue" Binding="{Binding Name}" Header="Dienstag"/>
<DataGridTextColumn x:Name="BaustelleWed" Binding="{Binding Name}" Header="Mittwoch"/>

Funktioniert nur ohne JOIN, problem ist wohl das es den Namen öfters gibt?


Die Ausgabe solte sein:

Hans | Berlin | München | Berlin | ...
Sepp | München | Berlin | Hamburg | ...

Hoffe ich konnte das so verständlich erklären?