/// <summary>
 /// Methode zum Anmelden eines weiteren Selektors.
 /// </summary>
 /// <param name="selector">Der Selektor.</param>
 public void AddSelector(ISchuelerKursSelector selector)
 {
     this.allSelectors.Add(selector);
 }
        /// <summary>
        /// Die eigentliche Lese-Methode.
        /// </summary>
        /// <param name="fileName">Der Dateiname.</param>
        /// <param name="kursSelector">Ein Selektor zur Prüfung, welche Schüler in welchen Kurs auch wirklich müssen.</param>
        public static void ReadUnterricht(string fileName, ISchuelerKursSelector kursSelector)
        {
            var excelApp = new Microsoft.Office.Interop.Excel.Application();
              var workbook = excelApp.Workbooks.Open(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
              var sheet = (from Excel.Worksheet sh in workbook.Worksheets where sh.Name.Equals("Tabelle1") select sh).FirstOrDefault();
              if (sheet == null)
              {
            throw new InvalidOperationException("kein Sheet mit dem Namen \"Tabelle1\" gefunden");
              }

              int lastRow = sheet.get_Range("A" + sheet.Rows.Count, "B" + sheet.Rows.Count).get_End(Excel.XlDirection.xlUp).Row;
              for (int zeile = 5; zeile <= lastRow; zeile++)
              {
            string lehrer = ReadValue(sheet, "E" + zeile);
            string fach = ReadValue(sheet, "F" + zeile);
            string klassenString = ReadValue(sheet, "G" + zeile);

            if (string.IsNullOrEmpty(lehrer))
            {
              log.Debug("Unterricht Ohne Lehrer wird ignoriert in Zeile " + zeile);
              continue;
            }
            if (string.IsNullOrEmpty(fach))
            {
              log.Debug("Unterricht Ohne Fach wird ignoriert in Zeile " + zeile);
              continue;
            }
            if ((new string[] { "SSl", "SNT", "SWi", "FPU", "FPA", "FPB", "TZ-Fö", "GK_BF", "M-Fö", "E-Fö", "Ph-Fö", "AWU", "Me", "SL", "SF" }).Contains(fach))
            {
              log.Debug("Ignoriere Förderunterricht, Ergänzungsunterricht, Seminarfach und diversen anderen Unfug - kein selbstständiger Unterricht");
              continue;
            }
            if (string.IsNullOrEmpty(klassenString))
            {
              log.Debug("Unterricht Ohne Klassen wird ignoriert in Zeile " + zeile);
              continue;
            }

            var dbFach = FindOrCreateFach(fach);
            if (string.IsNullOrEmpty(dbFach.Bezeichnung.Trim()))
            {
              log.Debug("Ignoriere Ignoriere Fach ohne Namen : Kürzel "+dbFach.Kuerzel);
              continue;
            }

            var dblehrer = FindLehrer(lehrer);
            if (dblehrer == null)
            {
              log.Error("Ignoriere Kurse des unbekannten Lehrers " + lehrer);
              continue;
            }

            var kurs = FindOrCreateKurs(dbFach.Bezeichnung.Trim() + " " + klassenString, dblehrer.Id, fach);

            var klassen = klassenString.Split(',');
            var klasseKursAdapter = new KlasseKursTableAdapter();
            foreach (var klasse in klassen)
            {
              var dbKlasse = FindOrCreateKlasse(klasse, true);
              if (klasseKursAdapter.ScalarQueryCountByKlasseAndKurs(dbKlasse.Id, kurs.Id) == 0)
              {
            klasseKursAdapter.Insert(dbKlasse.Id, kurs.Id);
              }

              AddSchuelerToKurs(kurs, dbKlasse, kursSelector);
            }
              }

              workbook.Close(false, fileName, Type.Missing);
              Marshal.ReleaseComObject(workbook);
              excelApp.Quit();
        }
        /// <summary>
        /// Trägt einen Schüler in einen Kurs in der Datenbank ein.
        /// </summary>
        /// <param name="kurs">Der Kurs.</param>
        /// <param name="dbKlasse">Die Klasse.</param>
        /// <param name="kursSelector">Ein Selektor zur Prüfung, welche Schüler in welchen Kurs auch wirklich müssen.</param>
        public static void AddSchuelerToKurs(diNoDataSet.KursRow kurs, diNoDataSet.KlasseRow dbKlasse, ISchuelerKursSelector kursSelector)
        {
            using (SchuelerTableAdapter sAdapter = new SchuelerTableAdapter())
              {
            sAdapter.ClearBeforeFill = true;
            var schuelerDerKlasse = sAdapter.GetDataByKlasse(dbKlasse.Id);
            if (schuelerDerKlasse.Count == 0)
            {

              if (dbKlasse.Bezeichnung.StartsWith("FB") && dbKlasse.Bezeichnung.EndsWith("F"))
              {
            // z.B. FB13T_F meint die FOSler der Mischklasse FB13T. Evtl. sind die als eigene Klasse F13T in der DB
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("FB", "F");
            modifizierteKlasse = modifizierteKlasse.Replace("_F", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasse(dbKlasse.Id);
            }
              }

              if (dbKlasse.Bezeichnung.StartsWith("FB") && dbKlasse.Bezeichnung.EndsWith("B"))
              {
            // z.B. FB13T_B meint die BOSler der Mischklasse FB13T. Evtl. sind die als eigene Klasse B13T in der DB
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("FB", "B");
            modifizierteKlasse = modifizierteKlasse.Replace("_B", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasse(dbKlasse.Id);
            }
              }

              if (dbKlasse.Bezeichnung.EndsWith("_W") && dbKlasse.Bezeichnung.Contains("SW"))
              {
            // z.B. B13SW_W meint die Wirtschaftler der Mischklasse B13SW. Evtl. sind die nur als Mischklasse in der DB
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("_W", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "W");
              if (schuelerDerKlasse.Count == 0)
              {
                schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "WVR");
              }
            }
              }

              if (dbKlasse.Bezeichnung.EndsWith("_S") && dbKlasse.Bezeichnung.Contains("SW"))
              {
            // z.B. B13SW_S meint die Wirtschaftler der Mischklasse B13SW. Evtl. sind die nur als Mischklasse in der DB
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("_S", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "S");
            }
              }

              if (dbKlasse.Bezeichnung.EndsWith("_T") && dbKlasse.Bezeichnung.Contains("TW"))
              {
            // Techniker aus der Mischklasse
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("_T", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "T");
            }
              }

              if (dbKlasse.Bezeichnung.EndsWith("_W") && dbKlasse.Bezeichnung.Contains("TW"))
              {
            // Wirtschaftler aus der Mischklasse
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("_W", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "W");
            }
              }

              if (dbKlasse.Bezeichnung.EndsWith("_T") && dbKlasse.Bezeichnung.Contains("ST"))
              {
            // Techniker aus der Mischklasse
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("_T", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "T");
            }
              }

              if (dbKlasse.Bezeichnung.EndsWith("_S") && dbKlasse.Bezeichnung.Contains("ST"))
              {
            // Soziale aus der Mischklasse
            string modifizierteKlasse = dbKlasse.Bezeichnung.Replace("_S", string.Empty);
            dbKlasse = FindOrCreateKlasse(modifizierteKlasse, false);
            if (dbKlasse != null)
            {
              schuelerDerKlasse = sAdapter.GetDataByKlasseAndZweig(dbKlasse.Id, "S");
            }
              }
            }

            if (schuelerDerKlasse.Count == 0)
            {
              //throw new InvalidOperationException("Klasse " + dbKlasse.Bezeichnung + " ist leer");
              log.Error("Klasse " + dbKlasse.Bezeichnung + " ist leer");
            }

            foreach (var schueler in schuelerDerKlasse)
            {
              AddSchuelerToKurs(kurs, kursSelector, schueler);
            }
              }
        }
 public static void AddSchuelerToKurs(diNoDataSet.KursRow kurs, ISchuelerKursSelector kursSelector, diNoDataSet.SchuelerRow schueler)
 {
     using (SchuelerKursTableAdapter skursAdapter = new SchuelerKursTableAdapter())
       {
     if (kursSelector.IsInKurs(schueler, kurs) && skursAdapter.GetCountBySchuelerAndKurs(schueler.Id, kurs.Id) == 0)
     {
       log.Warn("neuer Schüler im Kurs " + kurs.Bezeichnung);
       skursAdapter.Insert(schueler.Id, kurs.Id);
     }
       }
 }