/// <summary> /// Obtiene la lista de las mejores escuelas con medallas /// </summary> /// <param name="tipoOlimpiada">El tipo de olimpiada</param> /// <param name="estado">El estado que queremos filtrar</param> /// <returns>La lista de instituciones</returns> public static List <KeyValuePair <Institucion, Medallero> > obtenerMejoresEscuelas(string estado, TipoOlimpiada tipoOlimpiada) { List <KeyValuePair <Institucion, Medallero> > escuelas = new List <KeyValuePair <Institucion, Medallero> >(); Acceso db = new Acceso(); StringBuilder query = new StringBuilder(); query.Append(" select * from Medallero where tipo = "); query.Append((int)Medallero.TipoMedallero.INSTITUCION); query.Append(" and clase = "); query.Append(Cadenas.comillas(tipoOlimpiada.ToString().ToLower())); if (estado == null) { query.Append(" and oro > 1 "); } else { query.Append(" and (oro + plata + bronce) > 1 "); } query.Append(" order by oro desc, plata desc, bronce desc "); db.EjecutarQuery(query.ToString()); DataTable table = db.getTable(); foreach (DataRow r in table.Rows) { Medallero m = new Medallero(); m.llenarDatos(r); Institucion i = Institucion.obtenerInstitucionConClave(int.Parse(m.clave)); i.consultarEstadosDeInstitucion(tipoOlimpiada); if (estado == null || i.estados.Contains(estado)) { escuelas.Add(new KeyValuePair <Institucion, Medallero>(i, m)); } } return(escuelas); }
/// <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(); }