示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }
示例#4
0
        /// <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();
        }
示例#5
0
        /// <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();
        }
示例#6
0
        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);
        }