/// <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(); } }