/// <summary> /// Regresa todos los problemas del tipo de olimpiada /// </summary> /// <param name="tipoOlimpiada">El tipo de olimpiada</param> /// <returns>El diccionario de problemas, la llave es la olimpiada</returns> public static Dictionary <string, List <Problema> > obtenerProblemas(TipoOlimpiada tipoOlimpiada) { Dictionary <string, List <Problema> > problemas = new Dictionary <string, List <Problema> >(); Acceso db = new Acceso(); StringBuilder query = new StringBuilder(); query.Append(" select * from problema where clase = "); query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower())); query.Append(" order by olimpiada, dia asc, numero asc "); db.EjecutarQuery(query.ToString()); DataTable table = db.getTable(); string ultimaOMI = null; List <Problema> lista = null; foreach (DataRow r in table.Rows) { Problema p = new Problema(); p.llenarDatos(r); if (ultimaOMI == null || ultimaOMI != p.olimpiada) { lista = new List <Problema>(); problemas.Add(p.olimpiada, lista); ultimaOMI = p.olimpiada; } lista.Add(p); } return(problemas); }
/// <summary> /// Obtiene el problema de la base de datos. /// De no existir, se regresa un objeto nuevo (sin actualizar la base) /// </summary> /// <param name="omi">La omi del problema</param> /// <param name="tipoOlimpiada">El tipo olimpiada del que se requieren los datos</param> /// <param name="dia">El día del problema</param> /// <param name="numero">El numero del problema</param> /// <returns>El objeto problema</returns> public static Problema obtenerProblema(string omi, TipoOlimpiada tipoOlimpiada, int dia, int numero) { Acceso db = new Acceso(); StringBuilder query = new StringBuilder(); query.Append(" select * from problema where olimpiada = "); query.Append(Cadenas.comillas(omi)); query.Append(" and clase = "); query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower())); query.Append(" and dia = "); query.Append(dia); query.Append(" and numero = "); query.Append(numero); if (db.EjecutarQuery(query.ToString()).error) { return(null); } DataTable table = db.getTable(); Problema p = new Problema(); if (table.Rows.Count == 0) { p.olimpiada = omi; p.tipoOlimpiada = tipoOlimpiada; p.dia = dia; p.numero = numero; } else { p.llenarDatos(table.Rows[0]); } return(p); }
/// <summary> /// Regresa una lista con tres elementos y el metadata de los dias de la omi /// </summary> /// <param name="omi">La omi de los problemas</param> /// <param name="tipoOlimpiada">El tipo olimpiada del que se requieren los datos</param> /// <returns>La lista de problemas</returns> public static List <Problema> obetnerMetaDatadeOMI(string omi, TipoOlimpiada tipoOlimpiada) { List <Problema> problemas = new List <Problema>(); Acceso db = new Acceso(); StringBuilder query = new StringBuilder(); query.Append(" select * from problema where olimpiada = "); query.Append(Cadenas.comillas(omi)); query.Append(" and clase = "); query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower())); query.Append(" and numero = 0 order by dia asc "); if (db.EjecutarQuery(query.ToString()).error) { return(null); } DataTable table = db.getTable(); foreach (DataRow r in table.Rows) { Problema p = new Problema(); p.llenarDatos(r); problemas.Add(p); } return(problemas); }
/// <summary> /// Calcula los campos que aparecen el el footer de la tabla de resultados /// Calcula media, mediana, perfectos, ceros de cada problema, día y general /// así como número de estados y número de competidores /// </summary> public void calcularNumeros() { Problema prob; estados = Resultados.obtenerEstadosParticipantes(numero, tipoOlimpiada); participantes = MiembroDelegacion.obtenerParticipantes(numero, tipoOlimpiada); int[] problemasDia = new int[3]; // Calculamos las estadisticas por dia y por competencia y las guardamos en la base for (int i = 1; i <= 2; i++) { problemasDia[i] = Problema.obtenerCantidadDeProblemas(numero, tipoOlimpiada, i); prob = Resultados.calcularNumeros(numero, tipoOlimpiada, dia: i, totalProblemas: problemasDia[i]); prob.guardar(guardarTodo: false); List <Problema> lista = Problema.obtenerProblemasDeOMI(numero, tipoOlimpiada, i); foreach (Problema p in lista) { if (p != null) { Problema pp = Resultados.calcularNumeros(numero, tipoOlimpiada, p.dia, p.numero); p.media = pp.media; p.mediana = pp.mediana; p.perfectos = pp.perfectos; p.ceros = pp.ceros; p.guardar(guardarTodo: false); } } } problemasDia1 = problemasDia[1]; problemasDia2 = problemasDia[2]; prob = Models.Resultados.calcularNumeros(numero, tipoOlimpiada, totalProblemas: problemasDia1 + problemasDia2); prob.guardar(guardarTodo: false); // Guardar en la base this.guardarDatos(); }
/// <summary> /// Guarda valores en la base de datos que estan directamente relacionados /// con los resultados y que no pueden escribirse a mano /// Calcula las banderas en el objeto olimpiada, el número de problemas por día, /// genera el metadata (vacio) de los problemas, asigna lugar a los competidores /// y calcula las medallas de todas las personas y escuelas /// </summary> private void precalcularValores() { // Calculamos si hay resultados para mostrar por problema y lo guardamos en la base problemasDia1 = Problema.obtenerCantidadDeProblemas(numero, tipoOlimpiada, 1); problemasDia2 = Problema.obtenerCantidadDeProblemas(numero, tipoOlimpiada, 2); mostrarResultadosPorDia = Resultados.mostrarResultadosPorDia(numero, tipoOlimpiada); if (mostrarResultadosPorDia) { mostrarResultadosPorProblema = Resultados.mostrarResultadosIndividuales(numero, tipoOlimpiada); } else { mostrarResultadosPorProblema = false; } // En caso de que solo haya un dia o solo hayamos metido un dia if (problemasDia2 == 0) { mostrarResultadosPorDia = false; } // Se guardan los bosquejos del metadata de la omi y los dias // Los cargamos de la base de datos en caso de ya existir. Problema p = Problema.obtenerProblema(this.numero, this.tipoOlimpiada, 0, 0); p.guardar(guardarTodo: false); p = Problema.obtenerProblema(this.numero, this.tipoOlimpiada, 1, 0); p.guardar(guardarTodo: false); p = Problema.obtenerProblema(this.numero, this.tipoOlimpiada, 2, 0); p.guardar(guardarTodo: false); // Calculamos el lugar de cada competidor y lo guardamos en la base List <Resultados> resultados = Resultados.cargarResultados(numero, tipoOlimpiada, cargarObjetos: false); int competidores = 0; int lugar = 0; float?puntosMaximos = resultados.Count > 0 ? resultados[0].total : 0; bool unkEnTabla = false; for (int i = 0; i < resultados.Count; i++) { resultados[i].lugar = 0; bool extranjero = false; if (resultados[i].clave.StartsWith(Resultados.CLAVE_DESCONOCIDA)) { unkEnTabla = true; } else { if (!(unkEnTabla && resultados[i].medalla == Resultados.TipoMedalla.NADA)) { // Si el competidor fue descalificado lo mandamos al fondo del lugar if (resultados[i].medalla == Resultados.TipoMedalla.DESCALIFICADO) { resultados[i].lugar = resultados.Count + 1; } else { // Si el competidor es extranjero, no se le considera Estado e = Estado.obtenerEstadoConClave(resultados[i].estado); extranjero = e.extranjero; if (extranjero || resultados[i].clave.EndsWith("I")) { if (lugar == 0) { resultados[i].lugar = 1; } else { resultados[i].lugar = lugar; } } else { competidores++; if (competidores == 1 || Math.Abs((decimal)(resultados[i - 1].total - resultados[i].total)) >= 1) { lugar = competidores; } resultados[i].lugar = lugar; } } } } resultados[i].guardarLugar(); // Se actualiza la tabla de detalles if (this.puntosDetallados && !extranjero) { DetallePuntos.actualizarUltimo(this.numero, this.tipoOlimpiada, 1, resultados[i].clave, resultados[i].dia1, resultados[i].totalDia1); if (problemasDia2 > 0) { DetallePuntos.actualizarUltimo(this.numero, this.tipoOlimpiada, 2, resultados[i].clave, resultados[i].dia2, resultados[i].totalDia2); DetalleLugar.actualizarUltimo(this.numero, this.tipoOlimpiada, 2, resultados[i].clave, resultados[i].lugar, resultados[i].medalla); } else { // Actualizar la tabla de DetalleLugar de dia 1 el día 2 requiere de muchos más cálculos que espero no sea necesario DetalleLugar.actualizarUltimo(this.numero, this.tipoOlimpiada, 1, resultados[i].clave, resultados[i].lugar, resultados[i].medalla); } } } // Si el primer lugar tiene menos de 100 puntos, entonces no tenemos los puntos mostrarResultadosTotales = puntosMaximos > PUNTOS_MINIMOS_CONOCIDOS; // Calculamos el medallero y lo guardamos en la base if (tipoOlimpiada != TipoOlimpiada.OMIPO && tipoOlimpiada != TipoOlimpiada.OMISO) { Medallero.calcularMedallas(tipoOlimpiada, numero, ordenarPorPuntos); } else { MiembroDelegacion.registrarGanadoresOMIPOS(numero, tipoOlimpiada); } // Guardamos los datos en la base guardarDatos(); }
private void llenarDatos(DataRow datos) { numero = DataRowParser.ToString(datos["numero"]); tipoOlimpiada = DataRowParser.ToTipoOlimpiada(datos["clase"]); ciudad = DataRowParser.ToString(datos["ciudad"]); pais = DataRowParser.ToString(datos["pais"]); año = DataRowParser.ToStrictFloat(datos["año"]); inicio = DataRowParser.ToDateTime(datos["inicio"]); fin = DataRowParser.ToDateTime(datos["fin"]); video = DataRowParser.ToString(datos["video"]); poster = DataRowParser.ToString(datos["poster"]); estados = DataRowParser.ToInt(datos["estados"]); participantes = DataRowParser.ToInt(datos["participantes"]); datosPublicos = DataRowParser.ToBool(datos["datospublicos"]); relacion = DataRowParser.ToString(datos["relacion"]); reporte = DataRowParser.ToString(datos["reporte"]); problemasDia1 = DataRowParser.ToInt(datos["problemasDia1"]); problemasDia2 = DataRowParser.ToInt(datos["problemasDia2"]); mostrarResultadosPorDia = DataRowParser.ToBool(datos["mostrarResultadosPorDia"]); mostrarResultadosPorProblema = DataRowParser.ToBool(datos["mostrarResultadosPorProblema"]); mostrarResultadosTotales = DataRowParser.ToBool(datos["mostrarResultadosTotales"]); puntosDesconocidos = DataRowParser.ToBool(datos["puntosDesconocidos"]); alsoOmips = DataRowParser.ToBool(datos["alsoOmips"]); alsoOmipsOnline = DataRowParser.ToBool(datos["alsoOmipsOnline"]); noMedallistasConocidos = DataRowParser.ToBool(datos["noMedallistasConocidos"]); puntosDetallados = DataRowParser.ToBool(datos["puntosDetallados"]); registroActivo = DataRowParser.ToBool(datos["registroActivo"]); diplomasOnline = DataRowParser.ToBool(datos["diplomasOnline"]); esOnline = DataRowParser.ToBool(datos["esOnline"]); registroSedes = DataRowParser.ToBool(datos["registroSedes"]); ordenarPorPuntos = DataRowParser.ToBool(datos["ordenarPorPuntos"]); claveEstado = DataRowParser.ToString(datos["estado"]); Estado estado = Estado.obtenerEstadoConClave(claveEstado); if (estado != null) { nombreEstado = estado.nombre; } claveEscuela = DataRowParser.ToInt(datos["escuela"]); Institucion institucion = Institucion.obtenerInstitucionConClave(claveEscuela); if (institucion != null) { nombreEscuela = institucion.nombreCorto; escuelaURL = institucion.nombreURL; nombreEscuelaCompleto = institucion.nombre; } if (inicio.Year > 1990) { if (inicio.Month == fin.Month) { friendlyDate = "Del " + inicio.Day + " al " + Fechas.friendlyString(fin); } else { friendlyDate = "Del " + Fechas.friendlyString(inicio) + " al " + Fechas.friendlyString(fin); } } if (Archivos.existeArchivo(Archivos.Folder.OLIMPIADAS, numero + ".png")) { logo = numero + ".png"; } else { logo = Archivos.OMI_LOGO; } if (numero != TEMP_CLAVE && (tipoOlimpiada == TipoOlimpiada.OMIP || tipoOlimpiada == TipoOlimpiada.OMIS || tipoOlimpiada == TipoOlimpiada.OMIPO || tipoOlimpiada == TipoOlimpiada.OMISO)) { omisActualNumber = (Int32.Parse(numero) - OMIS_SIN_OMIPS).ToString(); } datosGenerales = Problema.obtenerProblema(numero, tipoOlimpiada, 0, 0); }