Пример #1
0
 /// <summary>
 /// Handles the Click event of the cmdTestDb control.
 /// </summary>
 /// <param name="sender">The source of the event.</param>
 /// <param name="e">The <see cref="System.Windows.RoutedEventArgs"/> instance containing the event data.</param>
 private void cmdTestDb_Click(object sender, System.Windows.RoutedEventArgs e)
 {
     using (var db = new AquariusDataContext(_vm.ConnectionString))
     {
         // Test-Zugriff auf DB
         try
         {
             var test = db.Events.ToList();
             MessageBox.Show("OK!");
         }
         catch (Exception ex)
         {
             MessageBox.Show("Fehler beim Datenbank-Zugriff: " + ex.ToString());
             return;
         }
     }
 }
        /// <summary>
        /// Loads the data from database.
        /// </summary>
        private void LoadDataFromDb()
        {
            // Event-Id aus den Einstellungen holen
            var eventId = Properties.Settings.Default.EventId;

            using (var db = new AquariusDataContext(Properties.Settings.Default.ConnectionString))
            {
                // Test-Zugriff auf DB
                try
                {
                    var test = db.Events.ToList();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Fehler beim Datenbank-Zugriff! Verbindung zur Datenbank und Connection String in den Einstellungen prüfen.\r\n\r\nDetails:\r\n\r\n" + ex.ToString());
                    return;
                }

                var dbData = GlobalData.Instance;

                // Veranstaltungen laden
                var dbEvents = db.Events;
                dbData.EventsData = dbEvents.Select(e => new EventData()
                {
                    Id = e.Event_ID, Title = e.Event_Title
                }).ToList();
                if (dbData.EventsData.SingleOrDefault(ed => ed.Id == eventId) == null)
                {
                    MessageBox.Show("Veranstaltung nicht gefunden! Veranstaltung in den Einstellungen auswählen und Programm neu starten!");
                    return;
                }

                // Altersklassen einlesen
                var dbAgeClasses = db.AgeClasses.ToDictionary(ac => ac.AgeClass_ID, ac => ac);

                // Bootsklassen einlesen
                var dbBoatClasses = db.BoatClasses.ToDictionary(bc => bc.BoatClass_ID, bc => bc);

                // Ausschreibung einlesen
                var dbOffers = db.Offers.Where(o => o.Offer_Event_ID_FK == eventId).ToDictionary(o => o.Offer_ID, o => o);

                // Wettkämpfe einlesen
                var dbCompetions = db.Comps.Where(c => (c.Comp_Event_ID_FK == eventId) && c.Comp_DateTime != null).OrderBy(c => c.Comp_DateTime);

                // Boote einlesen (Entries sind Boote, in jedem Boot sitzt eine Mannschaft)
                // (gruppiert nach Meldung)
                var dbEntries = db.Entries.Where(e => e.Entry_Event_ID_FK == eventId).GroupBy(ee => ee.Entry_Race_ID_FK).ToDictionary(ee => ee.Key, ee => ee.Select(x => x).ToList());

                // Mannschaften einlesen
                // (gruppiert nach dem Boot, in dem sie sitzt)
                var dbCrews = db.Crews.GroupBy(c => c.Crew_Entry_ID_FK).ToDictionary(c => c.Key, c => c.Select(x => x).ToList());

                // Ruderer einlesen
                var dbAthlets = db.Athlets.ToDictionary(a => a.Athlet_ID, a => a);

                // Vereine einlesen
                var dbClubs = db.Clubs.ToDictionary(c => c.Club_ID, c => c);

                // Mappings Boot (!) <-> Verein
                var dbEntryLabels = db.EntryLabels.ToDictionary(el => el.EL_ID, el => el);

                // Labels für Boote (!)
                var dbLabels = db.Labels.ToDictionary(l => l.Label_ID, l => l);

                // Rennen tauchen mehrfach auf, falls es z. B. mehrere Leistungsgruppen gibt.
                // Da die Läufe aber ggf. noch nicht eingeteilt sind, lassen sich die Personen nicht
                // den einzelnen Rennen/Läufen zuweisen.
                // Derartig mehrfach vorkommende Rennen werden daher zu einem Rennen zusammengefasst:
                var competitionGroups = dbCompetions.GroupBy(c => c.Comp_Race_ID_FK).ToList();

                #region Wettkämpfe durchgehen

                dbData.RacesData = new List <RaceData>();
                foreach (var competionGroup in competitionGroups)
                {
                    _ = dbOffers.TryGetValue((int)competionGroup.Key, out var offer);
                    _ = dbAgeClasses.TryGetValue(offer.Offer_AgeClass_ID_FK, out var ageClass);
                    _ = dbBoatClasses.TryGetValue(offer.Offer_BoatClass_ID_FK, out var boatClass);

                    var  isChildrenRace    = (ageClass.AgeClass_MaxAge <= 14);
                    bool isLightweightRace = (offer.Offer_IsLightweight);
                    var  isCoxedRace       = (boatClass.BoatClass_Coxed == 1);

                    // Entscheiden, ob man das Rennen übernehmen muss
                    var raceOk = false;
                    if (isLightweightRace)
                    {
                        raceOk = true;                    // alle Leichtgewichtsrennen müssen zur Waage
                    }
                    if (isCoxedRace && !isChildrenRace)
                    {
                        raceOk = true;                                 // gesteuerte Rennen, die keine Kinderrennen sind, müssen zur Waage
                    }
                    if (raceOk)
                    {
                        // Rennzeit ist die Zeit des ersten Rennens dieser Gruppe
                        var raceTime = (DateTime)competionGroup.Select(x => x).OrderBy(c => c.Comp_DateTime).First().Comp_DateTime;

                        #region Gewichte bestimmen

                        var maxSingleWeight        = new Weight(ageClass.AgeClass_LW_UpperLimit, true);
                        var maxAverageWeight       = new Weight(ageClass.AgeClass_LW_AvgLimit, true);
                        var minCoxWeight           = new Weight(ageClass.AgeClass_LW_CoxLowerLimit, true);
                        var maxAdditionalCoxWeight = new Weight(ageClass.AgeClass_LW_CoxTolerance, true);

                        // wenn es kein gesteuertes Rennen ist, dann interessiert das Gewicht des Steuermanns nicht
                        if (!isCoxedRace)
                        {
                            minCoxWeight.Value = null;
                        }

                        // bei Kinderrennen interessiert das Gewicht des Steuermanns ebenfalls nicht
                        if (isChildrenRace)
                        {
                            minCoxWeight.Value = null;
                        }

                        // bei Einer-Rennen kein Mannschaftsdurchschnittsgewicht
                        if (boatClass.BoatClass_NumRowers == 1)
                        {
                            maxAverageWeight.Value = null;
                        }

                        // Wenn es kein Leichgewichtsrennen ist, dann interessieren auch die Gewichte der Ruderer nicht
                        if (!isLightweightRace)
                        {
                            maxSingleWeight.Value  = null;
                            maxAverageWeight.Value = null;
                        }

                        #endregion

                        // Rennen definieren und hinzufügen
                        var newRace = new RaceData()
                        {
                            Id                     = offer.Offer_ID,
                            RaceNumber             = offer.Offer_RaceNumber,
                            ShortTitle             = offer.Offer_ShortLabel,
                            LongTitle              = offer.Offer_LongLabel,
                            DateTime               = raceTime,
                            IsChildrenRace         = isChildrenRace,
                            IsCoxedRace            = isCoxedRace,
                            NumberOfRowers         = boatClass.BoatClass_NumRowers,
                            IsLightweightRace      = isLightweightRace,
                            MaxSingleWeight        = maxSingleWeight,
                            MaxAverageWeight       = maxAverageWeight,
                            MinCoxWeight           = minCoxWeight,
                            MaxAdditionalCoxWeight = maxAdditionalCoxWeight
                        };

                        dbData.RacesData.Add(newRace);

                        // zum aktuellen Rennen die Boote hinzufügen
                        newRace.BoatsData = new List <BoatData>();
                        _ = dbEntries.TryGetValue(offer.Offer_ID, out var entries);

                        if (entries != null)
                        {
                            foreach (var entry in entries)
                            {
                                // das Label für das Boot (!) (z. B. "Renngemeinschaft ...") bestimmen

                                var titleShort = "?";
                                var titleLong  = "?";

                                var entryLabel = dbEntryLabels.Values.FirstOrDefault(el => el.EL_Entry_ID_FK == entry.Entry_ID);
                                if (entryLabel != null)
                                {
                                    dbLabels.TryGetValue(entryLabel.EL_Label_ID_FK, out var label);
                                    titleShort = label?.Label_Short;
                                    titleLong  = label?.Label_Long;
                                }

                                var newBoat = new BoatData()
                                {
                                    TitleShort = titleShort,
                                    TitleLong  = titleLong,
                                    BibNumber  = (byte)entry.Entry_Bib,
                                    Canceled   = (entry.Entry_CancelValue > 0)
                                };

                                newRace.BoatsData.Add(newBoat);

                                // Zum aktuellen Boot die Mannschaft hinzufügen
                                newBoat.Rowers = new List <RowerData>();
                                _ = dbCrews.TryGetValue(entry.Entry_ID, out var crew);

                                #region Sonderbehandlung der Crew für den Fall, dass es Ummeldungen gibt

                                // TODO: Es ist nicht ganz klar, woran man Ummeldungen erkennt, bzw. woran
                                //       man erkennt, welches das alte, und welches das neue Crewmitglied
                                //       ist. Auf jeden Falls stehen beiden in der DB drin.

                                if (crew != null)
                                {
                                    // Gruppieren nach dem Sitzplatz
                                    var crewByPos = crew.GroupBy(c => c.Crew_Pos).ToList();

                                    // Crew-Liste löschen und neu füllen
                                    crew = new List <Crew>();
                                    foreach (var item in crewByPos)
                                    {
                                        // die Ruderer für die aktuelle Sitzposition sortiert nach DB-ID                       // TODO: Ist DB-ID wirklich das richtige ???
                                        var rowersOnCurrentPos = item.Select(x => x).OrderBy(x => x.Crew_ID);
                                        crew.Add(rowersOnCurrentPos.Last());
                                    }
                                }

                                #endregion

                                if (crew != null)
                                {
                                    // Crew durchgehen und ins Boot platzieren
                                    foreach (var crewMember in crew)
                                    {
                                        dbAthlets.TryGetValue(crewMember.Crew_Athlete_ID_FK, out var athlet);
                                        dbClubs.TryGetValue((int)athlet.Athlet_Club_ID_FK, out var club);

                                        if ((athlet != null) && (club != null))
                                        {
                                            var newRower = new RowerData()
                                            {
                                                Id             = athlet.Athlet_ID,
                                                ClubTitleLong  = club.Club_Name,
                                                ClubTitleShort = club.Club_Abbr,
                                                LastName       = athlet.Athlet_LastName,
                                                FirstName      = athlet.Athlet_FirstName,
                                                DateOfBirth    = athlet.Athlet_DOB,
                                                Gender         = (athlet.Athlet_Gender == 'M') ? Gender.Male : Gender.Female
                                            };

                                            if (crewMember.Crew_IsCox)
                                            {
                                                // es handelt sich um den Steuermann
                                                newBoat.Cox = newRower;
                                            }
                                            else
                                            {
                                                // normaler Ruderer
                                                newBoat.Rowers.Add(newRower);
                                            }
                                        }
                                        else
                                        {
                                            // Fehler: Ruderer oder Verein nicht gefunden
                                            Tools.LogErrorNoMessageBox("Warnung: Ruderer oder kein Verein zu Crew nicht gefunden. Rennen ", offer.Offer_RaceNumber, offer.Offer_ShortLabel);
                                        }
                                    }
                                }
                                else
                                {
                                    // Fehler: keine Mannschaft für das Boot gefunden
                                    Tools.LogErrorNoMessageBox("Warnung: Mannschaft zu Rennen nicht gefunden. Rennen ", offer.Offer_RaceNumber, offer.Offer_ShortLabel);
                                }
                            }
                        }

                        // Boote sortieren nach Startnummer
                        newRace.BoatsData = newRace.BoatsData.OrderBy(b => b.BibNumber).ToList();
                    }
                }

                #endregion

                #region Ruderer anhand der ermittelten Rennen bestimmen

                var newRowers = new List <RowerData>();
                foreach (var raceData in dbData.RacesData)
                {
                    foreach (var boatData in raceData.BoatsData)
                    {
                        // Ruderer hinzufügen
                        foreach (var rowerData in boatData.Rowers)
                        {
                            if (!newRowers.Any(r => r.Id == rowerData.Id))
                            {
                                newRowers.Add(rowerData);
                            }
                        }

                        // Steuermann hinzufügen
                        if (boatData.Cox != null)
                        {
                            if (!newRowers.Any(r => r.Id == boatData.Cox.Id))
                            {
                                newRowers.Add(boatData.Cox);
                            }
                        }
                    }
                }

                dbData.RowersData = newRowers.OrderBy(r => r.LastName).ThenBy(r => r.FirstName).ToList();

                #endregion

                // Rennen sortieren nach Startzeit
                dbData.RacesData = dbData.RacesData.OrderBy(r => r.DateTime).ToList();
            }
        }