Exemple #1
0
        public static Dictionary <string, DetalleLugar> obtenerLugaresConTimestamp(string clave, TipoOlimpiada tipo, int dia, int timestamp)
        {
            Dictionary <string, DetalleLugar> lugares = new Dictionary <string, DetalleLugar>();
            Acceso        db    = new Acceso();
            StringBuilder query = new StringBuilder();

            query.Append(" select * from detallelugar ");
            query.Append(" where clase = ");
            query.Append(Cadenas.comillas(tipo.ToString().ToLower()));
            query.Append(" and olimpiada = ");
            query.Append(Cadenas.comillas(clave));
            query.Append(" and dia = ");
            query.Append(dia);
            query.Append(" and timestamp = ");
            query.Append(timestamp);

            db.EjecutarQuery(query.ToString());
            DataTable table = db.getTable();

            for (int i = 0; i < table.Rows.Count; i++)
            {
                DetalleLugar dl = new DetalleLugar();
                dl.llenarDatos(table.Rows[i]);
                lugares.Add(dl.clave, dl);
            }

            return(lugares);
        }
Exemple #2
0
        public static void clean(string omi, TipoOlimpiada tipo, int dia)
        {
            StringBuilder query = new StringBuilder();
            Acceso        db    = new Acceso();

            query.Append(" select * from DetalleLugar where olimpiada = ");
            query.Append(Cadenas.comillas(omi));
            query.Append(" and clase = ");
            query.Append(Cadenas.comillas(tipo.ToString().ToLower()));
            query.Append(" and dia = ");
            query.Append(dia);
            query.Append(" order by clave, timestamp asc ");

            db.EjecutarQuery(query.ToString());

            DataTable table = db.getTable();

            bool         first    = false;
            DetalleLugar anterior = new DetalleLugar();
            DetalleLugar actual   = new DetalleLugar();

            foreach (DataRow r in table.Rows)
            {
                actual.lugar     = DataRowParser.ToInt(r["lugar"]);
                actual.timestamp = DataRowParser.ToInt(r["timestamp"]);
                actual.medalla   = DataRowParser.ToTipoMedalla(r["medalla"]);
                actual.clave     = DataRowParser.ToString(r["clave"]);

                if (actual.clave != anterior.clave)
                {
                    first = true;
                }
                else
                {
                    if (actual.medalla == anterior.medalla &&
                        actual.lugar == anterior.lugar)
                    {
                        if (!first)
                        {
                            borrar(omi, tipo.ToString().ToLower(), anterior.clave, anterior.timestamp, dia);
                        }
                        first = false;
                    }
                    else
                    {
                        first = true;
                    }
                }

                anterior.lugar     = actual.lugar;
                anterior.timestamp = actual.timestamp;
                anterior.medalla   = actual.medalla;
                anterior.clave     = actual.clave;
            }
        }
Exemple #3
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();
        }